Asembler x86/Instrukcje/Skokowe
Asembler X86 Instrukcje | ||||
call
edytujdziałanie: wykonuje wywołanie procedury (funkcji). Polecenie to powoduje umieszczenie na stosie adresu następnego rozkazu (tego, który następuje zaraz po tej instrukcji) i przekazuje sterowanie programem do określonego przez operand miejsca. Jeśli dana procedura nie występuje w tym samym segmencie, co jej wywołanie to na stosie umieszczony jest segment i adres rozkazu po call. W przeciwnym wypadku umieszczony jest sam adres. Nazywane jest to kolejno wywołanie odległe i bliskie. System operacyjny Windows i Linux pracują w płaskim modelu pamięci zatem, tam domyślnie funkcjonuje typ bliskiego wywołania procedur.
A: etykieta lub adres procedury zawarty w rejestrze lub komórce pamięci
przykład: call moja_procedura
jmp
edytujdziałanie: polecenie wykonuje bezwarunkowy skok do etykiety. Etykieta może być typu short (-128 lub 127 bajtów od aktualnego położenia), near (aktualny segment) lub far (inny segment). Instrukcja ta przyjmuje tylko jeden operand.
A: etykieta do której ma być wykonany skok.
przykład: jmp etykieta
Warunek
edytujdziałanie: to polecenie wykonuje skok warunkowy. Następuje skok do etykiety tylko wtedy jeśli dany warunek jest spełniony. Poniżej znajduje się pełna lista mnemoników wraz z krótkim opisem warunku.
przykład: jWarunek moja_etykieta
Polecenia skoku dla ogólnych operacji porównania
Mnemonik | Opis warunku | Znacznik lub rejestr |
---|---|---|
JZ JE |
skok, jeśli zero skok, jeśli równe |
ZF=1 |
JNZ JNE |
skok, jeśli nie zero skok, jeśli nie równe |
ZF=0 |
JA JNBE |
skok, jeśli większe (bez znaku) skok, jeśli nie mniejsze lub równe (bez znaku) |
CF=0 i ZF=0 |
JNA JBE |
skok, jeśli nie większe (bez znaku) skok, jeśli mniejsze lub równe (bez znaku) |
CF=1 lub ZF=1 |
JB JNAE |
skok, jeśli mniejsze (bez znaku) skok, jeśli nie większe lub równe (bez znaku) |
CF=1 |
JNB JAE |
skok, jeśli nie mniejsze (bez znaku) skok, jeśli większe lub równe (bez znaku) |
CF=0 |
JG JNLE |
skok, jeśli większe (ze znakiem) skok, jeśli nie mniejsze lub równe (ze znakiem) |
ZF=0 i SF=OF |
JNG JLE |
skok, jeśli nie większe (ze znakiem)
skok, jeśli mniejsze lub równe (ze znakiem) |
ZF=1 lub SF<>OF |
JL JNGE |
skok, jeśli mniejsze (ze znakiem) skok, jeśli nie większe lub równe (ze znakiem) |
SF<>OF |
JNL JGE |
skok, jeśli nie mniejsze (ze znakiem) skok, jeśli większe lub równe (ze znakiem) |
SF=OF |
JCXZ | skok, jeśli rejestr CX=0 | CX=0 |
JECXZ | skok, jeśli rejestr ECX=0 | ECX=0 |
JP
JPE |
skok, jeśli parzystość | PF=1 |
JNP
JPO |
skok, jeśli nieparzystość | PF=0 |
JO | skok, jeśli przepełnienie | OF=1 |
JNO | skok, jeśli nie ma przepełnienia | OF=0 |
JS | skok, jeśli znak (ujemny) | SF=1 |
JNS | skok, jeśli nie ma znaku (dodatni) | SF=0 |
ret, retn, retf
edytujdziałanie: instrukcja ta wykonuje powrót z procedury. Polega to na zdjęciu ze stosu adresu powrotu umieszczonego przez polecenie call. RETN służy do tzw. bliskiego powrotu (zdejmuje jedynie wartość rejestru IP) zaś RETF do odległego powrotu (najpierw zdejmowana jest wartość rejestru IP, potem CS). Rozkaz RET może być typu zarówno bliskiego jak i odległego w zależności od tego jak została zdefiniowana procedura z której się powraca. Wszystkie trzy rozkazy opcjonalnie przyjmują jeden 8-bitowy operand, który nakazuje procesorowi dodanie odpowiedniej ilości bajtów do rejestru SP przy przywróceniu adresu powrotnego.
A: 8-bitowy operand bezpośredni (liczba)
przykład: ret 4