Lectures / 10-11
.pdfОрганизация ЭВМ и систем
Лекция 10-11
Арифметические и логические команды
Описание целых двоичных чисел
adb 11h
bdw 1122h ; в памяти 22 11
cdd 11223344h ; 44 33 22 11
Сложение двоичных чисел без знака
254 + 5 = 259 |
|
+ |
1111 1110 |
||
|
|
|
0000 |
0101 |
|
|
|
|
----------- |
||
|
CF = |
1 |
1 |
0000 |
0011 |
Команды: |
|
|
|
• inc оп |
оп = оп+1 |
• add оп1,оп2 |
оп1=оп1+оп2 |
• adc оп1,оп2 |
оп1=оп1+оп2+CF |
|
|
Сложение длинных чисел без знака
a1 |
dd |
131071 |
; 1FFFFh |
a2 |
dd |
2 |
; 2h |
sum dd |
0 |
|
……………………………………
mov AX, word ptr a1 add AX, word ptr a2 mov word ptr sum, AX mov AX, word ptr a1+2 adc AX, word ptr a2+2 mov word ptr sum+2, AX
0 0 0 1 F F F F
0 0 0 0 0 0 0 2
0 0 0 2 0 0 0 1
CF
01
Сложение двоичных чисел со знаком
12001111000
+4 + 00000100
-----------
124 01111100
Переносов нет (6, 7 |
|
|
|||
OF = 0 |
|||||
разряды), результат |
|
|
|
||
CF = 0 |
|||||
верный |
|
|
|
||
|
|
|
|||
-120 |
|
10001000 |
|
|
|
+- 10 |
|
+ 11110110 |
|
|
|
--- |
|
-------- |
|
|
|
-130 |
|
1 01111110 |
|
|
|
|
|
|
|
|
|
Перенос из знакового OF = 1
разряда, результат |
|
|
CF = 1 |
||
неверный |
||
|
120 |
|
01111000 |
+120 |
|
+ 01111000 |
--- |
|
-------- |
240 |
|
11110000 |
|
|
|
Перенос из старшего |
|
|
||
OF = 1 |
||||
разряда, результат |
|
|
|
|
|
|
|
||
CF = 0 |
||||
неверный |
|
|
|
|
|
|
|
||
-10 |
11110110 |
|
|
+-10 + 11110110
--- --------
-20 1 11101100
Перенос из старшего и OF = 0 знакового разрядов, CF = 1 результат верный
Вычитание двоичных чисел без знака
05 - 10 = |
|
0000 0101 |
|
|
|
- 0000 |
1010 |
|
|
----------- |
|
|
CF = 1 |
1111 |
1011 |
Если CF=1, то результат получается в дополнительном коде
Команды: |
|
|
|
• dec оп |
оп = оп-1 |
• sub оп1,оп2 |
оп1=оп1-оп2 |
• sbb оп1,оп2 |
оп1=оп1-оп2-CF |
|
|
Вычитание чисел без знака: Пример
……………..
mov sub jnc … jmp
ok: …… exit: …..
ax,5
ax,10
ok neg ax
; результат неверный
exit
; результат верный
Вычитание двоичных чисел со знаком
45 |
|
|
|
|
|
0010 |
1101 |
(+45) |
|
-(-127) |
|
+ 0111 |
1111 |
(+127) |
--- |
|
--------- |
|
|
172 |
|
1010 |
1100= -84 |
Результат неверный. Переполнение
(-45) |
|
|
|
|
|
- |
1101 0011 |
||
-(+45) |
|
1101 |
0011 |
|
--- |
|
1 |
--------- |
|
-90 |
|
1010 |
0110 |
OF = 1
OF = 0
Результат верный
Умножение двоичных чисел без знака
mul сомножитель2
Сомножи- |
Сомножи- |
Результат |
|
тель2 |
тель1 |
||
(reg/mem) |
(неявный) |
|
|
|
|
|
|
Байт |
al |
ax |
|
(ah - старшая часть) |
|||
|
|
||
|
|
|
|
Слово |
ax |
dx:ax |
|
|
|
(dx - старшая часть) |
|
|
|
|
|
Двойное |
eax |
edx:eax |
|
слово |
(edx-старшая часть) |
||
|
|||
|
|
|
Умножение чисел без знака: 25*45
…… |
|
|
|
|
res |
label word |
|||
resl |
db |
45 |
|
|
resh db |
0 |
|
|
|
…… |
|
|
mov res,ax |
|
mov al,25 |
|
|
|
|
|
|
|
||
mul |
resl |
|
|
|
jnc |
m1 |
; если нет переполнения |
mov resh,ah ; старшая часть - в resh m1: mov resl,al
……