Page 42 - 4989
P. 42
DEC ЕCX
JNZ <мітка>
Тобто попередній приклад можна було б переписати так:
MOV ECX, 10
M1:
ADD EAX, EBX
LOOP M1
4.3.4 Використання непрямої адресації
Непряма адресація передбачає, що адреса комірки пам’яті не
вказується в команді безпосередньо (в т.ч. як ім’я деякої змінної),
а утворюється із вмісту одного або кількох регістрів та заданого в
команді зміщення (необов’язкового). Найчастіше такий спосіб
адресації використовується для обробки масивів та структур
даних.
Для масиву адреса деякого елемента в пам’яті отримується як
сума початкової адреси масиву та кількості комірок пам’яті,
зайнятих попередніми елементами. Наприклад, для деякого
масиву Х цілих чисел розрядністю 4 байти адреса 3-го елемента
масиву Х[3] дорівнює:
offset(X) + 3*4
де offset(X) – початкова адреса масиву, 3 – номер елемента, 4
– розрядність елементів.
Якщо необхідно перебрати всі елементи масиву, доцільно
номер поточного елемента зберігати в деякому регістрі і
виконувати звертання до елементів з використанням непрямої
адресації. При цьому одним із елементів (зміщенням) може бути
початкова адреса масиву, наприклад array[ESI], або
[ESI + offset array] .
Для врахування розрядності елементів можна застосовувати
масштабуючий множник, що дорівнює цій розрядності,
наприклад array[ESI *2] для елементів типу short int (розрядністю
2 байти).
Можна також зберігати в регістрі не індекс, а повну адресу
елемента – для цього слід перед початком обробки занести в
регістр не нуль, а початкову адресу масиву. Завантаження адреси
виконується командою LEA:
42