2.4. Instrukcja porównania i instrukcje skoku
< zęsto jest konieczne, aby — w zależności od wartości w rejestrze/ zmiennej — wykonać odpowiedni fragment kodu. W tej części poznasz instrukcje, które pozwolą Ci to wykonać.
Posłużymy się następującym przykładem:
cali SayHello irwoke ExitProcess, NULL SayHello proc
invoke MessageBox, NULL, addr MsgText, addr MsgCaption, MB_0K Ret
SayHello EndP end start
.386 | |
.model fiat, stdcall | |
option casemap: nonę | |
include |
Windows.inc |
Include |
kernel32.inc |
Include |
user32.inc |
Includelib |
user32.1ib |
Includelib |
kernel32.1ib |
.data | |
MsgCaption |
db "Inforr |
MsgBoxText |
db "EAX >= |
.data? .codę start: mov eax, |
10 |
mov ecx, |
9 |
cmp eax, |
ecx |
Jak widać, początek procedury to jej nazwa, po niej zaś jest umieszczom słowo proc. Dalej znajduje się kod procedury i instrukcja RET wracająci do miejsca, z którego procedura została wywołana. Na końcu ponownie pojawia się nazwa procedury i słowo EndP, które kończy deklarację.
Możemy również tworzyć funkcje, którym przekazuje się jakieś argumenty służące do operowania na nich. Argumenty wypisujemy pc słowie proc, podając najpierw nazwę argumentu i jego typ po dwukrop ku. Jeżeli mamy więcej argumentów, rozdzielamy je przecinkiem.
Poniżej zamieszczam przykład funkcji, która jako argument przyjmuje adres tekstu do wyświetlenia:
.386
.model fiat, stdcall option casemap: nonę
i nclude i nclude include
Windows.inc
kernel32.inc
user32.inc
db "Informacja", 0 db "Witaj!11, 0 db "Witaj 2!", 0
includelib user32.1ib includelib kernel32.1ib
.data
MsgCaption
MsgTextl
MsgText2
.data?
.codę
start:
push offset MsgTextl / adres tekstu odkładamy na stos
cal 1 SayHel 1 o .- wywołujemy funkcję SayHello
push offset MsgText2 ; adres tekstu odkładamy na stos
cali SayHello ; ponownie wywołujemy funkcję SayHello z innym argumentem
invoke ExitProcess, NULL
SayHello proc szText: DWORD
invoke MessageBox, NULL, szText, addr MsgCaption, MB_0K Ret
SayHello EndP end start
jge _ge
invoke ExitProcess, NULL _ge:
invoke MessageBox, NULL, addr MsgBoxText, addr MsgCaption, MB_0K invoke ExitProcess, NULL end start
W powyższym przykładzie najpierw kopiujemy wartość 10 do rejestru EAX, po czym kopiujemy wartość 9 do rejestru ECX. Dalej pojawiają się dwie nowe instrukcje: CMP oraz JGE.
Instrukcja CMP porównuje dwie wartości, odejmując drugą wartość od pierwszej, i ustawia odpowiednie flagi w rejestrze znaczników.
N.itomiast instrukcja JGE jest skrótem angielskiego wyrażenia jurny if tfreater or equal, oznaczającego: „Skocz, jeżeli większe lub równe", /.a tern jeżeli pierwszy operand jest większy od drugiego lub jest jemu równy, nastąpi skok do etykiety _ge. Jeżeli pierwszy operand jest mniejszy od drugiego, to skok jest pomijany i wykonywane są kolejne linie kodu.