该代码取自在线示例。假设我有要在 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)
为什么要轮班?不能像小数一样打印吗?另外,为什么这里同时使用SHR和SHL ?
在 base16(十六进制)中,您有 16 个可能的数字 ( 0..F),因此需要 4 位来表示一个十六进制数字 (log2(16) == 4)。0..F这里我谈论的是值( ,或以 10 为基数)意义上的数字0..15,而不是 ASCII 字符。
所以一个字节可以容纳两个十六进制数字。假设它DL包含以下位:(XXXXYYYY其中每个X和Y都是二进制 0 或 1)。
首先将 16 位寄存器BX左移 4 位。由(最低有效字节)和(最高有效字节)BX组成。已设置为 0,并且包含输入,因此在移位之前将包含位。移位后它将包含.
然后 的最高有效字节(即,现在包含)被移动到,转换为字符并打印。BLBHBHBLBX00000000XXXXYYYY0000XXXXYYYY0000BXBH0000XXXXDL
对于第二部分BL,现在包含YYYY0000向右移动 4 位,得到0000YYYY。然后该值被转换为字符并打印。