我想知道为什么有些汇编指令可以推断,但其他的则不能。例如,在以下程序中我有:
.globl main
main:
push %rbp
mov %rsp, %rbp
mov $8, -8(%rbp)
mov -8(%rbp), %rax
pop %rbp
ret
我收到以下错误:
stack.s:5: 错误:没有给出指令助记符后缀,也没有寄存器操作数;无法调整尺寸指令
但是,如果我将:第五行更改为:
movq $8, -8(%rbp)
它运行没有错误。所有其他操作如何推断出大小,而该特定指令却不能?
提示在消息中:“无寄存器操作数”。
所有其他指令都有一个寄存器作为操作数,并且汇编器知道寄存器有多大。例如,mov %rax, -8(%rbp)
必须是四字移动(8 个字节),因为%rax
是一个64位寄存器。同样地,mov %eax, -8(%rbp)
, mov %ax, -8(%rbp)
, and mov %al, -8(%rbp)
将是长字/字/字节移动(4/2/1 字节)。因此,这些指令的尺寸后缀是可选的。
但立即常数$8
没有固有的大小,因此汇编程序无法知道您想要的大小,除非您告诉它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)