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

       

Немонотонное изменение параметра цикла


Пусть индекс изменяется по произвольному закону. В этом случае сначала вычисляется значение индекса, а затем выполняются действия для элемента.

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

nom=-1;

i=0; j=n-1;

while (i<=j){

   k=(i+i)/2;

   if (x[k]==r){

      nom = k;

   break;

 }

 if (x[k]<r)i=k+1; else j=k-1;

}

;nom=-1;



mov     eax, -1

;i=0; j=n-1;

mov     ebx, 0

mov     ecx, [n]

dec       ecx

;while (i<=j){

cmp     ebx, ecx

jg         short m1

;   k=(i+i)/2;

mm9:

mov     edx, ebx

add      edx, ecx

shr       edx, 1

;   if (x[k]==r){

mov     esi, [x+edx*4]

cmp     esi, [r]

jne       mm6

;nom = k;

mov     [nom], edx

;break;

jmp      short mm7

;}

 ;if (x[k]<r)i=k+1; else j=k-1;

mm6:

cmp     esi, [r]

jge       short mm8

mov     ebx, edx

inc       ebx

jmp short mm9

mm8:

mov     ecx, edx

dec       ecx

jmp short mm9

;}

Пример 2. В заданной строке символов переставить символы в порядке, заданном числовым массивом

for (i=0; str1[i]; i++){

   ch = str1[i];

   n = nom[i];

   str2[n] = ch;

}

str2[i] = 0;

str1      db        ‘abcdef’, 0

nom     dd        5, 1, 0, 2, 4, 3

str2      db        (nom - str1) dup (?)

...

;for (i=0; str1[i]; i++){

mov     eax, 0

;ch = str1[i];

m2:

mov     bl, [str1+eax]

test       bl, bl

je         short m1

;n = nom[i];

mov     ecx, [nom+eax]

;n = nom[i];

mov     [str2+ecx], bl

inc       eax

jmp      m2

m1:



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