16.03.2011, 23:07
общий
это ответ
Здравствуйте, Labadist!
Программа работает с двумя форматами вещественных чисел:
1) нормализованный: sppppppp hhhhhhhh nnnnnnnn, где
s - знак числа
ppppppp - характеристика числа = порядок + 64
hhhhhhhh - старший байт мантиссы
nnnnnnnn - младший байт мантиссы
В данном формате в мантиссе пишутся биты за первой значащей единицей, которая не пишется, только подразумевается
2) временный формат. Формат тот же. Отличия в "наполнении".
Знак и характеристика имеют тот же смысл, что и в нормализованном формате
А вот в мантиссе пишутся все биты, включая старшую, только подразумевавшуюся в нормализованном формате.
Программа решает поставленную задачу, преобразуя оба числа во временный формат.
Мантиссу меньшего числа сдвигает вправо на число бит, равное разности характристик.
Характеристика меньшего числа становится равной характеристике большего.
[code h=200];Выполнить процедуру выравнивания порядка чисел с плавающей запятой, находящихся в ОЗУ.
;Числа состоят из трех байт: первый байт- характеристика, второй- ст.байт мантиссы,
;третий- мл.байт мантиссы. Мантисса представлена в дополнительном коде.
;Выравнивание порядка состоит в сравнении характеристик и сдвиге вправо числа
;с меньшим порядком. При этом должен быть скорректирован его порядок.
;Адреса во внутреннем ОЗУ
;Выбраны такие, которые позполяют адресовать биты (для знака)
;первое вещественное число
Num1_0 equ 20h ;знак + характеристика
Num1_1 equ 21h ;ст б нормализованной мантиссы
Num1_2 equ 22h ;мл б нормализованной мантиссы
;второе вещественное число
Num2_0 equ 23h
Num2_1 equ 24h
Num2_2 equ 25h
;буфер для первого числа во временном вещественном формате
Num3_0 equ 26h ;знак + характеристика
Num3_1 equ 27h ;ст б мантиссы
Num3_2 equ 28h ;мл б мантиссы
;буфер для второго числа во временном вещественном формате
Num4_0 equ 29h
Num4_1 equ 2ah
Num4_2 equ 2bh
org 0
jmp start
start: ;начало программы
;занесем числа в ОЗУ
;20h-22h = 23.e-4 = 0.0000000010010110101110111 = 1.0010110101110111*2^-9
mov Num1_0, #37h ;порядок 37h-64 = -9
mov Num1_1, #2dh ;ст б мантиссы 00101101
mov Num1_2, #77h ;мл б мантиссы 01110111
;23h-25h = 45.e-5 = 0.0000000000011101011111011011 = 1.1101011111011011*2^-12
mov Num2_0, #34h ;порядок 34h-64 = -12
mov Num2_1, #0d7h ;ст б мантиссы 11010111
mov Num2_2, #0dbh ;мл б мантиссы 11011011
call adjust ;выравниваем порядок
jmp $ ;работа сделана, зацикливаемся
Adjust: ;выравниваем порядок,
; при этом формируем числа во временном
; вещественном формате по адресам
; Num3_0-Num3_2 и Num4_0-Num4_2
;определим у кого больше порядок
mov a, Num1_0 ;характеристика первого числа
clr acc.7 ;сбросим знак
mov b, Num2_0 ;характеристика второго числа
clr b.7 ;сбросим знак
clr c ;для subb
subb a, b ;a = a - b - c
jc less_1 ;если a < b, то на less_1 (первое < второго)
less_2_or_equal: ;первое >= второго
;первое (большее) просто переводим во временный формат
;второе (меньшее) сдвигаем, кроме того, вправо на разницу в порядке
mov r0, #Num1_0 ;адрес исходного большего числа
mov r1, #Num3_0 ;адрес результирующего большего временного числа
mov r2, #Num2_0 ;адрес исходного меньшего числа
mov r3, #Num4_0 ;адрес результирующего меньшего временного числа
jmp form_greater ;на формирование большего временного числа
less_1: ;первое < второго
;второе (большее) просто переводим во временный формат
;первое (меньшее) сдвигаем, кроме того, вправо на разницу в порядке
mov r0, #Num2_0 ;адрес исходного большего числа
mov r1, #Num4_0 ;адрес результирующего большего временного числа
mov r2, #Num1_0 ;адрес исходного меньшего числа
mov r3, #Num3_0 ;адрес результирующего меньшего временного числа
cpl a ;разница порядков первый - второй будет отрицательной
inc a ;возьмем модуль (neg a = (not a) + 1)
form_greater: ;начинаем формировать, начиная с большего
mov r4, a ;сохраним разность поряднов в r4
call Add_Hi_1 ;формируем число @r0 во временном формате по адресу @r1
;преобразуем меньшее число во временный формат
mov r0, 2 ;r0 = r2 0-го банка
mov r1, 3 ;r1 = r3 0-го банка
;подправим порядок
mov a, @r0 ;старый
add a, r4 ;добавим разницу
call Add_Hi_1_1 ;идем в точку сохранения п/п формирования врем формата
;сдвинем мантиссу на r4 бит вправо
cjne r4, #0, Shift ;проверим на 0 (порядки равны?)
ret ;если равны, то уже все сделано
Shift: ;цикл сдвига
dec r1 ;вернемся на первый байт мантиссы
mov a, @r1 ;читаем
clr c ;будем вдвигать 0 из С
rrc a ;сдвигаем на один бит вправо, acc.7 = С, С = acc.0
mov @r1, a ;сохраняем
inc r1 ;на второй бай мантиссы
mov a, @r1 ;читаем
rrc a ;сдвигаем на один бит вправо, acc.7 = С = мл биту ст байта
mov @r1, a ;сохраняем
djnz r4, Shift ;r4 раз
ret
;формирование из числа в нормализованном виде по адресу @r0
;числа во временном формате по адресу @r1
;формирование заключается во вставке старшего бита = 1, которая
;в нормализованном виде только подразумевается
Add_Hi_1:
mov a, @r0 ;характеристика исходного числа
Add_Hi_1_1: ;точка входа для сохранения измененной характеристики
mov @r1, a ;сохраняем
inc r0 ;на первый байт мантиссы
inc r1
setb c ;С = 1
mov a, @r0 ;первый байт мантиссы
rrc a ;"загоняем" единицу в acc.7, С = acc.0
mov @r1, a ;сохраняем
inc r0 ;на второй байт мантиссы
inc r1
mov a, @r0 ;второй байт мантиссы
rrc a ;acc.7 = мл биту ст байта
mov @r1, a ;сохраняем
ret
end
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен