问题描述
我需要做这个任务:
在8051汇编程序中编写程序,将内存范围30H – 3FH复制到内存范围40H – 4FH,将奇数值原样复制,偶数值转换为BCD格式。不要使用任何子程序。
现在我有一个程序可以保存奇数但跳过偶数:
MOV R0,#30H
MOV R1,#40H
LOOP:
MOV A,@R0
ANL A,#00000001B
JZ NOT_INTERESTED
MOV A,@R0
MOV @R1,A
INC R1
NOT_INTERESTED:
INC R0
CJNE R0,#40H,LOOP
我有一个将值转换为 BCD 的程序:
MOV 30H,#63
MOV A,30H
CALL HEX_2_BCD
MOV 31H,A
HEX_2_BCD:
MOV B,#10
DIV AB
SWAP A
ADD A,B
RET
您知道我如何将它们组合起来以获得所需的结果吗?
解决方法
MOV 30H,#63
MOV A,30H
CALL HEX_2_BCD
MOV 31H,A
HEX_2_BCD:
MOV B,#10
DIV AB
SWAP A
ADD A,B
RET
转换为 BCD 的代码是错误的。从 CALL HEX_2_BCD
返回后,A
寄存器保存 BCD。很好,但是代码不必要地落入了转换代码中。这不是很有示范意义。尽管如此,您可以从中提取执行 BCD 转换的基本指令:
MOV B,#10
DIV AB
SWAP A
ADD A,B
因为在新程序中,源范围中的每个字节都必须写入目标范围,所以如果我们有条件地跳转到具有奇数值且可以不加修改地写入的字节,将是最简单的。
此外,如果我们稍微修改偶数/奇数的测试,我们就不必重新加载 A
寄存器。请记住,A
寄存器是一个特殊功能寄存器,其位可以位寻址,使用位地址 0E0h 到 0E7h。
MOV R0,#30h
MOV R1,#40h
Loop:
MOV A,@R0 ; Read from source
JB 0E0h,IsOdd ; Go write unmodified
IsEven:
...
IsOdd:
MOV @R1,A ; Write to destination
INC R1
INC R0
CJNE R0,#40h,Loop
验证您要转换为 BCD 的数字是否小于 100 可能是个好主意,否则转换后的结果将毫无价值!