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

Лабораторная работа 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