当我尝试编译以下程序时:
.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 值,您可以执行以下任一操作:
movswl %ax, %ebx # 符号扩展转换(Intel 语法中的 movsx)
movzwl %ax, %ebx # 零扩展转换(Intel 语法中的 movzx)
在 1. 中,ebx
(以及 bx
和 bl
)将包含 -23
。
2. ebx
将包含 0x0000FFE9,因此 ebx
将是 65513
、bx
和 bl<如果被视为有符号整数,
将为 -23
。或者当被视为无符号整数时,65513
表示 bx
和 bl
中的 233
。
关于这本书...你确定吗?再仔细读一遍,一定是拼写错误,或者你忽略了一些微小的细节。
关于assembly - `mov' 的指令后缀无效(movw %ax、%ebx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38329831/