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

zoshyt

.pdf
Скачиваний:
12
Добавлен:
19.02.2016
Размер:
240.49 Кб
Скачать

Работа №5

; Сравнить знаки операндов и определить операцию

@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

;

 

 

 

 

 

21

Работа №5

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

 

@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

22

Работа №5

; Необходимо сдвигать вправо мантиссу менишего числа в 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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Программа 5.3

 

 

 

 

 

 

 

 

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

 

 

 

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

 

 

 

;

 

 

 

 

 

 

 

 

 

 

 

 

 

SSEG

SEGMENT PARA STACK 'STACK'

 

 

 

DB 256 DUP(0)

 

 

 

 

 

 

 

 

 

 

SSEG

ENDS

 

 

 

 

 

 

 

 

 

 

 

;

 

 

 

 

 

 

 

 

 

 

 

 

 

DSEG

SEGMENT PARA PUBLIC 'DATA'

 

 

 

XDD 1 DUP(0)

YDD 1 DUP(0)

ZDD 1 DUP(0)

TEMP

DD 1 DUP(0)

DSEG

ENDS

3 Уменьшаемое должно быть меньше вычитаемого

23

PROC FAR ax,DSEG ds,ax

Работа №5

;

CSEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CSEG,DS:DSEG,SS:SSEG

;

MULT mov mov

;Первый операнд Х находится в регистрах 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

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

24

Работа №5

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Программа 5.4

 

 

 

 

TITLE Деление чисел в формате с плавающей запятой

 

 

 

;

 

 

 

 

 

 

 

 

 

 

 

 

 

SSEG

SEGMENT PARA STACK 'STACK'

 

 

 

DB 256 DUP(0)

 

 

 

 

 

 

 

SSEG

ENDS

 

 

 

 

 

 

 

 

 

 

25

Работа №5

;

DSEG SEGMENT PARA PUBLIC 'DATA'

XDD 64.0 ;1 DUP(0)

YDD 126.25 ;1 DUP(0)

ZDD 1 DUP(0)

DSEG

ENDS

;

 

CSEG

SEGMENT PARA PUBLIC 'CODE'

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

;

DIVFLT 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]

 

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

mov

ax,bx

; Проверить на 0

or

ax,si

; делимое

jz

DIVF7

; Не нулевой результат в BX:SI

mov

ax,dx

; Проверить на 0

or

ax,di ; делитель

stc

 

; Если деление на 0

jz

DIVF7

; CF = 1

; Оба операнда не нулевые

mov

ch,bh

; Образовать знак частного

xor

ch,dh

; в регистре CH

shl

bx,1

; Восстановить скрытый бит

stc

 

; мантиссы делимого

rcr

bl,1

 

 

 

shl

dx,1

; Восстановить скрытый бит

stc

 

; мантиссы делителя

rcr

dl,1

 

 

 

; Вычесть порядки

mov

al,bh

; Образовать разность порядков

sub

al,dh

; в регистре AL

jnc

DIVF1

; Порядок делимого больше

add

al,127

; Прибавить смещение

cmc

 

; Если нет переноса,

jc

DIVF7

; возникло антипереполнение

jmp

DIVF2

; Перейти к делению мантисс

DIVF1: add

al,127 ; Прибавить смещение

jc

DIVF7

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

; Деление мантисс.

DIVF2: mov

bh,0

; Очистить старшие байты

mov

dh,0

; перед мантиссами

mov

cl,24

; Образовать счетчик бит

DIVF3: sub

si,di

; вычесть мантиссу делителя

sbb

bx,dx

; из мантиссы делимого

26

Работа №5

cmc

 

; Образовать в CF бит частного

 

 

 

pushf

 

; Сохранить его в стеке

 

 

 

 

jc

 

DIVF4

; Остаток положительный

 

 

 

add

si,di

; Восстановить предыдущий

 

 

 

adc

bx,dx

; положительный остаток

 

 

 

DIVF4: popf

 

; Вернуть бит частного в CF

 

 

 

rcl

 

bp,1

; Передать бит частного

 

 

 

 

rcl

 

ah,1

; в регистры AH:BP

 

 

 

 

shl

 

si,1

; Сдвинуть остаток

 

 

 

 

rcl

 

bx,1

 

 

 

 

 

 

 

 

 

dec

cl

; Декремент счетчика

 

 

 

 

jnz

 

DIVF3

; Повторять до завершения

 

 

 

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

 

 

 

test

ah,80H

; Проверить старший бит мантиссы

 

 

 

jnz

 

DIVF5

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

 

 

 

dec

al

; Декремент порядка

 

 

 

 

stc

 

; Проверить возможность

 

 

 

 

jz

 

DIVF7

; антипереполнения

 

 

 

 

sub

si,di

; Определить еще один бит

 

 

 

sbb

bx,dx

; мантиссы частного

 

 

 

 

cmc

 

; поместить бит частного

 

 

 

 

rcl

 

bp,1

; в нужное место

 

 

 

 

rcl

 

ah,1

 

 

 

 

 

 

 

 

 

DIVF5: mov

bl,ah

; Разместить частное

 

 

 

mov

si,bp

; в регистрах BX:SI

 

 

 

 

mov

bh,al

 

 

 

 

 

 

 

 

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

 

 

 

 

add

ch,ch

; Знак во флаге переноса

 

 

 

 

rcr

 

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

 

 

 

 

rcr

 

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

 

 

 

or

 

ch,7fh

; Образовать маску

 

 

 

 

and

bl,ch

; Образовать второй байт произведения

 

 

 

lea

 

di,Z

 

 

 

 

 

 

 

 

 

mov

[di],si

 

 

 

 

 

 

 

mov

[di+2],bx

 

 

 

 

 

 

 

DIVF7: jmp Start

 

; RET

 

 

 

 

DIVFLT ENDP

 

 

 

 

 

 

 

 

CSEG

ENDS

 

 

 

 

 

 

 

 

 

END

DIVFLT

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Делимое

 

Делитель

Частное

 

 

десятичное

 

шестнадцат.

 

десятичное

шестнадцат.

десятичное

шестнадцат.

1

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

Выводы:________________________________________________________________________________

_______________________________________________________________________________________

_______________________________________________________________________________________

_______________________________________________________________________________________

_______________________________________________________________________________________

_______________________________________________________________________________________

_______________________________________________________________________________________

_______________________________________________________________________________________

_______________________________________________________________________________________

_______________________________________________________________________________________

_______________________________________________________________________________________

_______________________________________________________________________________________

_______________________________________________________________________________________

27

Работа №5

Алгоритм программы сложения

28

Работа №5

Алгоритм программы умножения

29

Работа №5

Алгоритм программы деления

Выполнил студент _____________________ дата _____________________________

Принял ___________________ "____________________" оценка ________ дата __________________

(подпись)

(Ф И О)

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]