- •Микропроцессоры в системах защиты информации
- •Общие методические указания
- •Лабораторная работа 1
- •Выполненние работы Программа 1.1
- •Программа 1.2
- •Программа 1.3
- •Программа 1.4
- •Лабораторная работа 2
- •Выполненние работы Программа 2.4
- •Программа 2.5
- •Лабораторная работа 3
- •Выполненние работы Программа 3.1
- •Лабораторная работа 4
- •Выполненние работы Программа 4.1
- •Лабораторная работа 5
- •Выполненние работы Программа 5.1
- •Программа 5.3
- •Программа 5.4
- •Лабораторная работа 6
- •Выполненние работы Программа 6.1
Программа 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 |
|
|
|
|
|
|