Консультация № 178539
21.05.2010, 14:01
0.00 руб.
0 1 1
Здравствуйте, господа эксперты!
Помогите, пожалуйста, решить следующую задачу на ассемблере для 8051(MCS 51). Наверняка уже давно есть готовые решения, но с наскока ничего вменяемого в интернете я не нашел.. Необходимо взять 16-ти битное число, хранящееся в двух 8-ми битных регистрах, и представить его в двоично-десятичном виде методом двух счетчиков. Иными словами, у меня было число 1234, а получить мне нужно четыре цифры (1,2,3,4). Основная проблема в том, что АЛУ восьмибитное, сам алгоритм перевода мне известен.

Обсуждение

давно
Посетитель
7438
7205
22.05.2010, 09:46
общий
это ответ
Здравствуйте, airens.
Вот Вам подпрограмма для преобразования. Данная задача решается предварительным подсчетом сотен путем отнимания числа 100.
Выводится младшим вперед, несложно переделать, если надо наоборот.
Удачи!
Код:
;r2 = low
;r3 = high
;r0 = адрес BCD, младший первым
WordToBCD:
mov r4,#0 ;сотни
mov a,r2 ;младший байт числа
CalcHundreds: ;цикл подсчета сотен
clr C ;сбросим C для вычитания
subb a,#100 ;отнимаем 100
xch a,r3 ;acc=старый старший байт, r3=мл-100=новый младший
subb a,#0 ;учтем перенос
xch a,r3 ;r3=новый старший, acc=новый младший
jc FormBCD ;если был заем, значит число меньше сотни
inc r4 ;иначе больше и мы добавляем очередную сотню
jmp CalcHundreds ;проверяем дальше
FormBCD: ;имеем в acc две младшие десятичные цифры, а в r4 - две старшие
add a,#100 ;был заем, число отрицательное, добавим 100, чтобы вернуть значение
call FormTwoBCD ;преобразуем!
mov a,r4 ;две старшие цифры
FormTwoBCD: ;преобразуем число < 100 в две десятичные цифры
mov b,#10 ;будем делить на 10
div ab ;a=частное, b=остаток
mov @r0,b ;младший вперед
inc r0
mov @r0,a ;старшая цифра
inc r0
ret
end
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа