貌似这方面的代码都是这样,看了注释还是不懂,问了很多同学都说不懂,很着急啊!请问具体的原理是怎么样的啊!小弟不才,请多指教。。。。。里面的左移什么的到底是干嘛,为什么乘以二?
双字节十六进制整数转换成双字节BCD码整数
入口条件:待转换的双字节十六进制整数在R6、R7中。
出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
影响资源:PSW、A、R2~R7 堆栈需求: 2字节
HB2: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
------解决方案--------------------------------------------------------
16位数每循环左移出一位,进位加使16位数中的1就加到BCD寄存器,移下一位,相应的BCD数跟着左移一位(自加或乘的作用).以上经过16次循环就把R6R7中的16位数搬到BCD寄存器,但其间经过了十进制调整,结果就是BCD数了.
------解决方案--------------------------------------------------------
其實轉換后的BCD碼只是我們視覺上顯示的BCD碼,在程序內部還是用十六進制數字表示的。例如,我們想轉換100h(256)即R6=01H,R7=00H這個十六進制數變成BCD碼,轉換出來的結果實際上是R3=00h,R4=02h,R5=56h,所以最后的數是不一樣的。