IF, WHILE, FOR
W językach wysokiego poziomu często używamy różnych struktur programowych. W assemblerze nie ma niestety instrukcji IF, gotowych do wykorzystania pętli z warunkami czy instrukcji iteracyjnej. Wszystko musimy sobie stworzyć sami.
Zacznijmy od instrukcji warunkowej. W Pascalu wygląda ona tak:

if warunek then instrukcja1 else instrukcja2;


W assemblerze zajmie to trochę więcej, niż jedną linijkę. Musimy najpierw wykonać instrukcję porównania a potem - w zależności od wyniku - wykonać (lub nie) skok. Instrukcją porownania jest cmp . Natomiast instrukcji skoków warunkowych jest mnóstwo. Oto kilka z nich:
jz - skok, jeżeli równe (zero)
jl - skok, jeżeli mniejsze
jg - skok, jeżeli większe
Jeżeli chcemy sprawdzić, czy zawartość rejestru EAX jest większa od 666, musimy stworzyć nastepujący kod:

cmp eax,666
jg wieksze
...
jmp po_zabawie
wieksze:
...
po_zabawie:


prawda, że proste i logiczne? :-)
Jak stworzyć pętlę z warunkiem na początku lub końcu? Umieścić na początku pętli etykietę, a na końcu skok do tej etykiety. Gdzieś w środku sprawdzić warunek i jeżeli jest prawdziwy - skoczyć za koniec pętli. Trywialne :-)
Zostaje instrukcja iteracyjna. Jak wykonać coś dokładnie n razy? Assembler oferuje nam instrukcję loop która zmniejsza o jeden zawartość rejestru CX i jeżeli po tym zmniejszeniu nie jest on równy zero - skacze do pewnej etykiety. Nasza pętla będzie więc wyglądała tak:

mov cx,LiczbaPowtorzen
tutaj:
...
loop tutaj


Jednak na procesorach Pentium używanie instrukcji loop jest niewskazane. Ciąg instrukcji:

dec cx
jnz etykieta


wykona się szybciej od loop etykieta . Oczywiście "jeżeli nie zero" :-)


Autorem tekstu jest: Jacek Popławski
Materiał dodany przez użytkownika: alphan