无法大小指令
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 字节)。因此,大小后缀对于这些指令是可选的。
但是立即数
没有固有的大小,所以汇编程序无法知道你想要什么大小,除非你告诉它。
我想知道为什么有些汇编指令可以推断出来,而有些则不能。例如,在下面的程序中我有:
.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 字节)。因此,大小后缀对于这些指令是可选的。
但是立即数 没有固有的大小,所以汇编程序无法知道你想要什么大小,除非你告诉它。