Pętle w asemblerze

Manna5

Bardzo często potrzebujemy wykonać jakieś instrukcje w asemblerze określoną liczbę razy. Najprostszym sposobem jest zliczanie powtórzeń w jakimś rejestrze (najlepiej uzyć CX lub CL, gdyż z założenia jest to rejestr licznika). Przykład:

XOR CL, CL
Powtorz:
  ; ...
  INC CL
  CMP CL, 10
  JB Powtorz

Powyższa pętla wykona się 10 razy. Najpierw zerujemy CL sztuczką z XOR, potem za każdym razem inkrementujemy i porównujemy. Jeśli wciąż mniejsze, to skaczemy na początek pętli. Okazuje się jednak, że dużo bardziej opłaca się liczyć w dół. Dlaczego? Otóż po dekrementacji możemy sprawdzić czy zeszliśmy do zera bez instrukcji porównania, więc program jest mniejszy:

MOV CL, 10
Powtorz:
  ; ...
  DEC CL
  JNZ Powtorz

Dzieje się tak gdyż instrukcja DEC ustawia flagę zera gdy zero zostanie osiągnięte. Jeszcze wygodniejsza jest jednak instrukcja LOOP, która automatycznie dekrementuje CX (niestety wymusza użycie CX, nie da się zastosować 8-bitowego CL bądź CH) sprawdza czy jest zerem i ewentualnie skacze. Wygląda to następująco:

MOV CX, 10
Powtorz:
  ; ...
  LOOP Powtorz

Co ze znanymi z C operacjami break i continue? Wykonamy je tym sposobem poprzez skok do odpowiedniej etykiety:

MOV CX, 10
Powtorz:
  ; ...
Continue:
  LOOP Powtorz
Break:

I to na razie tyle na temat pętli w asemblerze.

0 komentarzy