这段汇编代码无效吗?
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 位寄存器 bx
、bp
、si
和 di
可用于内存寻址。 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 对这个问题的回答已经涵盖了这一点,请阅读。以上是关于这段汇编代码无效吗?的主要内容,如果未能解决你的问题,请参考以下文章