EAX(32 bity) | ||||
31 Starsze bity |
15 |
7 0 Młodsze bity | ||
ECX (32 bity) | ||||
31 9 Starsze bity Carry Flag (znacznik przeniesienia) |
15 |
7 0 Młodsze bity |
Rysunek 2.8. Rysunek prezentują, jak przesuwają się bity dla instrukcji SHLD
EAX (32 bity) 31 15 7 0 Starsze bity Młodsze bity | |
ECX(32 bity) | |
3^ ^5 ^ 0 Carry Flag Starsze bity Młodsze bity , . . . . , ' (znacznik przeniesienia) |
Rysunek 2.9. Rysunek prezentujący, jak przesuwają się bity dla instrukcji SHRD
Procedury to wydzielone części programu, które mogą być wielokrotnie wywoływane, bez potrzeby kopiowania tego samego kodu w różne miejsca. Tworzenie takich procedur (nazywanych też podprogramami) jest możliwe przy użyciu instrukcji związanych z procedurami.
CALL (wywołanie funkcji/podprogramu)
Składnia: CALL nazwa_funkcji
Służy do wywołania jakiejś funkcji. Poniżej przedstawiam przykład użycia tej instrukcji:
pmh 0
cali Ex1tProcess
A zatem, jak widać, odkładamy na stos wartość zero i wywołujemy funkcję, która zakończy program. Przed instrukcją CALL odkładamy na stos argumenty funkcji za pomocą znanej już nam instrukcji PUSH. Pamiętajmy, żeby odkładać argumenty w odpowiedniej kolejności, więc jeśli funkcja przedstawia się tak: JakasFunkcja(argumentl, argumentż, nryument3), to jej wywołanie będzie następujące (zaczynamy od końcowego argumentu):
push argument3 push argument2 push argumentl cali JakasFunkcja
RET (powrót)
Składnia: RET
Wychodzi z danej funkcji/procedury i wraca do miejsca jej wywołania, będziemy używać tej instrukcji na końcu procedur.
Procedury tworzymy za pomocą dyrektyw PROC i ENDP. Przykładowy program z procedurą wygląda następująco:
.386 .model fiat, stdcall option casemap: nonę | |
Include Include Include |
Windows.inc kernel32.inc user32.inc |
Includelib Includelib |
user32.1ib kernel32.1ib |
.data MsgCaption MsgText |
db "Informacja", 0 db "Witaj!", 0 |
.data? | |
.codę start: |