Ïðîãðàììèðîâàíèå íà Àññåìáëåðå


         

6.2.2 Êîìàíäû óñëîâíîãî ïåðåõîäà - ÷àñòü 2


Mov     eax, [X]

Cmp    eax, [Y]

Jae       mx

My:

Mov     eax, [Y]

Mov     [Z], eax

Mov     eax, [Y+4]

Mov     [Z+4], eax

Jmp     short m1

Mx:

Mov     eax, [X]

Mov     [X], eax

Mov     eax, [X+4]

Mov     [X+4], eax

M1:

Ïðèìåð 3.

Ñêîïèðîâàòü äàííûå èç îäíîé îáëàñòè ïàìÿòè â äðóãóþ, åñëè çàäàíû àäðåñà îáåèõ îáëàñòåé è ðàçìåð

Addr1  dd        …

Addr2  dd        …

Len      dd        …

Ñïîñîá 1

Mov     eax, [addr1]

Mov     edx, eax

Add      edx, [len]

Mov     ebx, [addr2]

For1:

Mov     cl, [eax]

Mov     [ebx], cl

Inc       eax

Inc       ebx

Cmp    eax, edx

Jle        for1

Îøèáêà!:  êîìàíäó Jle íåîáõîäèìî çàìåíèòü êîìàíäîé äëÿ ñðàâíåíèÿ ÷èñåë áåç çíàêà! (Jbe).

Íåäîñòàòîê ðåøåíèÿ! Íå ó÷òåíî âîçìîæíîå ïåðåêðûòèå îáëàñòåé!

Ñïîñîá 2

Ab = addr1; h = 1; Be = addr2;

If (addr2 != addr1){

   If (addr2 > addr1 && addr2 < addr1+len){

     Ab +=  len – 1; Bb +=len – 1;

     H=-1;

 }

  for (i=0; i<len; i++){

   *Bb = *Ab

   bb+=h;

   aa+=h;

  }

;Ab = addr1; h = 1; Be = addr2;

mov     eax, [addr1]

mov     ebx, [addr2]

mov     edx, 1

;If (addr2 != addr1){

cmp     eax, ebx

je         short break

;    If (addr2 > addr1 && addr2 < addr1+len){

cmp     eax, ebx

jbe       m1

mov     ecx, eax

add      ecx, [len]

cmp     ebx, ecx

jae       m1

;Ab +=  len – 1; Bb += len – 1;      H=-1;

mov     eax, ecx

dec       eax

add      ebx, [len]

dec       ebx

mov     edx, -1

 ;}

  ;for (i=0; i<len; i++){ *Bb = *Ab;    bb+=h;    aa+=h;

mov     esi, [len]

for2:

mov     cl, [eax]

mov     [ebx], cl

add      eax, edx

add      ebx, edx

sub       esi, 1

jnz        for2

   

 




Ñîäåðæàíèå  Íàçàä  Âïåðåä