Page 43 - 4989
P. 43
LEA ESI, array
або командою MOV з використанням оператора offset:
MOV ESI, offset array
Тоді звертання до елементів буде виглядати як [ESI].
Також можна утворювати адресу як суму двох регістрів,
наприклад:
LEA EBX, array
MOV word ptr [EBX + ESI*2], 0
Тут число 0 заноситься в елемент масиву двобайтових
елементів array з номером ESI. Оскільки розрядність константи 0
не задана, слід явно вказати розрядність комірки пам’яті за
допомогою модифікатора word ptr.
Приклад. Знайти суму елементів масиву Х цілих чисел
розрядністю 4 байти довжиною 100 елементів.
MOV EAX, 0
MOV ESI, 0
M1:
ADD EAX, X[ESI*4]
INC ESI
CMP ESI, 100
JNE M1
Тут номер поточного елемента зберігається в регістрі ESI та
збільшується на 1 при кожному проходженні циклу.
Можна було застосувати тут і непряму адресацію без
зміщення:
MOV EAX, 0
MOV ECX, 100
LEA ESI, X
M1:
ADD EAX, [ESI]
ADD ESI, 4
DEC ECX
JNZ M1
Тут масштабуючий множник не використовується, натомість
ESI кожен раз збільшується на розрядність одного елемента.
43