Asembler X86/Instrukcje/Arytmetyczne
Z Wikibooks, biblioteki wolnych podręczników.
Spis treści |
[edytuj] adc
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
[edytuj] add
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
[edytuj] cmp
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
[edytuj] dec
działanie: zmniejsza A o 1.
A: rejestr lub adres pamięci.
modyfikowane flagi: OF, SF, ZF, AF i PF.
przykład:
dec eax
[edytuj] div
| 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 04h
[edytuj] idiv
| rozmiar A | rejestry | wynik | reszta |
|---|---|---|---|
| byte | AX | AH | AL |
| 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 04h
[edytuj] imul
| 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 ilości 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 ilości parametrów.
B(opcjonalnie): zależnie od ilości parametrów.
C(opcjonalnie): rejestr ogólnego przeznaczenia.
modyfikowane flagi: nieokreślone.
przykłady:
imul ax imul eax 09h imul edx 03h eax
[edytuj] inc
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
[edytuj] mul
| 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
[edytuj] sub
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