- •Микропроцессоры в системах защиты информации
- •Общие методические указания
- •Лабораторная работа 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
ИССЛЕДОВАНИЕ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ ДЛЯ ЧИСЕЛ, ПРЕДСТАВЛЕННЫХ В ФОРМАТЕ С ПЛАВАЮЩЕЙ ЗАПЯТОЙ
Цель работы: |
Ознакомление с алгоритмами арифметических операций для чисел, представленных в формате с плавающей запятой на языке Ассемблер МПК 1810 с использованием отладочных средств. |
Выполненние работы Программа 5.1
; TITLE ПРОГРАММА ДЛЯ СЛОЖЕНИЯ И ВЫЧИТАНИЯ
; TITLE ЧИСЕЛ В ФОРМАТЕ С ПЛАВАЮЩЕЙ ЗАПЯТОЙ
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)
DSEG ENDS
;
CSEG SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
;
ADDSUBF PROC FAR
mov ax,DSEG
mov ds,ax
; Первый операнд Х в регистрах BX:SI,
; второй Y в регистрах DX:DI,
; результат возвращается из регистрав BX:SI в Z.
Start: lea si,X
lea di,Y
mov bx,[si+2]
mov si,[si]
mov dx,[di+2]
mov di,[di]
; Переход к подпрограммам сложения, вычитания
call ADDSBF
; Сохранить результат
lea di,Z
mov [di],si
mov [di+2],bx
jmp Start ;ret
ADDSUBF ENDP
ADDSBF PROC
;================================================
; Сложение чисел с плавающей точкой.
; Первый операнд Х в регистрах BX:SI,
; второй Y в регистрах DX:DI,
; сумма возвращается в регистрах BX:SI.
; При антипереполнении флажок CF установлен в 1
;================================================
; Сравнить знаки операндов и определить операцию
@addf: mov al,bh ; Сравнить
xor al,dh ; знаки операндов
jns @addf1 ; Знаки операндов одинаковы
xor dh,80h ; Знаки различны,
jmp @subf ; перейти к вычитанию
;
; Проверить операнды на нуль
@addf1: mov ax,dx ; Проверить на нуль
or ax,di ; второй операнд
jz @addf8 ; Результат в BX:SI
mov ax,bx ; Проверить на нуль
or ax,si ; первый операнд
jnz @addf2 ; Оба операнда не нулевые
xchg bx,dx ; Первый операнд равен нулю,
xchg si,di ; сумма равна
jmp @addf8 ; второму операнду
;
; Оба операнда не нулевые можно складывать.
@addf2: mov ah,bh ; Сравнить общий знак в АН
shl bx,1 ; Восстановить скрытый бит
stc ; мантиссы первого операнда
rcr bl,1
shl dx,1 ; Восстановить скрытый бит
stc ; мантиссы второго операнда
rcr dl,1
; Сранить порядки, образовать разность порядков
cmp bh,dh ; Сравнить порядки
jnc @addf3 ; Порядок числа в BX:SI больше
xchg bx,dx ; Передать большее число
xchg si,di ; в BX:SI
@addf3: sub bh,dh ; Образовать разность порядков
jz @addf6 ; Порядки одинаковы
cmp bh,24 ; Сравнить разность порядков с 24
jc @addf5 ; Разность порядков меньше 24
jmp @addf7 ; Результата в BX:SI
; Необходимо сдвигать вправо мантиссу меньшего числа в DL:DI
@addf5: shr dl,1 ; Сдвинуть мантиссу
rcr di,1
inc dh ; Увеличить меньший порядок
dec bh ; Декремент разности порядков
jnz @addf5 ; Повторять сдвиг
mov bh,dh ; Передать порядок в BH
;
; Можно складывать мантиссы. В регистре DH общий порядок
@addf6: add si,di ; Сложить младшие части мантисс
adc bl,dl ; Сложить старшие части мантисс
jnc @addf7 ; Нарушения нормализации влево нет
inc dh ; Скорректировать порядок
cmp dh,255 ; Проверить переполнение
stc
jz @addf8 ; Возникло пререполнение
rcr bl,1 ; Сдвинуть
rcr si,1 ; мантиссу вправо
mov bh,dh ; Передать порядок в BH
;
; Форматировать результат
@addf7: add ah,ah ; Знак во флаге переноса
rcr bh,1 ; Знак числа на месте
rcr ah,1 ; Младший бит порядка в АН7
or ah,7fh ; Образовать мантиссу
and bl,ah ; Образовать второй байт числа
@addf8: ret
;===========================================================
; Вычитание чисел с плавающей точкой.
; Первый операнд Х (уменьшаемое) в регистрах BX:SI,
; второй Y (вычитаемое) в регистрах DX:DI,
; разность возвращается в регистрах BX:SI.
; При антипереполнении флажок CF установлен в 1
;===========================================================
@subf:
; Проверить операнды на нуль
@subf1: mov ax,dx ; Проверить на нуль
or ax,di ; второй операнд
jz @subfa ; Результат в BX:SI
mov ax,bx ; Проверить на нуль
or ax,si ; первый операнд
jnz @subf2 ; Оба операнда не нулевые
xchg bx,dx ; Первый операнд равен нулю,
xchg si,di ; разность равна
xor bh,80h ; второму операнду
jmp @subfa ; с измененным знаком
;
; Оба операнда не нулевые можно вычитать.
@subf2: mov ah,bh ; Сохранить знак уменьшаемого
shl bx,1 ; Восстановить скрытый бит
stc ; мантиссы уменьшаемого
rcr bl,1
shl dx,1 ; Восстановить скрытый бит
stc ; мантиссы вычитаемого
rcr dl,1
; Проверить отношения между числами
cmp bh,dh ; Сравнить порядки
jnz @subf3 ; Порядки не равны
cmp bl,dl ; Сранить старшие байты мантисс
jnz @subf3 ; Они не равны
cmp si,di ; Сравнить младшие слова мантисс
jnz @subf3 ; Они не равны
mov bx,0 ; Числа равны,
mov si,0 ; разность равна нулю
jmp @subfa
; Операнды не равны, необходимо вычитать.
@subf3: jnc @subf4 ; Уменьшаемое больше вычитаемого
xchg bx,dx ; Вычитаемое больше уменьшаемого,
xchg si,di ; обменять числа
xor ah,80h ; Изменить знак результата
; Образовать разность порядков.
@subf4: sub bh,dh ; Разность порядков в BH
jz @subf7 ; Порядки одинаковы
cmp bh,24 ; Сравнить разность порядков с 24
jc @subf6 ; Разность порядков меньше 24
jmp @subf9 ; Результата в BX:SI
; Необходимо сдвигать вправо мантиссу менишего числа в DL:DI
@subf6: shr dl,1 ; Сдвинуть мантиссу
rcr di,1
inc dh ; Увеличить меньший порядок
dec bh ; Декремент разности порядков
jnz @subf6 ; Повторять сдвиг
mov bh,dh ; Передать общий порядок в BH
; Вычитание мантисс и образование результата.
@subf7: sub si,di ; Вычесть мантиссы
sbb bl,dl
@subf8: or bl,bl ; Проверить старший бит мантиссы
js @subf9 ; Результат нормализован
dec bh ; Декремент порядка
cmp bh,255 ; Проверить переполнение
stc ; Установить флаг переноса
jz @subfa ; Возникло антипереполнение
shl si,1 ; Сдвинуть мантиссу влево
rcl bl,1
jmp @subf8 ; Повторять до нормализации
; Форматировать результат
@subf9: add ah,ah ; Знак во флаге переноса
rcr bh,1 ; Знак числа на месте
rcr ah,1 ; Младший бит порядка в АН7
or ah,7fh ; Образовать мантиссу
and bl,ah ; Образовать второй байт числа
@subfa: ret
ADDSBF ENDP
CSEG ENDS
|
1 слагаемое |
2 слагаемое |
результат |
|||
десятичное |
шестнадцат. |
десятичное |
шестнадцат. |
десятичное |
шестнадцат. |
|
1 |
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
уменьшаемое |
вычитаемое |
результат |
|||
десятичное |
шестнадцат. |
десятичное |
шестнадцат. |
десятичное |
шестнадцат. |
|
1 |
|
|
|
|
|
|
23 |
|
|
|
|
|
|