Пишу лабу по микропроцессорам, необходимо умножить и вывести в память содержимое регистра на константу(>#53). Ввод/вывод в память работает. Давно писал на х86 ассемблере умножение больших чисел - там можно было разделить регистр на младшую и старшую тетрады и оперировать с ними. В 8-битном мк-51, насколько я знаю, это невозможно.
org 0h
ajmp begin
org 30h
;main
begin: mov p1, #00100001b ; ввод через р0, р4 низкий - неактив, р5 ввод
mov r0, #10h ; начальный адрес
mov r1, #3 ; длина
mov r2, #1 ; счётчик перехода на след. байт
inc r1
;mov @r0, #55h
;inc r0
;mov @r0, #55h
;inc r0
;mov @r0, #55h
mov r0, #10h
m2: djnz r1, m1
ajmp begin
m1: acall read
acall save
ajmp m2
;functions
read:
MOV R3, #4 ;счетчик бит в цифpе
CLR A ;A=0
IN: JNB P1.5, IN ;ожидание запроса от ВУ
SETB P1.4 ;выдача сигнала готовности МК
MOV C, P1.0 ;ввод бита
CLR P1.4 ;снятие сигнала готовности МК
JB P1.5, $ ;ожидание снятия запроса от ВУ
RLC A ;задвинуть бит слева
DJNZ R3, IN ;конец цикла ввода бита
ret
save:
cjne r2, #1, w2 ;переход, в какую часть байта писать
mov r4, a ;сохранили
mov a, @r0 ;взяли текущее значение памяти
anl a, #11110000b ;пишем в младший полубайт
orl a, r4
mov @r0, a
push acc
clr a
inc r2
ajmp e
w2: swap a ;обмен тетрадами
mov r4, a ;сохранили
mov a, @r0 ;взяли текущее значение памяти
anl a, #00001111b ;пишем в первую
orl a, r4
mov @r0, a
inc r0 ;переходим на след. полубайт
push acc
clr a
dec r2
e:
;mov r5, #20h
;умножение и последующая запись в память
push r0
mov r0, #20h
mov b, #53
pop acc
mul ab
mov @r0, a
pop r0
inc r5
ret
END