2014-11-06 8 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 

..which могут быть улучшены более:

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 

..which может раскатывают:

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 бинарная цифр (от младших 4 бит DH), за которым следует пробел.

+0

'MOV DL, '0' SAL DH, 1 ADC DL, 0' Как это используется для отображения результата? Поскольку, преобразовывая bcd в двоичный, число делится на 2, а затем записывается остаток. Но здесь он сдвинут с места. Почему это? – teesto

+0

@teesto: Если вы разделите на 2 и используйте остаток (сдвиг вправо и используйте перенос), вы получите цифры в неправильном порядке. Если умножить на 2 и использовать переполнение (сдвиг влево и использовать перенос), вы получите цифры в правильном порядке. – Brendan

+0

@teesto: 'adc dl, 0' подобен« DL = DL + 0 + carry ». Если перенос четкий, то он не изменяет DL, и если перенос установлен, DL увеличивается. – Brendan

Смежные вопросы