当前位置: 代码迷 >> 汇编语言 >> 那位能讲讲16位二进制转BCD码的原理,小弟我有代码但看不懂
  详细解决方案

那位能讲讲16位二进制转BCD码的原理,小弟我有代码但看不懂

热度:8350   发布时间:2013-02-26 00:00:00.0
那位能讲讲16位二进制转BCD码的原理,我有代码但看不懂
貌似这方面的代码都是这样,看了注释还是不懂,问了很多同学都说不懂,很着急啊!请问具体的原理是怎么样的啊!小弟不才,请多指教。。。。。里面的左移什么的到底是干嘛,为什么乘以二?
双字节十六进制整数转换成双字节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,所以最后的數是不一樣的。
  相关解决方案