`mov' 的指令后缀无效(movw %ax, %ebx)
invalid instruction suffix for `mov' (movw %ax, %ebx)
当我尝试编译以下程序时:
.globl _start
.section .text
_start: movw $-23, %ax
movl $-1, %ebx # -1 = [=10=]xffffffff
movw %ax, %ebx
movl , %eax
movl [=10=], %ebx
int [=10=]x80
我收到此错误消息:
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
,保留 [=13] 的高 16b =] 完好无损。 (在您的情况下,结果将是 ebx/bx/bl
中的 -23
)。
如果您想将 16b 值扩展为 32b 值,您可以执行以下任一操作:
movswl %ax, %ebx # sign-extended conversion (movsx in Intel syntax)
movzwl %ax, %ebx # zero-extended conversion (movzx in Intel syntax)
在 1. ebx
(以及 bx
和 bl
)中将包含 -23
。
在 2. ebx
将包含 0x0000FFE9,因此 ebx
将是 65513
,bx
并且 bl
将是 -23
如果被视为有符号整数.或者 bx
的 65513
和 bl
中的 233
当被视为无符号整数时。
关于这本书...你确定吗?再仔细读一遍,一定是打错了,或者你忽略了一些小细节。
当我尝试编译以下程序时:
.globl _start
.section .text
_start: movw $-23, %ax
movl $-1, %ebx # -1 = [=10=]xffffffff
movw %ax, %ebx
movl , %eax
movl [=10=], %ebx
int [=10=]x80
我收到此错误消息:
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
,保留 [=13] 的高 16b =] 完好无损。 (在您的情况下,结果将是ebx/bx/bl
中的-23
)。如果您想将 16b 值扩展为 32b 值,您可以执行以下任一操作:
movswl %ax, %ebx # sign-extended conversion (movsx in Intel syntax)
movzwl %ax, %ebx # zero-extended conversion (movzx in Intel syntax)
在 1. ebx
(以及 bx
和 bl
)中将包含 -23
。
在 2. ebx
将包含 0x0000FFE9,因此 ebx
将是 65513
,bx
并且 bl
将是 -23
如果被视为有符号整数.或者 bx
的 65513
和 bl
中的 233
当被视为无符号整数时。
关于这本书...你确定吗?再仔细读一遍,一定是打错了,或者你忽略了一些小细节。