Консультация № 137014
15.05.2008, 23:04
0.00 руб.
0 1 1
Здравствуйте, уважаемые эксперты. Помогите пожалуйста написать программу на Ассемблере для МК51 (у нас используется программа Keil uvision 3 версии) , складывающую и умножающую числа, представленные в системе счисления с основанием 5.

Обсуждение

давно
Посетитель
7438
7205
19.05.2008, 13:46
общий
это ответ
Здравствуйте, LordId!
В приложении необходимые подпрограммы.
Сделаны следующие допущения:
1)Числа в упакованном виде: в стандарте intel - младший лежит по меньшему адресу,
в байте - младший разряд в младших битах.
2)В работе используется первый банк регистров.
PS Не проверял, Keil-а у меня нет, но вроде должно работать...
По крайней мере, идея точно работоспособная :)
Удачи!

Приложение:
;Зададим три бита для управления разрядами b_ev_1 bit 20h.0 ;бит определения полубайта в байте 1 операнда (0-младший)b_ev_2 bit 20h.1 ;-//- 2 операндаb_ev_3 bit 20h.2 ;-//- результатаtext segment code rseg text;r0 - адрес первого упакованного числа (2 байта);r1 - адрес второго упакованного числа (2 байта);r7 - адрес результата (2 байта);используются регистры первого банка;на выходе C=1 - переполнениеadd55: mov r3,#4 ;длина чисел - 4 разряда clr c ;сбросим C anl 20h,#0f8h ;сбросим биты разрядов, начинаем с младшихnext: call getn1 ;получаем очередной разряд первого операнда (00h-04h) mov b,a ;сохраним в b call getn2 ;получаем очередной разряд второго операнда (00h-04h) add a,b ;сложим с учетом бита переноса cjne a,#5,cmp_5 ;сравним с 5 jmp sub_5 ;равно, идем на >= 5cmp_5: jc set_val ;<5 - просто сохраняемsub_5: clr C ;>=5 - сбросим бит переноса subb A,#5 ;отнимаем 5 setb c ;и взведем перенос для последующей операцииset_val:mov b,a ;п/п требует значение в b call setn ;сохраним результат djnz r3,next ;зацикливаем ret;умножаем в столбик;r2 - адрес первого упакованного числа (2 байта);r3 - адрес второго упакованного числа (2 байта);r4 - адрес результата (4 байта);используются и портятся все регистры первого банка + bmul55: mov r5,#4 ;повторяем 4 раза (по каждому разряду второго операнда) anl 20h,#0f8h ;сбросим биты разрядов, начинаем с младшихmnext1: mov r0,2 ;стартовый адрес первого байта первого операнда mov r1,3 ;стартовый адрес первого байта второго операнда mov r7,4 ;стартовый адрес первого байта результата mov r4,#0 ;перенос mov r6,#4 ;повторяем 4 раза (по каждому разряду первого операнда)mnext2: call getn1 ;получаем очередной разряд первого операнда (00h-04h) mov b,a ;сохраним в b call getn2 ;получаем очередной разряд второго операнда (00h-04h) mul ab ;умножим clr c add a,r4 ;учтем перенос с предыдущей операции mov b,#5 ;вычислим новый перенос div ab ;в b имеем очередной разряд mov r4,a ;в а - перенос call setn ;сохраним очередной разряд из b djnz r6,mnext2 ;умножаем разряд 2 операнда на каждый разряд 1 операнда cpl b_ev_2 ;сдвигаем на один разряд операнд 2 jb b_ev_2,set_3 ;или указываем на старший полубайт в том же байте inc r4 ;либо сдвигаем на один байтset_3: cpl b_ev_3 ;сдвигаем на один разряд результат jb b_ev_3,to_loop ;или указываем на старший полубайт в том же байте inc r3 ;либо сдвигаем на один байтto_loop:djnz r5,mnext1 ;циклим по разрядам 2 операнда ret;читаем очередной разряд 1 операндаgetn1: mov a,@r0 ;читаем пару разрядов jnb b_ev_1,clr_hi1 ;если нужен младший полубайт, то идем дальше inc r0 ;если старший, то инкремент адреса для последующих операций rr a ;сдвигаем на 4 бита вправо rr a rr a rr aclr_hi1:anl a,#0fh ;отсекаем старшие биты cpl b_ev_1 ;меняем признак младшего/старшего разряда ret;читаем очередной разряд 2 операндаgetn2: mov a,@r1 ;аналогично getn1 jnb b_ev_1,clr_hi2 inc r1 rr a rr a rr a rr aclr_hi2:anl a,#0fh cpl b_ev_2 ret;записываем результатsetn: push 0 ;сохраним r0 первого банка mov 0,r7 ;адрес результата в r7 mov a,b ;в b - значение jnb b_ev_3,set_bit ;какой разряд? inc r7 ;для старшено инкрементируем адрес orl a,@r0 ;объединим с младшим разрядомset_bit:mov @r0,a ;запишем cpl b_ev_3 ;меняем младший/старший разряд pop 0 ;восстановим r0 - в нем адрес первого операнда ret end
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа