Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2643
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2342
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1343
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1428
Дата выхода:19.03.2011, 08:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:218 / 68
Вопросов / ответов:1 / 1

Вопрос № 182477: Здравствуйте! Прошу помощи в следующем вопросе: Выполнить процедуру выравнивания порядка чисел с плавающей запятой, находящихся в ОЗУ. Числа состоят из трех байт: первый байт- характеристика, второй- ст.байт мантиссы, третий- мл.байт мантисс...



Вопрос № 182477:

Здравствуйте! Прошу помощи в следующем вопросе:
Выполнить процедуру выравнивания порядка чисел с плавающей запятой, находящихся в ОЗУ. Числа состоят из трех байт: первый байт- характеристика, второй- ст.байт мантиссы, третий- мл.байт мантиссы. Мантисса представлена в дополнительном коде.
Выравнивание порядка состоит в сравнении характеристик и сдвиге вправо числа с меньшим порядком. При этом должен быть скорректирован его порядок.

Используется микроконтроллер Intel 8051

Отправлен: 12.03.2011, 07:37
Вопрос задал: Labadist (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Labadist!
Программа работает с двумя форматами вещественных чисел:
1) нормализованный: sppppppp hhhhhhhh nnnnnnnn, где
s - знак числа
ppppppp - характеристика числа = порядок + 64
hhhhhhhh - старший байт мантиссы
nnnnnnnn - младший байт мантиссы
В данном формате в мантиссе пишутся биты за первой значащей единицей, которая не пишется, только подразумевается
2) временный формат. Формат тот же. Отличия в "наполнении".
Знак и характеристика имеют тот же смысл, что и в нормализованном формате
А вот в мантиссе пишутся все биты, включая старшую, только подразумевавшуюся в нормализованном формате.

Программа решает поставленную задачу, преобразуя оба числа во временный формат.
Мантиссу меньшего числа сдвигает вправо на число бит, равное разности характристик.
Характеристика меньшего числа становится равной характеристике большего.

Код:
;Выполнить процедуру выравнивания порядка чисел с плавающей запятой, находящихся в ОЗУ. 
;Числа состоят из трех байт: первый байт- характеристика, второй- ст.байт мантиссы,
;третий- мл.байт мантиссы. Мантисса представлена в дополнительном коде.
;Выравнивание порядка состоит в сравнении характеристик и сдвиге вправо числа
;с меньшим порядком. При этом должен быть скорректирован его порядок.

;Адреса во внутреннем ОЗУ
;Выбраны такие, которые позполяют адресовать биты (для знака)
;первое вещественное число
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 ;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 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное