Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lectures / 10-11

.pdf
Скачиваний:
49
Добавлен:
16.04.2013
Размер:
164.26 Кб
Скачать

Умножение чисел со знаком (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

 

 

Соседние файлы в папке Lectures