1

我试图弄清楚以下汇编代码是否无效。

movb $0xF, (%bl)

无效吗?如果是这样,为什么?谢谢。

4

2 回答 2

7

你不说什么处理器。bl至少在 x86 处理器中是一个 8 位寄存器,但不能用于寻址。

为什么是无效指令?好吧,汇编指令无效的原因是给定处理器没有这样的指令。无法对这条指令进行编码。在这种情况下(假设 x86),使用bl或任何其他 8 位寄存器既不用于寻址,也没有被认为是必要的。在 16 位代码中,只有 16 位寄存器、、bx和可用于内存寻址。维基百科有一个有用的列表,列出了所有可能的寻址模式(请注意它使用的是 Intel 语法,您的代码是 AT&T 语法)。bpsidi

编辑:在 AT&T 语法中,定义中的字母b处理movb8 位操作数。

要获得或多或少的目标(bl用于寻址),您可以执行以下操作之一(这些是 Intel YASM/NASM 语法,MASM 风格的汇编器,包括 GNU .intel_syntax noprefixwant 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 基数可能不为零。

于 2013-01-24T05:41:27.697 回答
0

这个问题可能来自CSAPP的书,练习题3.3。您不能使用 8 位寄存器 (%bl) 作为 AT&T 程序集上的地址寄存器(我不确定英特尔的)。此外,无法确定 $0xF 是 8、16 还是 32 位值。

于 2018-10-02T15:46:38.763 回答