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
   37   38   39   40   41   42   43   44   45   46   47