Вопрос № 182477: Здравствуйте! Прошу помощи в следующем вопросе: Выполнить процедуру выравнивания порядка чисел с плавающей запятой, находящихся в ОЗУ. Числа состоят из трех байт: первый байт- характеристика, второй- ст.байт мантиссы, третий- мл.байт мантисс...
Вопрос № 182477:
Здравствуйте! Прошу помощи в следующем вопросе: Выполнить процедуру выравнивания порядка чисел с плавающей запятой, находящихся в ОЗУ. Числа состоят из трех байт: первый байт- характеристика, второй- ст.байт мантиссы, третий- мл.байт мантиссы. Мантисса представлена в дополнительном коде. Выравнивание порядка состоит в сравнении характеристик и сдвиге вправо числа с меньшим порядком. При этом должен быть скорректирован его порядок.
Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Labadist! Программа работает с двумя форматами вещественных чисел: 1) нормализованный: sppppppp hhhhhhhh nnnnnnnn, где s - знак числа ppppppp - характеристика числа = порядок + 64 hhhhhhhh - старший байт мантиссы nnnnnnnn - младший байт мантиссы В данном формате в мантиссе пишутся биты за первой значащей единицей, которая не пишется, только подразумевается 2) временный формат. Формат тот же. Отличия в "наполнении". Знак и характеристика имеют тот же смысл,
что и в нормализованном формате А вот в мантиссе пишутся все биты, включая старшую, только подразумевавшуюся в нормализованном формате.
Программа решает поставленную задачу, преобразуя оба числа во временный формат. Мантиссу меньшего числа сдвигает вправо на число бит, равное разности характристик. Характеристика меньшего числа становится равной характеристике большего.
Код:
;Выполнить процедуру выравнивания порядка чисел с плавающей запятой, находящихся в ОЗУ. ;Числа состоят из трех байт: первый байт- характеристика, второй- ст.байт мантиссы, ;третий- мл.байт мантиссы. Мантисса представлена в дополнительном коде. ;Выравнивание порядка состоит
в сравнении характеристик и сдвиге вправо числа ;с меньшим порядком. При этом должен быть скорректирован его порядок.
;Адреса во внутреннем ОЗУ ;Выбраны такие, которые позполяют адресовать биты (для знака) ;первое вещественное число Num1_0 equ 20h ;знак + характеристика Num1_1 equ 21h ;ст б нормализованной мантиссы Num1_2 equ 22h ;мл б нормализованной мантиссы
;буфер для первого числа во временном вещественном формате 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
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 ;ac
c.7 = мл биту ст байта mov @r1, a ;сохраняем ret
end
----- Люби своего ближнего, как самого себя
Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 16.03.2011, 23:07
Номер ответа: 266284 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 266284
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.