--------------------------------
Author : ShawnDong
updateDate :2018.12.6
Blog : ShawnDong98.github.io
--------------------------------
这个题目一开始没看懂题目要求,后来看例程一头雾水,后来在自己写程序的过程中去理解例程的思路,慢慢就豁然开朗。
我觉得这个题目会感到吃力完全是因为自己太拙了。诸位看到这样的题目,应该会迎刃而解吧。
题目:设4位BCD码依次存放在内存RAM40H~43H单元的低四位,高四位都为0,要求将其转换为二进制数,结果存入R2R3中。
核心思想:一个十进制数可表示为:(...(Dn * 10^n + D(n-1))*10 + D(n-2) * 10 + ...) + D0
首先初始化
ORG 0000H
BCDHEX: MOV R0, #40H
MOV R1, #03
MOV A, @R0
MOV R3, A
注意:在该题目中R2用来保存高八位,R3用来保存低八位。A保存低八位,B保存高八位,搞清楚这点后。开始接下来的程序。
LOOP: MOV A, R3
MOV B, #10
MUL AB
MOV R3, A
将低八位乘10后,将计算结果的低八位存入R3
注意,接下来这段程序我理解了好久才明白什么意思,一开始一直很费解
MOV A, B
XCH A, R2
MOV B, #10
MUL AB
ADD A, R2
MOV R2, A
将低八位乘10后,将计算结果的低八位存入R3,然后将高八位的数据暂时存放在R2中,并把R2中的值给A,注意这时A中的值是上一次计算结果的高八位,在刚才的程序中,我们仅仅将低八位乘以了10,现在我们将高八位也乘以10,然后还需要将刚才低八位乘10后,计算结果的高八位加上,这才是真正一个二进制乘10的方法。
至此我们将上一次的计算结果乘以了10,也就是完成了Dn*10^n这一步。接下来就是加上Dn-1这个值,然后再循环就完成了这个题目,程序如下:
INC R0
MOV A, R3
ADD A, @R0
MOV R3, A
MOV A, R2
ADDC A, #0
MOV R2, A
DJNZ R1, LOOP
SJMP $
END
完整的程序如下:
ORG 0000H
BCDHEX: MOV R0, #40H
MOV R1, #03
MOV A, @R0
MOV R3, A
SOLVE: MOV A, R3
MOV B, #10
MUL AB
MOV R3, A
MOV A, B
XCH A, R2
MOV B, #10
MUL AB
ADD A, R2
MOV R2, A
INC R0
MOV A, R3
ADD A, @R0
MOV R3, A
MOV A, R2
ADDC A, #0
MOV R2, A
DJNZ R1, SOLVE
SJMP $
END
网友评论