我试图弄清楚以下汇编代码是否无效。
movb $0xF, (%bl)
无效吗?如果是这样,为什么?谢谢。
你不说什么处理器。bl
至少在 x86 处理器中是一个 8 位寄存器,但不能用于寻址。
为什么是无效指令?好吧,汇编指令无效的原因是给定处理器没有这样的指令。无法对这条指令进行编码。在这种情况下(假设 x86),使用bl
或任何其他 8 位寄存器既不用于寻址,也没有被认为是必要的。在 16 位代码中,只有 16 位寄存器、、bx
和可用于内存寻址。维基百科有一个有用的列表,列出了所有可能的寻址模式(请注意它使用的是 Intel 语法,您的代码是 AT&T 语法)。bp
si
di
编辑:在 AT&T 语法中,定义中的字母b
处理movb
8 位操作数。
要获得或多或少的目标(bl
用于寻址),您可以执行以下操作之一(这些是 Intel YASM/NASM 语法,MASM 风格的汇编器,包括 GNU .intel_syntax noprefix
want byte ptr
):
对于 16 位代码:
xor bh,bh
mov byte [bx], 0x0f
对于 32 位代码:
movzx ebx,bl
mov byte [ebx], 0x0f
对于 64 位代码:
movzx ebx,bl ; with implicit zero-extension to 64-bit
mov byte [rbx], 0x0f
您很少想将任何内容存储到 0..255(一个字节)的线性地址。在 64 位模式下,分段大部分被禁用,因此 DS 基数固定为 0,这绝对是指令正在执行的操作,但尤其是在 16 位模式下,DS 基数可能不为零。
这个问题可能来自CSAPP的书,练习题3.3。您不能使用 8 位寄存器 (%bl) 作为 AT&T 程序集上的地址寄存器(我不确定英特尔的)。此外,无法确定 $0xF 是 8、16 还是 32 位值。