Asembler x86/Instrukcje/Arytmetyczne
Asembler X86 Instrukcje | ||||
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