zoukankan      html  css  js  c++  java
  • asm51汇编子程序(有关多字节无符号整数bcd码运算部分)

    ;==============================================================================
    ;多字节二进制整数转换为十进制整数子程序NIBTD
    ;入口:R0指向多字节二进制整数高位,R1指向结果多字节十进制整数高位,R7=n
    ;使用A,B,R0~R7,影响CY
    ;==============================================================================
    NIBTD:          MOV     A,R0
                    MOV     R5,A
                    MOV     A,R1
                    MOV     R6,A
                    MOV     A,R7
                    MOV     R3,A
                    CLR     A
    NBD0:           MOV     @R1,A
                    INC     R1
                    DJNZ    R3,NBD0
                    MOV     A,R7
                    MOV     B,#8
                    MUL     AB
                    MOV     R3,A
    NBD4:           MOV     A,R5
                    ADD     A,R7
                    DEC     A
                    MOV     R0,A
                    MOV     A,R7
                    MOV     R2,A
                    CLR     C
    NBD1:           MOV     A,@R0
                    RLC     A
                    MOV     @R0,A
                    DEC     R0
                    DJNZ    R2,NBD1
                    PUSH    PSW
                    MOV     A,R6
                    ADD     A,R7
                    DEC     A
                    MOV     R1,A
                    POP     PSW
                    MOV     A,R7
                    MOV     R2,A
    NBD3:           MOV     A,@R1
                    ADDC    A,@R1
                    DA      A
                    MOV     @R1,A
                    DEC     R1
                    DJNZ    R2,NBD3
                    DJNZ    R3,NBD4
                    RET
    ;==============================================================================

    ;==============================================================================
    ;多字节十进制整数转换为二进制整数子程序NIDTB
    ;入口:R0指向多字节十进制整数高位,R1指向结果多字节二进制整数高位,R7=n
    ;使用A,B,R0~R7,影响CY
    ;==============================================================================
    NIDTB:          MOV     A,R1
                    MOV     R6,A
                    MOV     A,R7
                    MOV     R3,A
                    CLR     A
    NDB0:           MOV     @R1,A
                    INC     R1
                    DJNZ    R3,NDB0
                    MOV     A,R7
                    MOV     R3,A
    NDB3:           CALL   NDB1
                    MOV     A,@R0
                    ANL     A,#0F0H
                    SWAP    A
                    CALL   NDB2
                    CALL   NDB1
                    MOV     A,@R0
                    ANL     A,#0FH
                    CALL   NDB2
                    INC     R0
                    DJNZ    R3,NDB3
                    RET
    NDB1:           MOV     A,R7
                    MOV     R4,A
                    MOV     A,R6
                    ADD     A,R7
                    DEC     A
                    MOV     R1,A
                    CLR     C
                    MOV     R2,#0
    NDB4:           MOV     A,@R1
                    MOV     B,#10
                    PUSH    PSW
                    MUL     AB
                    POP     PSW
                    ADDC    A,R2
                    MOV     @R1,A
                    MOV     R2,B
                    DEC     R1
                    DJNZ    R4,NDB4
                    RET
    NDB2:           MOV     R5,A
                    MOV     A,R6
                    ADD     A,R7
                    DEC     A
                    MOV     R1,A
                    MOV     A,R7
                    MOV     R4,A
                    MOV     A,R5
                    ADD     A,@R1
                    MOV     @R1,A
                    DEC     R1
                    DJNZ    R4,NDB5
                    RET
    NDB5:           MOV     A,@R1
                    ADDC    A,#0
                    MOV     @R1,A
                    DEC     R1
                    DJNZ    R4,NDB5
                    RET
    ;==============================================================================

    ;==============================================================================
    ;单字节BCD码转换成压缩BCD码子程序BCDC
    ;入口:R0指向2n个单字节高位,R1指向n个双字节高位,R3=n
    ;使用A,R0,R1,R3
    ;==============================================================================
    BCDC:           MOV     A,@R0
                    SWAP    A
                    INC     R0
                    ORL     A,@R0
                    MOV     @R1,A
                    INC     R0
                    INC     R1
                    DJNZ    R3,BCDC
                    RET
    ;==============================================================================

    ;==============================================================================
    ;压缩BCD码转换成单字节BCD码子程序CBCD
    ;入口:R0指向n个双字节高位,R1指向2n个单字节高位,R3=n
    ;使用A,R0,R1,R3
    ;==============================================================================
    CBCD:           MOV     A,@R0
                    SWAP    A
                    ANL     A,#0FH
                    MOV     @R1,A
                    INC     R1
                    MOV     A,@R0
                    ANL     A,#0FH
                    MOV     @R1,A
                    INC     R0
                    INC     R1
                    DJNZ    R3,CBCD
                    RET
    ;==============================================================================

    ;==============================================================================
    ;多字节十进制加法子程序CADD
    ;入口:RO指向被加数n字节压缩BCD码高位,R1指向加数n字节压缩BCD码高位,R3=n
    ;结果:和数压缩BCD码放入R0指向的n个字节
    ;使用A,R0,R1,R3,影响CY
    ;==============================================================================
    CADD:           MOV     A,R0
                    ADD     A,R3
                    DEC     A
                    MOV     R0,A
                    MOV     A,R1
                    ADD     A,R3
                    DEC     A
                    MOV     R1,A
                    CLR     C
    CADL:           MOV     A,@R0
                    ADDC    A,@R1
                    DA      A
                    MOV     @R0,A
                    DEC     R0
                    DEC     R1
                    DJNZ    R3,CADL
                    RET
    ;==============================================================================

    ;==============================================================================
    ;多字节十进制减法子程序CSUB1
    ;入口:RO指向被减数n字节压缩BCD码高位,R1指向减数n字节压缩BCD码高位,R3=n
    ;结果:差数压缩BCD码放入R0指向的n个字节
    ;使用A,R0,R1,R3,影响CY,CY=1结果为正;CY=0结果为负
    ;==============================================================================
    CSUB1:          MOV     A,R0
                    ADD     A,R3
                    DEC     A
                    MOV     R0,A
                    MOV     A,R1
                    ADD     A,R3
                    DEC     A
                    MOV     R1,A
                    SETB    C
    CSUL1:          CLR     A
                    ADDC    A,#99H
                    SUBB    A,@R1
                    ADD     A,@R0
                    DA      A
                    MOV     @R0,A
                    DEC     R0
                    DEC     R1
                    DJNZ    R3,CSUL1
                    RET
    ;==============================================================================

    ;==============================================================================
    ;多字节十进制乘法子程序CMUL
    ;入口:RO指向被乘数n字节压缩BCD码高位,R1指向乘数n字节压缩BCD码高位,R3=n
    ;结果:积数压缩BCD码放入R0指向的2n个字节
    ;使用A,R0,R1,R2,R3,R6,R7,影响CY
    ;==============================================================================
    CMUL:           MOV     A,R3
                    MOV     R6,A
                    ADD     A,R3
                    MOV     R2,A
                    MOV     A,R1
                    ADD     A,R3
                    DEC     A
                    MOV     R1,A
                    MOV     A,R0
                    ADD     A,R3
                    MOV     R0,A
                    CLR     A
    CMUL1:          MOV     @R0,A
                    INC     R0
                    DJNZ    R6,CMUL1
                    DEC     R0
                    MOV     A,R2
                    MOV     R6,A
    CMUL2:          CLR     A
    CMUL3:          XCH     A,@R0
                    SWAP    A
                    XCHD    A,@R0
                    XCH     A,@R0
                    DEC     R0
                    DJNZ    R2,CMUL3
                    MOV     R7,A
                    JZ      CMUL7
    CMUL4:          MOV     A,R3
                    MOV     R2,A
                    ADD     A,R3
                    ADD     A,R0
                    MOV     R0,A
                    CLR     C
    CMUL5:          MOV     A,@R0
                    ADDC    A,@R1
                    DA      A
                    MOV     @R0,A
                    DEC     R0
                    DEC     R1
                    DJNZ    R2,CMUL5
                    MOV     A,R3
                    MOV     R2,A
    CMUL6:          CLR     A
                    ADDC    A,@R0
                    DA      A
                    MOV     @R0,A
                    DEC     R0
                    DJNZ    R2,CMUL6
                    MOV     A,R1
                    ADD     A,R3
                    MOV     R1,A
                    DJNZ    R7,CMUL4
    CMUL7:          MOV     A,R3
                    ADD     A,R3
                    MOV     R2,A
                    ADD     A,R0
                    MOV     R0,A
                    DJNZ    R6,CMUL2
                    RET
    ;==============================================================================

    ;==============================================================================
    ;多字节十进制除法子程序CDIV
    ;入口:RO指向被除数2n字节压缩BCD码高位,R1指向除数n字节压缩BCD码高位,R3=n
    ;结果:商数压缩BCD码放入R0+n指向的n个字节中,余数压缩BCD码放入R0指向的n个字节
    ;使用A,R0,R1,R2,R3,R4,R6,R7,影响CY,CY=1结果溢出
    ;==============================================================================
    CDIV:           MOV     A,R3
                    ADD     A,R3
                    MOV     R7,A
                    DEC     R0
                    DEC     R1
    CDIV1:          MOV     A,R3
                    ADD     A,R3
                    MOV     R2,A
                    ADD     A,R0
                    MOV     R0,A
                    CLR     A
    CDIV2:          XCH     A,@R0
                    SWAP    A
                    XCHD    A,@R0
                    XCH     A,@R0
                    DEC     R0
                    DJNZ    R2,CDIV2
                    MOV     R4,A
    CDIV3:          MOV     A,R3
                    MOV     R6,A
                    ADD     A,R0
                    MOV     R0,A
                    ADD     A,R3
                    XCH     A,R0
                    INC     @R0               
                    XCH     A,R0
                    MOV     A,R1
                    ADD     A,R3
                    MOV     R1,A
                    SETB    C
    CDIV4:          CLR     A
                    ADDC    A,#99H
                    SUBB    A,@R1
                    ADD     A,@R0
                    DA      A
                    MOV     @R0,A
                    DEC     R0
                    DEC     R1
                    DJNZ    R6,CDIV4
                    CPL     C
                    MOV     A,R4
                    SUBB    A,#0
                    MOV     R4,A

                    JC      CDIV6
    ;--------------------------------------------------------------------
    ;FOR OVER
                    MOV     A,R0
                    PUSH    ACC
                    ADD     A,R3
                    ADD     A,R3
                    MOV     R0,A
                    MOV     A,@R0
                    CJNE    A,#10,CDIV_NO_OVER
                    POP     ACC
                    MOV     @R0,#99H
                    SETB    C
                    RET
    CDIV_NO_OVER:   POP     ACC
                    MOV     R0,A
                    SJMP    CDIV3
    ;--------------------------------------------------------------------
    CDIV6:          MOV     A,R3
                    MOV     R6,A
                    ADD     A,R0
                    MOV     R0,A
                    ADD     A,R3
                    XCH     A,R0
                    DEC     @R0
                    XCH     A,R0
                    MOV     A,R1
                    ADD     A,R3
                    MOV     R1,A
                    CLR     C
    CDIV5:          MOV     A,@R0
                    ADDC    A,@R1
                    DA      A
                    MOV     @R0,A
                    DEC     R0
                    DEC     R1
                    DJNZ    R6,CDIV5
                    DJNZ    R7,CDIV1
                    CLR     C
                    RET
    ;==============================================================================
  • 相关阅读:
    Android标题栏最右边添加按钮
    Activity标题栏添加返回按钮
    【Android】解决Android横竖屏切换数据丢失问题的方法
    Android热更新,到底是更新啥?
    vm ware 虚拟WIN10 时,chrome ,cent browser 显示异常,花屏
    动态生成的 select option 无法选中,设置值
    安装sql 2012 时遇到“需要更新的以前的 Visual Studio 2010 实例。”规则失败。
    C#.NET 简单使用log4net
    10位,13位时间戳转为C#格式时间
    C# .NET Unix 时间戳
  • 原文地址:https://www.cnblogs.com/cloudstep/p/1514686.html
Copyright © 2011-2022 走看看