Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тетрадь_ЗИ.doc
Скачиваний:
1
Добавлен:
10.11.2019
Размер:
711.17 Кб
Скачать

Программа 5.3

TITLE Умножение чисел с плавающей запятой

TITLE с применением команды MUL МП 1810

;

SSEG SEGMENT PARA STACK 'STACK'

DB 256 DUP(0)

SSEG ENDS

;

DSEG SEGMENT PARA PUBLIC 'DATA'

X DD 1 DUP(0)

Y DD 1 DUP(0)

Z DD 1 DUP(0)

TEMP DD 1 DUP(0)

DSEG ENDS

;

CSEG SEGMENT PARA PUBLIC 'CODE'

ASSUME CS:CSEG,DS:DSEG,SS:SSEG

;

MULT PROC FAR

mov ax,DSEG

mov ds,ax

; Первый операнд Х находится в регистрах BX:SI,

; второй Y в регистрах DX:DI, произведение

; возвращается в регистрах BX:SI.

; При возникновении особого случая CF=1

;

Start: lea si,X

lea di,Y

mov bx,[si+2]

mov si,[si]

mov dx,[di+2]

mov di,[di]

MULF: ; Проверить операнды на нуль

mov ax,bx ; Проверить на 0

or ax,si ; первый операнд

jz @@M1 ; Произведение равно 0

mov ax,dx ; Проверить на 0

or ax,di ; второй операнд

jnz MULF1 ; Операнды не равны 0

xchg bx,dx ; Произведение равно 0

xchg si,di

@@M1: jmp MULF8

;

; Операнды не нулевые, можно умножать.

; Образовать знак произведения, восстановить мантиссы.

MULF1: mov ch,bh ; Знак произведения

xor ch,dh ; в регистре CH

shl bx,1 ; Восстановить скрытый бит

stc ; мантиссы первого операнда

rcr bl,1

shl dx,1 ; Восстановить скрытый бит

stc ; мантиссы второго операнда

rcr dl,1

; Сложить порядки.

mov al,bh ; Сложить в AL

add al,dh ; смещенные порядки

jc MULF2 ; Возник перенос

sub al,127 ; Вычесть смещение

jnc MULF3 ; Можно умножать

jmp MULF8 ; Возникло антипереполнение

MULF2: add al,129 ; Учесть потерю 256 из-за переноса

jnc MULF3 ; Можно умножать

jmp MULF8 ; Возникло переполнение

; Можно умножать мантиссы.

MULF3: mov bh,al ; Порядок произведения в BH

xor dh,dh ; Подготовить место

xor ax,ax ; для произведения

mov cl,dl ; Освободить регистр DX

; Здесь начинается цикл умножения

MULF4: mov ax,si ; Умножить младшие

mul di ; слова мантисс

mov WORD PTR TEMP,dx ; Сохранить старшую часть

;произведения

mov al,bl

mov ah,0

mul di

add WORD PTR TEMP,ax ; Учесть результат

jnc NEXT ; в полном произведении

inc dx

NEXT: mov WORD PTR TEMP+2,dx

mov al,cl ; Умножить следующие

mov ah,0 ; части мантисс

mul si

add WORD PTR TEMP,ax

jnc NEXT1

inc dx

NEXT1: add dx,WORD PTR TEMP+2

mov al,bl ; Умножить старшие

mul cl ; байты мантисс

add ax,dx ; Образовать полное произведение

mov bl,ah ; и разместить его

mov ah,al ; в регистрах BL:SI

mov al,BYTE PTR TEMP+1

mov si,ax

; Проверить нарушение нормализации влево.

MULF6: or bl,bl ; Проверить старший бит мантиссы

jns MULF7 ; Нарушения нормализации нет

inc bh ; Увеличить порядок на 1

stc ; CF=1

jz MULF8 ; Возникло переполнение

jmp MULFA ; Переполнения нет

MULF7: shl si,1 ; Сдвинуть мантиссу

rcl bl,1 ; влево на один бит

; Формирование результата

MULFA: add ch,ch ; Знак во флаге переноса

rcr bh,1 ; Знак числа на месте

rcr ch,1 ; Младший бит порядка в CH

or ch,7fh ; Образовать маску

and bl,ch ; Образовать 2-й байт произведения

lea di,Z

mov [di],si

mov [di+2],bx

MULF8: jmp Start ; RET

MULT ENDP

CSEG ENDS

END MULT

Множимое

Множитель

Результат

десятичное

шестнадцат.

десятичное

шестнадцат.

десятичное

шестнадцат.

1

2