Asembler x86/Instrukcje/Arytmetyczne

Z Wikibooks, biblioteki wolnych podręczników.

Asembler X86 Instrukcje

transferowe
arytmetyczne
logiczne
różne
skokowe

adc[edytuj]

działanie: sumuje A, B oraz flag CF; wynik przechowuje w A.
A: rejestr lub adres pamięci.
B: konkretna wartość, rejestr lub adres pamięci (ale tylko jeśli A również nie jest adresem pamięci).
modyfikowane flagi: OF, CF, SF, ZF, AF i PF.

przykład:

 adc eax, DB45h


add[edytuj]

działanie: sumuje A i B; wynik przechowuje w A.
A: rejestr lub adres pamięci.
B: konkretna wartość, rejestr lub adres pamięci (ale tylko jeśli A również nie jest adresem pamięci).
modyfikowane flagi: OF, CF, SF, ZF, AF i PF.

przykład:

add eax, 09h


cmp[edytuj]

działanie: porównuje A i B ustawiając odpowiednio flagi; działanie instrukcji jest identyczne jak sub A B z tą różnicą, że wynik nie jest nigdzie zapamiętywany, a mimo to ustawiane są flagi.
A: rejestr lub adres pamięci.
B: konkretna wartość, rejestr lub adres pamięci (ale tylko jeśli A również nie jest adresem pamięci).
modyfikowane flagi: OF, CF, SF, ZF, AF i PF.

przykład:

 cmp eax, 09h


dec[edytuj]

działanie: zmniejsza A o 1.
A: rejestr lub adres pamięci.
modyfikowane flagi: OF, SF, ZF, AF i PF.

przykład:

 dec eax


div[edytuj]

rozmiar A rejestry wynik reszta
byte AX AL AH
word DX:AX AX DX
double word EDX:EAX EAX EDX

działanie: dzieli odpowiedni rejestr przez A i przechowuje wynik w tym rejestrze (patrz niżej). Zarówno rejestr jak i A są traktowane jako liczby bez znaku. Dla liczb ze znakiem skorzystaj z idiv.
A: rejestr lub adres pamięci.
modyfikowane flagi: OF, CF, SF, ZF, AF i PF.
modyfikowane rejestry: zależnie od rozmiaru A

przykład:

 div ebx


idiv[edytuj]

rozmiar A rejestry wynik reszta
byte AX AL AH
word DX:AX AX DX
double word EDX:EAX EAX EDX

działanie: dzieli odpowiedni rejestr przez A i przechowuje wynik w tym rejestrze (patrz niżej). Zarówno rejestr jak i A są traktowane jako liczby ze znakiem. Dla liczb bez znaku skorzystaj z div.
A: rejestr lub adres pamięci.
modyfikowane flagi: OF, CF, SF, ZF, AF i PF.
modyfikowane rejestry: zależnie od rozmiaru A

przykład:

idiv ebx


imul[edytuj]

A B C działanie
ROP lub adres (byte) A * AL -> AX
ROP lub adres (word) A * AX -> DX:AX
ROP lub adres (dword) A * EAX -> EDX:EAX
ROP wartość, ROP lub adres A * B -> A
ROP lub adres wartość ROP A * B -> C

działanie: służy do mnożenia, lecz ogólnie działanie jest zależne od liczby parametrów (patrz: tabela po prawej); wszystkie działania są wykonywane na liczbach ze znakiem; dla liczb bez znaku skorzystaj z mul.
A: zależnie od liczby parametrów.
B(opcjonalnie): zależnie od liczby parametrów.
C(opcjonalnie): rejestr ogólnego przeznaczenia.
modyfikowane flagi: nieokreślone.
przykłady:


imul ax
imul eax 09h
imul edx 03h eax

inc[edytuj]

działanie: zwiększa A o 1.
A: rejestr lub adres pamięci.
modyfikowane flagi: OF, SF, ZF, AF i PF.

przykład:

 inc eax


mul[edytuj]

rozmiar A rejestr wynik
byte AL AX
word AX DX:AX
double word EAX EDX:EAX

działanie: mnoży A przez odpowiedni rejestr i zapisuje wynik w odpowiednim rejestrze (zależne od rozmiaru A; patrz tabela po prawej); wszystkie działania są wykonywane na liczbach bez znaku; dla liczb ze znakiem skorzystaj z imul.
A: rejestr ogólnego przeznaczenia lub adres pamięci.
modyfikowane flagi: OF, SF, ZF, AF, PF i CF.
modyfikowane rejestry: zależnie od rozmiaru A

przykład:

 mul eax


sbb[edytuj]

działanie: odejmuje B i flagę CF od A; wynik przechowuje w A.
A: rejestr lub adres pamięci.
B: konkretna wartość, rejestr lub adres pamięci (ale tylko jeśli A również nie jest adresem pamięci).
modyfikowane flagi: OF, CF, SF, ZF, AF i PF.

przykład:

 sbb eax 09h


sub[edytuj]

działanie: odejmuje B od A; wynik przechowuje w A.
A: rejestr lub adres pamięci.
B: konkretna wartość, rejestr lub adres pamięci (ale tylko jeśli A również nie jest adresem pamięci).
modyfikowane flagi: OF, CF, SF, ZF, AF i PF.

przykład:

 sub eax 09h