Przejdź do zawartości

Asembler x86/Instrukcje/Skokowe

Z Wikibooks, biblioteki wolnych podręczników.

Asembler X86 Instrukcje

transferowe
arytmetyczne
logiczne
różne
skokowe

call

[edytuj]

dział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

[edytuj]

dział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

[edytuj]

dział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
JC

skok, jeśli mniejsze (bez znaku)

skok, jeśli nie większe lub równe (bez znaku)
skok, jeśli jest przeniesienie

CF=1
JNB

JAE
JNC

skok, jeśli nie mniejsze (bez znaku)

skok, jeśli większe lub równe (bez znaku)
skok, jeśli nie ma przeniesienia

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

[edytuj]

dział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