【嵌入式&物联网】记一次汇编题目

Posted by ShawnD on December 6, 2018

这个题目一开始没看懂题目要求,后来看例程一头雾水,后来在自己写程序的过程中去理解例程的思路,慢慢就豁然开朗。 我觉得这个题目会感到吃力完全是因为自己太拙了。诸位看到这样的题目,应该会迎刃而解吧。

题目:设4位BCD码依次存放在内存RAM40H~43H单元的低四位,高四位都为0,要求将其转换为二进制数,结果存入R2R3中。

核心思想:一个十进制数可表示为:(…(Dn * 10^n + D(n-1))*10 + D(n-2) * 10 + …) + D0

首先初始化

1
2
3
4
5
6
		ORG 0000H

BCDHEX:		MOV R0, #40H
		MOV R1, #03
		MOV A, @R0
		MOV R3, A

注意:在该题目中R2用来保存高八位,R3用来保存低八位。A保存低八位,B保存高八位,搞清楚这点后。开始接下来的程序。

1
2
3
4
LOOP:		MOV A, R3
		MOV B, #10
		MUL AB
		MOV R3, A

将低八位乘10后,将计算结果的低八位存入R3 注意,接下来这段程序我理解了好久才明白什么意思,一开始一直很费解

1
2
3
4
5
6
        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这个值,然后再循环就完成了这个题目,程序如下:

1
2
3
4
5
6
7
8
9
10
		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

完整的程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
		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