【发布时间】:2020-08-12 02:58:44
【问题描述】:
我想知道为什么有些汇编指令可以推断出来,而有些则不能。例如,在以下程序中,我有:
.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 $8, -8(%rbp)说将值 8 移动到内存位置,但值是 8 有多大。它是 8 的字节,0x08 的字长,0x08 的四字0x08?这就是为什么您必须指定大小,因为大小不能由任一操作数确定。在其他情况下,操作数之一是寄存器并且寄存器具有已知宽度。比如RAX是64位寄存器EAX是32位寄存器,AX是16位寄存器,AL/AH是8位寄存器
标签: assembly x86 gnu-assembler att