Instrukcje Arytmetyczne

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

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

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

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

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

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

mul

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.

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

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

div

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.

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

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

imul

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

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

idiv

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.

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

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

O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License