assembly - `mov' 的指令后缀无效(movw %ax、%ebx)

标签 assembly x86 gnu-assembler

当我尝试编译以下程序时:

.globl _start
.section    .text

_start:     movw        $-23, %ax
            movl        $-1,  %ebx   # -1 = $0xffffffff
            movw        %ax,  %ebx

            movl        $1, %eax
            movl        $0, %ebx
            int         $0x80

我收到此错误消息:

demo.s: Assembler messages:
demo.s:7: Error: invalid instruction suffix for `mov'

所以,问题的根源在于:

movw        %ax,  %ebx

但问题是,我不认为我所做的事情是完全错误的,而且这是我当前正在阅读的书中使用的示例:Professional Assembly Language by Richard Blum (2005)

最佳答案

你没有写出你想用这个程序做什么。

首先将 -23 放入 ax 中,然后将 -1 放入 ebx 中,然后尝试移动ax 转换为 ebx,这在 x86 处理器上无效,因为 ax 是 16 位,而 ebx 是 32 位寄存器。 mov 在处理过程中无法转换数据的宽度。

要使其正常工作,有两个基本选项。

  • 如果您只想修改 ebx 的低 16b(从 ax 修改 16b),您可以执行 mov %ax, %bx,保持 ebx 的高 16b 完整。 (在您的情况下,ebx/bx/bl 中的结果将为 -23)。

  • 如果您想将 16b 值扩展为 32b 值,您可以执行以下任一操作:

    1. movswl %ax, %ebx # 符号扩展转换(Intel 语法中的 movsx)
    2. movzwl %ax, %ebx # 零扩展转换(Intel 语法中的 movzx)

在 1. 中,ebx(以及 bxbl)将包含 -23。 2. ebx 将包含 0x0000FFE9,因此 ebx 将是 65513bxbl<如果被视为有符号整数, 将为 -23。或者当被视为无符号整数时,65513 表示 bxbl 中的 233

关于这本书...你确定吗?再仔细读一遍,一定是拼写错误,或者你忽略了一些微小的细节。

关于assembly - `mov' 的指令后缀无效(movw %ax、%ebx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38329831/

相关文章:

linux - 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

linux - 使用 x64 汇编代码的基本输入

linux - eax 是否始终且仅存储系统调用?

c++ - LLVM 上的内联 ASM 中的 "Invalid symbol redefinition"

windows - 如何在程序集中打开目录中的文件

assembly - 字符串打印机不打印换行符

c - 弹出 x86 堆栈以访问函数 arg 时出现段错误

c# - 为什么.NET Native 以相反的顺序编译循环?

assembly - 如何连接不在宏定义中的标签? (在 GAS 汇编器中)

c - outb 宏中的 GCC 错误消息