asembler6

asembler6



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.


Wyszukiwarka

Podobne podstrony:
Finanse p stwa Wypych8 059 Wybrane instrumenty zarządzania finansami w przedsiębiorstwie i wewnętrz
47634 Obraz37 (3) zjawiska palenia się. Ponieważ tlen znajduje się w powietrzu, przeto dopływ powiet
Strona
do dostępu do plików. Dzięki wykorzystaniu modelu klient-serwer nie jest konieczne, aby każdy użytko
•    wg współczesnej semiotyki wykładania zawsze jest konieczna, aby można
AVT2864 analogowo cyfrowy analizator widma audio 3 Projekty AVT ■ dużą szybkość odświeżania wyświe
238 Ilona Bujnowicz-Szewczyk Jeżeli stwierdzimy, iż nie jest konieczne, aby przy zastosowaniu SWOT g

więcej podobnych podstron