这段汇编代码无效吗?

时间:2013-01-24 05:00:14

标签: assembly x86 att addressing-mode

我正在试图弄清楚下面的汇编代码是否无效。

movb $0xF, (%bl)

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

2 个答案:

答案 0 :(得分:6)

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

为什么无效指令?那么,汇编指令无效的原因是对于给定的处理器没有这样的指令。没有可能的方法来编码该指令。在这种情况下(假设为x86),使用bl或任何其他8位寄存器都没有被认为是必要的。在16位代码中,只有16位寄存器bxbpsidi可用于存储器寻址。 Wikipedia has a useful list of all possible addressing modes(请注意使用英特尔语法,您的代码采用AT& T语法)。

修改:在AT& T语法中,b中的字母movb定义它处理的是8位操作数。

要获得或多或少的目标(使用bl进行寻址),您可以执行其中一项(这些是英特尔YASM / NASM语法,包括GNU .intel_syntax noprefix的MASM样式汇编程序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基数可能不为零。

答案 1 :(得分:0)

这个问题可能来自CSAPP的《练习问题3.3》。您不能将8位寄存器(%bl)用作AT&T组件上的地址寄存器(我不确定Intel的地址)。此外,不可能确定$ 0xF是8位,16位还是32位值。