无法调整说明

问题描述

我想知道为什么可以推断出一些组装说明,而另一些则不能。例如,在下面的程序中,我有

.globl main
main:
    push %rbp
    mov %rsp,%rbp
    mov $8,-8(%rbp)
    mov -8(%rbp),%rax
    pop %rbp
    ret

我收到以下错误

stack.s:5:错误:没有给出指令助记符后缀,也没有寄存器操作数;无法调整指令大小

但是,如果我更改:将第5行更改为:

movq $8,-8(%rbp)

它运行没有错误。其他所有操作如何推断大小,而该特定指令却无法推断出大小?

解决方法

提示在消息中:“没有寄存器操作数”。

所有其他指令都有一个寄存器作为操作数,汇编器知道寄存器的大小。因此,例如,mov %rax,-8(%rbp)必须是四字移动(8字节),因为%rax是64位寄存器。同样,mov %eax,-8(%rbp)mov %ax,-8(%rbp)mov %al,-8(%rbp)将是长字/字/字节移动(4/2/1字节)。因此,这些说明的大小后缀是可选的。

但是立即数$8没有固有的大小,因此,除非您告诉它,否则汇编器无法知道所需的大小。