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

2018-12-06  本文已影响0人  狐二丶
--------------------------------
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
上一篇下一篇

猜你喜欢

热点阅读