【问题标题】:Is this piece of assembly code invalid?这段汇编代码无效吗?
【发布时间】:2023-03-14 06:15:01
【问题描述】:

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

movb $0xF, (%bl)

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

【问题讨论】:

    标签: assembly x86 att addressing-mode


    【解决方案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 对这个问题的回答已经涵盖了这一点,请阅读。
    猜你喜欢
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    相关资源
    最近更新 更多