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

时间:2016-07-12 13:08:07

标签: assembly x86 gas

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

.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'

所以,proglem的根源在于:

movw        %ax,  %ebx

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

1 个答案:

答案 0 :(得分:4)

你没有写,你想用该程序做什么。

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

为了使其有效,有两个基本选项。

  • 如果您只需要修改ebx的16b(来自ax的16b),则可以执行mov %ax, %bx,保持ebx的高16b不变。 (在您的情况下,结果将是-23中的ebx/bx/bl

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

    1. movswl %ax, %ebx # sign-extended conversion (movsx in Intel syntax)
    2. movzwl %ax, %ebx # zero-extended conversion (movzx in Intel syntax)

在1. ebx(以及bxbl)将包含-23。 在2. ebx将包含0x0000FFE9,因此如果将ebx视为有符号整数,则65513将为bxbl-23将为65513 。当被视为无符号整数时,或bx中的233bl中的{"test1": "Test 1", "test2": {"test3": "Test 3"}}

关于这本书...你确定吗?再次仔细阅读,必须是一个错字,或者你忽略了一些微小的细节。