Lectures / 10-11
.pdf
Умножение чисел со знаком (1)
1) Один операнд
imul сомножитель1
•Те же правила, что и для MUL
•Если старшая часть результата равна расширению со знаком, то CF=OF=0
•Иначе CF=OF=1
Умножение двоичных чисел со знаком и
без знака: Примеры
mov AL,3 |
|
|
; Сомножитель1 = |
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
mov BL,2 |
|
|
; Сомножитель2 = |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
mul BL |
|
|
; AX = 0006h = 6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
mov AL,3 |
|
|
; Сомножитель1 = |
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
mov BL,2 |
|
|
; Сомножитель2 = |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
imul BL |
|
|
; AX = 0006h = 6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov AL, 0FFh |
|
; |
|
|
Сомножитель1 |
= |
255 |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
mov BL,2 |
|
|
; Сомножитель2 |
= |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
mul BL |
|
|
; AX = 01FEh = 510 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
mov AL,0FFh |
|
|
; Сомножитель1 |
= 0FFh = -1 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mov BL,2 |
|
|
; Сомножитель2 |
= |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
imul BL |
|
|
; AX = FFFEh = -2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Умножение чисел со знаком (2)
2) Два операнда (386+)
imul оп1,оп2 ; оп1 = оп1 * оп2
оп1 = reg
оп2 = reg / mem / imm
Примеры:
.386
imul ax,-80 ; ax=ax*(-80) imul bx,bx ; bx=bx*bx imul cx,var ; cx=cx*var
Умножение чисел со знаком (3)
3) Три операнда (386+)
imul оп1,оп2,оп3 ; оп1=оп2*оп3
оп1 = reg
оп2 = reg / mem оп3 = imm
Примеры:
.386
imul ax,bx,80 ; ax=bx*80 imul cx,var,-5 ; cx=var*(-5)
Деление двоичных чисел
div делитель idiv делитель
Размер |
Делимое |
Делитель |
Частное |
Остаток |
операнда |
||||
|
|
|
|
|
Байт |
AX |
reg/mem |
AL |
AH |
|
|
|
|
|
Слово |
DX:AX |
reg/mem |
AX |
DX |
|
|
|
|
|
Двойное |
EDX:EAX |
reg/mem |
EAX |
EDX |
слово |
|
|
|
|
|
|
|
|
|
Деление двоичных чисел: Пример
|
|
del : delt |
…. |
|
|
del |
dw |
29876 |
delt |
db |
45 |
…. |
|
|
mov |
ax, del |
|
div |
delt; al - частное, ah - остаток |
|
Команда NEG
neg операнд ; neg оп = 0 - оп
Изменить знак операнда (получить дополнение до двух)
Пример: 340 - (ax) neg ax
add ax,340
Двоично-десятичные числа
(BCD Binary Coded Decimal)
0 - 0000 1 - 0001 …. 9 - 1001
Упакованный формат
Число 5674304: DT 5674304
0 4
4 3
6 7
0 5
0 0
0 0
0 0
0 0
0 0
0 0
Неупакованный формат
Число 5674304: DB 4,0,3,4,7,6,5
Зона
0 4
0 0
0 3
0 4
0 7
0 6
0 5
Сложение неупакованных BCD-чисел
06 |
= |
0000 0110 |
Результат сложения <=9 |
+ 03 |
= |
0000 0011 |
Результат правильный |
-- |
|
--------- |
|
09 |
|
0000 1001 |
|
|
|
|
|
06 |
= |
0000 0110 |
Результат сложения >9 |
+ 07 |
= |
0000 0111 |
Результат неправильный |
-- |
|
--------- |
|
13 |
|
0000 1101 |
|
AAA - коррекция результата сложения
Сложение неупакованных BCD-чисел:
Пример
.data |
|
|
len |
equ |
2 ; разрядность чисел |
b |
db |
1, 7 ; неупакованное число 71 |
c |
db |
4, 5 ; неупакованное число 54 |
sum |
db |
3 dup (0) |
.code |
|
|
… |
xor |
bx, bx |
|
||
|
mov |
cx, len |
m1: |
mov |
al, byte ptr b[bx] |
|
adc |
al, byte ptr c[bx] |
|
aaa |
|
|
mov |
byte ptr sum[bx], al |
|
inc |
bx ; inc не влияет на флаг CF |
|
loop |
m1 |
... |
adc |
byte ptr sum[bx], 0 |
|
|
