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

       

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


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

Для адресации элементов массива используются способы адресации [см. 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 вариант наиболее выгодный с точки зрения числа команд.


¦ЁшьхЁ 2.
TюёЄртшЄ№ яЁюуЁрььє фы  тvўшёыхэш  ёєьь:
y0 = x0 + xn-1;
y1 = x1 + xn-2;
...
yn/2 = xn/2 + xn/2+1;
for (i=0, j=n-1; i<n/2; i++, j--){
аа y[i] = x[i] + x[j];
}
movаааа ecx, [n]
movаааа edx, ecx
shrаааааа ecx, 1
jecxzааа m1
movаааа eax, 0
for1:
movаааа ebx, [x+eax*4]; x[i]
addааааа ebx, [x+ecx*4-4]
movаааа [y+eax*4], ebx
incаааааа eax
decаааааа edx
loopаааа for1
m1:
а ¦ЁшьхЁ 3. TюёЄртшЄ№ яЁюуЁрььє фы  эрїюцфхэш  ьръёшьры№эюую ўшёыр ш хую эюьхЁр т ьрёёштх ўшёхы фышэющ 32 сшЄр.
For (max = x[nom = 0], i=1; i<n; i++ )
аа if (x[i] >max){
ааааа max = x[i]; nom = i;
аа }
movаааа eax, 0; nom
movаааа ebx, [x]; max
movаааа ecx, [n]
decаааааа ecx
jecxzааа m1
movаааа edx, 1; i
for3:
movаааа esi, [x+edx*4]
cmpаааа esi, ebx
jleааааааа short next
movаааа ebx, esi
movаааа eax, edx
next:
incаааааа edx
loopаааа for3
movаааа [max], ebx
movаааа [nom], eax
-ы  Єюую ўЄюсv ЁхушёЄЁ ECX шёяюы№чютрЄ№ фы  рфЁхёрЎшш фрээvї шчьхэшь яЁюуЁрььє Єръшь юсЁрчюь, ўЄюсv яюшёъ эрўшэрыё  ё яюёыхфэхую ўшёыр
for (i=n-2, max = x[nom = n-1]; i>=0; i-- ){
аа if (x[i]>max) {max= x[i]; nom = i;}
}
movаааа ecx, [n]
decаааааа ecx
jecxzааа m1
movаааа eax, ecx
movаааа ebx, [x+ecx*4]
for4:
movаааа esi, [x+ecx * 4 - 4]
cmpаааа esi, ebx
jleааааааа short next1
movаааа eax, ecx
movаааа ebx, esi
loopаааа for4
movаааа [max], ebx
movаааа [nom], eax
¦рёёьюЄЁшь яЁшьхЁ ЁрсюЄv ёю ёЄЁюърьш.
¦ЁшьхЁ 5. TюёЄртшЄ№ яЁюуЁрььє фы  юс·хфшэхэш  фтєї ёЄЁюъ ё эєыхтvь чртхЁ°шЄхыхь т юфэє ёЄЁюъє.
For (i=0; str1[i]; i++) str3[i] = str1[i];
for (j=0; str3[i+j=str2[j]; j++);
; For (i=0; str1[i]; i++) str3[i] = str1[i];
movаааа eax, 0; i=0
for6:
movаааа bl, [str1+eax]
testаааааа bl, bl
jeаааааааа next5
movаааа [str3+eax], bl
incаааааа eax
jmpааааа for6
next5:
movаааа ecx, 0
for7:
movаааа bl, [str2+ecx]
movаааа [str3+ecx+eax], bl
testаааааа bl, bl
jeаааааааа short mmm
incаааааа ecx
jmp for7
mmm:

Содержание раздела