Программирование на Ассемблере


         

Монотонное изменение индекса


Индекс изменяется монотонно, если он увеличивается или уменьшается с постоянным шагом.

Для адресации элементов массива используются способы адресации [см. 3.4.3]:

<Имя массива + смещение> - для адресации заданного элемента массива - относительная адресация. Смещение - константное выражение;

[Регистр] - регистр содержит адрес текущего элемента массива - базисная адресация. Пусть индекс массива изменяется в пределах [p:q]. В этом случае адрес i-ого элемента массива равен адресу начала массива + (i-p)* l, где l - размер одного элемента массива. Заметим, что формула упрощается при p равном нулю. В дальнейшем будем предполагать, что минимальное значение индекса всегда равно 0.

[Регистр + смещение] (базисная адресация)- Смещение - константное выражение - используется, если в программе одновременно используются i-ый и i+...-ый элемент массива;

[Имя массива + регистр * масштаб] (индексная адресация)- регистр задает значение индекса в массиве - используется при работе с массивами, размер элементов которых равен масштабному множителю. 

Пример 1. Составить программу для вычисления

.

Вариант 1. Использование базисной адресации

For (s=i=0; i<n; i++) s+=x[i];

;For (s=i=0; i<n; i++)

sub       eax, eax;          s

mov     ecx, [n];          i

mov     ebx, offset x

; s+=x[i];

fori:

add      eax, [ebx]

; i++

add      ebx, 4

; i<n

loop     fori      

mov     [s], eax

Вариант 2. Индексная адресация

;For (s=i=0; i<n; i++)

sub       eax, eax, s=0

sub       ebx, ebx;          i=0

mov     ecx, [n]

for1:

add      eax, [x+ebx*4]

inc       ebx

loop     for1     

mov     [s], eax

Вариант 3. Так как суммирование можно выполнять, начиная с последнего элемента, регистр ecx можно использовать в качестве индексного регистра

sub       eax, eax

mov     ecx, [n]

for1:

add      eax, [x+ ecx*4-4]

loop     for1

mov     [s], eax

Сравнение программ показывает, что 3 вариант наиболее выгодный с точки зрения числа команд.



Содержание  Назад  Вперед