我正在试图弄清楚下面的汇编代码是否无效。
movb $0xF, (%bl)
无效吗?如果是这样,为什么?感谢。
答案 0 :(得分:6)
你不会说什么处理器。 bl
至少在x86处理器中是一个8位寄存器,但它不能用于寻址。
为什么无效指令?那么,汇编指令无效的原因是对于给定的处理器没有这样的指令。没有可能的方法来编码该指令。在这种情况下(假设为x86),使用bl
或任何其他8位寄存器都没有被认为是必要的。在16位代码中,只有16位寄存器bx
,bp
,si
和di
可用于存储器寻址。 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位值。