2014-11-06 105 views
0
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編號轉換爲二進制數的程序的一部分。任何人都可以請解釋這背後的邏輯?說明,我可以通過查看互聯網瞭解,但是這樣做的邏輯/算法?謝謝!BCD到彙編語言的二進制轉換

回答

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位開始)後跟一個空格。

+0

'MOV DL,'0'SAL DH,1 ADC DL,0'這是如何顯示結果的?因爲在將bcd轉換爲二進制時,數字除以2,然後記錄餘數。但是,這裏是左移。這是爲什麼? – teesto 2014-11-06 06:28:43

+0

@teesto:如果您除以2並使用餘數(右移並使用進位),您最終會輸入錯誤順序的數字。如果乘以2並使用溢出(左移並使用進位),則按照正確的順序結束數字。 – Brendan 2014-11-06 13:48:47

+0

@teesto:'adc dl,0'就像「DL = DL + 0 + carry」。如果進位清零,則不改變DL,並且如果進位被設置,則DL增加。 – Brendan 2014-11-06 13:50:17