用汇编语言进行BCD到二进制转换

时间:2014-11-06 05:53:56

标签: assembly

 BCD2BIN PROC

      PUSH AX
      PUSH CX
      PUSH BX
      PUSH DX
      PUSH SI

      MOV CL,08H

    LB : 
        SAL DH,1
           JC PRTONE
           CMP CL,04H
           JG SKP3
           MOV DL,48
           MOV AH,02H
           INT 21H
           JMP SKP3

    PRTONE: CMP CL,04H
            JG SKP3
            MOV DL,49
            MOV AH,02H
            INT 21H

    SKP3:  DEC CL
           CMP CL,00H
           JE SKP4
           JMP 040H


    SKP4:   MOV DL,' '
            MOV AH,02H
            INT 21H
            POP SI
              POP DX
              POP BX
              POP CX
              POP AX

            RET  



    BCD2BIN ENDP

这是将bcd数转换为二进制数的程序的一部分。任何人都可以解释一下这背后的逻辑吗?我可以通过查看互联网了解这些说明,但这样做的逻辑/算法是什么?谢谢!

1 个答案:

答案 0 :(得分:0)

这段代码设计得很糟糕(比必要的慢,而且比必要的读取更难)。它等同于:

    PUSH AX
    PUSH CX
    PUSH BX
    PUSH DX
    PUSH SI

    MOV CL,04H
    SAL DH,4

LB: 
    SAL DH,1
    JC PRTONE

    MOV DL,'0'
    MOV AH,02H
    INT 21H
    JMP SKP3

PRTONE:
    MOV DL,'1'
    MOV AH,02H
    INT 21H

SKP3:
    DEC CL
    JNE LB


    MOV DL,' '
    MOV AH,02H
    INT 21H

    POP SI
    POP DX
    POP BX
    POP CX
    POP AX
    RET  

..可以进一步改进:

    PUSH AX
    PUSH CX
    PUSH BX
    PUSH DX
    PUSH SI

    MOV CL,04H
    SAL DH,4

LB: 
    MOV DL,'0'
    SAL DH,1
    ADC DL,0
    MOV AH,02H
    INT 21H

    DEC CL
    JNE LB

    MOV DL,' '
    MOV AH,02H
    INT 21H

    POP SI
    POP DX
    POP BX
    POP CX
    POP AX
    RET  

..可以展开:

    PUSH AX
    PUSH CX
    PUSH BX
    PUSH DX
    PUSH SI

    MOV DL,'0'
    SAL DH,5
    ADC DL,0
    MOV AH,02H
    INT 21H             ;Display bit 3 as '0' or '1'

    MOV DL,'0'
    SAL DH,1
    ADC DL,0
    MOV AH,02H
    INT 21H             ;Display bit 2 as '0' or '1'

    MOV DL,'0'
    SAL DH,1
    ADC DL,0
    MOV AH,02H
    INT 21H             ;Display bit 1 as '0' or '1'

    MOV DL,'0'
    SAL DH,1
    ADC DL,0
    MOV AH,02H
    INT 21H             ;Display bit 0 as '0' or '1'

    MOV DL,' '
    MOV AH,02H
    INT 21H             ;Display a space

    POP SI
    POP DX
    POP BX
    POP CX
    POP AX
    RET  

基本上,它所做的只是打印4个二进制数字(来自DH的最低4位),然后是空格。