这段汇编代码无效吗?

Posted

技术标签:

【中文标题】这段汇编代码无效吗?【英文标题】:Is this piece of assembly code invalid? 【发布时间】:2013-01-24 05:00:13 【问题描述】:

我正在尝试确定以下汇编代码是否无效。

movb $0xF, (%bl)

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

【问题讨论】:

【参考方案1】:

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

为什么是无效指令?好吧,汇编指令无效的原因是给定处理器没有这样的指令。无法对这条指令进行编码。在这种情况下(假设 x86),使用bl 或任何其他 8 位寄存器都不是寻址的必要条件。在 16 位代码中,只有 16 位寄存器 bxbpsidi 可用于内存寻址。 Wikipedia has a useful list of all possible addressing modes(请注意它使用的是 Intel 语法,您的代码是 AT&T 语法)。

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

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

【讨论】:

您的答案可能是 register 而不是 processor 这就是我的想法,但不确定。谢谢!【参考方案2】:

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

【讨论】:

AT&T 和 Intel 语法都可以表达 x86 机器代码可以做的所有事情。这是一个硬件限制(不可编码),这就是汇编程序不接受它的原因。 此硬件限制是否也适用于 16 位寄存器,在本例中为 %bx? 仅在 64 位模式下。在 16 位和 32 位模式下,(%bx) 是有效的寻址模式。 nrz 对这个问题的回答已经涵盖了这一点,请阅读。

以上是关于这段汇编代码无效吗?的主要内容,如果未能解决你的问题,请参考以下文章

或者是无效的 C++:为啥这段代码会编译?

这段代码在哪里取消引用无效的迭代器? (C++)

联系表格发送时电子邮件无效

DotNetZip 异常错误状态(无效文字/长度代码)

是啥导致了这个“无效的游标状态”错误?

arm 组件 向量数无效