问题描述
我想知道为什么可以推断出一些组装说明,而另一些则不能。例如,在下面的程序中,我有:
.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
没有固有的大小,因此,除非您告诉它,否则汇编器无法知道所需的大小。