无法大小指令

Can't size instruction

我想知道为什么有些汇编指令可以推断出来,而有些则不能。例如,在下面的程序中我有:

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

我收到以下错误:

stack.s:5: Error: no instruction mnemonic suffix given and no register operands; can't size instruction

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

movq , -8(%rbp)

它运行没有错误。所有其他操作如何推断大小,但特定指令不能?

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

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

但是立即数 没有固有的大小,所以汇编程序无法知道你想要什么大小,除非你告诉它。