有一个汇编语言命令:
add dl, 48d
Run Code Online (Sandbox Code Playgroud)
这段汇编语言语句的确切目的和含义是什么?当我写代码的时候
mov al, 02
mov dl, al
mov ah, 02
int 21h
Run Code Online (Sandbox Code Playgroud)
它给出的输出为b. 但当我写作时,
mov al, 02
mov dl, al
add dl, 48d
mov ah, 02
int 21h
Run Code Online (Sandbox Code Playgroud)
它2作为输出给出。这个声明到底在做什么?
看起来像 x86 汇编程序。该命令将 (E)DX 寄存器的低 8 位内容加 48(十进制 48)。请参阅x86 通用寄存器,但有关真正的解释,请参阅x86 维基百科页面的“x86 寄存器”部分。
在 x86 上,您可以访问寄存器的部分内容。从历史上看,这样做是为了使 8086(16 位寄存器)尽可能与 8080(8 位寄存器)兼容。然后该方案在具有 32 位寄存器的 80286/80386 上进行了扩展,然后在 AMD x64 模式下再次扩展到 64 位。
因此,您可以将整个 32 位寄存器作为 EDX 访问(在保护模式下),将低 16 位寄存器作为 DX 访问。现在这个16位部分(DX)进一步分为两部分:高8位作为DH访问,低8位作为DL访问。
编辑问题后进行编辑:
让我们从后到前解释一下引用的代码:最后调用了中断21hex,该中断在IBM PC兼容系统上负责各种DOS API调用。将 8 位寄存器 AH 设置为 2 会导致执行字符输出。要输出的字符驻留在 8 位寄存器 DL 中。
因此,在您的第一个示例中,打印了ASCII 字符02,但这是一个控制字符,因此输出不应该b像您所说的那样,而是不可见的内容(02 是text 的开始)。第二个示例采用 2,然后加上 48,得到 50(十进制)。这是字符 的 ASCII 代码2。
天啊,我现在真的感觉自己老了……我20年前就干过这种事了。