当我尝试编译以下程序时:
.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)
答案 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值,可以执行以下任一操作:
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
将为65513
。当被视为无符号整数时,或bx
中的233
和bl
中的{"test1": "Test 1", "test2": {"test3": "Test 3"}}
。
关于这本书...你确定吗?再次仔细阅读,必须是一个错字,或者你忽略了一些微小的细节。