在汇编中,为什么不能在不移位的情况下打印十六进制数?

Tas*_*dis 2 assembly emu8086

该代码取自在线示例。假设我有要在 DL 中打印的变量。

DISPLAY_HEX PROC NEAR
    MOV BL,DL   

    MOV BH,0    
    MOV CL,4    

    SHL BX,CL   
    MOV DL,BH   

    CALL ONE_DIGIT  

    MOV CL,4    
    SHR BL,CL   
    MOV DL,BL   

    CALL ONE_DIGIT  

    RET     
DISPLAY_HEX ENDP


ONE_DIGIT PROC NEAR

    CMP DL,9    
    JA LETTER   

    ADD DL,48
    JMP NEXT    

LETTER: ADD DL, 'A'-10  

NEXT:   MOV AH,02H  
    INT 21H 

END:    RET     
ONE_DIGIT ENDP
Run Code Online (Sandbox Code Playgroud)

为什么要轮班?不能像小数一样打印吗?另外,为什么这里同时使用SHRSHL ?

Mic*_*ael 5

在 base16(十六进制)中,您有 16 个可能的数字 ( 0..F),因此需要 4 位来表示一个十六进制数字 (log2(16) == 4)。0..F这里我谈论的是值( ,或以 10 为基数)意义上的数字0..15,而不是 ASCII 字符。

所以一个字节可以容纳两个十六进制数字。假设它DL包含以下位:(XXXXYYYY其中每个XY都是二进制 0 或 1)。

首先将 16 位寄存器BX左移 4 位。由(最低有效字节)和(最高有效字节)BX组成。已设置为 0,并且包含输入,因此在移位之前将包含位。移位后它将包含. 然后 的最高有效字节(即,现在包含)被移动到,转换为字符并打印。BLBHBHBLBX00000000XXXXYYYY0000XXXXYYYY0000
BXBH0000XXXXDL

对于第二部分BL,现在包含YYYY0000向右移动 4 位,得到0000YYYY。然后该值被转换为字符并打印。