gpt4 book ai didi

assembly - 在汇编中为什么不移位就不能打印十六进制数?

转载 作者:行者123 更新时间:2023-12-02 09:29:26 25 4
gpt4 key购买 nike

此代码取自在线示例。假设我有要在我的 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

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

最佳答案

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

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

首先将 16 位寄存器 BX 向左移动 4 位。 BXBL(最低有效字节)和BH(最高有效字节)组成。 BH 已设置为 0,并且 BL 包含输入,因此在移位之前 BX 将包含位 00000000XXXXYYYY。转换后它将包含 0000XXXXYYYY0000
然后 BX 的最高有效字节(即 BH,现在包含 0000XXXX)被移动到 DL,转换到一个字符,并打印出来。

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

关于assembly - 在汇编中为什么不移位就不能打印十六进制数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34694013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com