114 5. Rozkazy mikroprocesorów 8086/8088
Mnożenie zawartości akumulatora przez rejestr (ze znakiem)
1111 Oliw 11101 reg
Liczba taktów dla w = O - 80...98, dla w = 1 -128...154. i
Przykłady
MOV AL, ZMIENNABAJT IMUL BL ; wynik w AX
MOV AX, ZMIENNA SLOWO MUL BX ; wynik w DXoAX
• ••
MOV AL, ZMIENNA BAJT
CBW ; konwersja bajt-* słowo
Mnożenie zawartości akumulatora przez argument w pamięci (ze znakiem)
1111 Oliw mod 101 r/m addrlow addrhigh
Przykład
MOV AL, ZMIENNABAJTl
IMUL ZMIENNA_BAJT_2[SI] ; wynik w AX «
AAM (ang. ASCII adjust for multiply ) i
poprawka po mnożeniu w rozpakowanym kodzie BCD
Operacja: AH AL/10; AL AL mod 10 Znaczniki: OF DFIF TF SF ZF AF PF CF
?---xx?x?
Rozkaz wprowadza poprawkę wyniku po mnożeniu dwójkowym dwóch cyfr (rozpakowany kod BCD). Wówczas otrzymuje się dwucyfrową liczbę (rozpakowany kod BCD), umieszczoną w AH i AL. Obliczenie poprawki: zawartość rejestru AL jest dzielona przez 10, całkowita część wyniku jest zapamiętana w AH, reszta zaś w AL.
11010100 0000 1010
Liczba taktów -83. 4
Przykład
MOV CL, 7 MOV AL, 5 |
• > • y |
AH 9999 9999 |
5 |
AL 0000 0101 |
MUL CL |
• y # |
0 0000 0000 |
35 |
00100011 |
AAM |
• y |
3 0000 0011 |
5 |
00000101 |
powered by
5.3. Rozkazy operacji arytmetycznych i logicznych
5J.4. Dzielenie
DIV (ang. divide byte or word unsigned)
dzielenie argumentów bez znaku_ _ _______
Operacja: {w = 0 =* (dzielna: = AX; dzielnik: = arg_bajt; max: = OFFH) else (dzielna: = DXoAX; dzielnik: = argslowo; max: =0FFFFH)}; next (dzielna/dzicl-nik > max) =» INT 0 else (w = 0 => AL«-AX/dziclnik; AH«-AX mod dzielnik else AX«-DXoAX/dzielnik; DX«-DXoAX mod dzielnik)
Znaczniki: OF DFIF TF SF ZF AF PF CF
9 ... 9 9 9 9 9
• • • • • •
Tablica 5.9. Argumenty rozkazów dzielenia
Dzielna |
Dzielnik |
Iloraz |
Reszta | |
AX (16 bitów) |
Reg8 lub mcm8 |
AL (8 bitów) |
AH (8 bitów) | |
DXbAX (32 bity) |
Rcgló lub memló |
AX (16 bitów) |
DX (16 bitów) |
Rozkaz realizuje dzielenie argumentów bez znaku. Możliwe kombinacje argumentów przedstawiono w tabl. 5.9. Jeżeli wynik dzielenia przekracza odpowiednio OFFH lub OFFFFH, co występuje np. przy dzieleniu przez zero, to jest generowane przerwanie INT 0, a iloraz i reszta nie są zdefiniowane. Możliwe opcje
Dzielenie zawartości akumulatora przez rejestr
1111 Oliw 11110 reg
Liczba taktów dla w = 0 - 80...90, dla w = 1 -144...162.
Przykłady
MOV DX, STARSZA CZESC MOV AX, MLODSZACZESC
DIV CX ; iloraz w AX, reszta w DX
• • •
M()V AL, ZMIENNA BAJT ; dzielenie bajtu przez MOV AH, 0 ; bajt
DIV BL ; iloraz w AL, reszta w AH +
Dzielenie zawartości akumulatora przez argument w pamięci
1111 Oliw modllOr/m addrlow addrhigh
Liczba taktów dla w = 0 - 8Ó...96 + takty do obliczenia adresu efektywnego,dla w = 1 -150...168 + takty do obliczenia adresu efektywnego.
Przykłady
MOV DX, 0 ; dzielenie słowa przez słowo
MOV AX, ZMIENNA
♦
DIV WORD PTR [SI + BX] ; iloraz w AX, reszta w DX