这段汇编代码无效吗?

amo*_*luc 0 x86 assembly att addressing-mode

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

movb $0xF, (%bl)
Run Code Online (Sandbox Code Playgroud)

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

nrz*_*nrz 6

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

为什么无效指令?那么,汇编指令无效的原因是给定处理器没有这样的指令.没有可能的方法来编码该指令.在这种情况下(假设为x86),使用bl或任何其他8位寄存器都不被认为是必要的.在16位的代码唯一的16位寄存器bx,bp,sidi可用于存储器寻址.维基百科有一个有用的列表,列出了所有可能的寻址模式(请注意它是使用英特尔语法,您的代码是AT&T语法).

编辑:在AT&T语法信bmovb定义它用8位操作数的交易.

为了获得或多或少的目标(bl用于寻址),你可以做其中一个(这些是英特尔YASM/NASM语法,包括GNU .intel_syntax noprefix想要的MASM风格的汇编程序byte ptr):

对于16位代码:

xor   bh,bh
mov   byte [bx], 0x0f
Run Code Online (Sandbox Code Playgroud)

对于32位代码:

movzx  ebx,bl
mov    byte [ebx], 0x0f
Run Code Online (Sandbox Code Playgroud)

对于64位代码:

movzx  ebx,bl               ; with implicit zero-extension to 64-bit
mov    byte [rbx], 0x0f
Run Code Online (Sandbox Code Playgroud)

您很少想要将任何内容存储到0..255(一个字节)的线性地址.在64位模式中,主要禁用分段,因此DS基址固定为0,这绝对是指令正在执行的操作,但特别是在16位模式下,DS基数可能为非零.