你如何知道 x86 中寄存器的大小?

How can you tell the size of a register in x86?

你怎么知道如何在下面的汇编代码中填写下划线:

mov_ %eax, (%rsp)

字节为 "b",字为 "w",双字为 "l",四字为 "q"。寄存器的语法应该(我认为)指示移动了多少数据。我翻阅了我的书,但似乎无法确定这是如何确定的。

是否有通用的方法来解决这个问题?

AT&T 汇编器没有歧义,所以它必须匹配操作数,即使操作数(寄存器)包含足够的大小信息。

%eax 是一个 32 位寄存器(就像 %al 是 8 位,%ax 是 16 位,%rax 是 64 位)。

虽然 (%rsp) 中的 %rsp 是 64 位的,但表达式 (%rsp) 是移动到 %rsp 中保存的内存位置,因此没有关联的寄存器大小。

所以mov(e)是32位的,后缀是l。

如果mov的一个操作数是一个寄存器,那么大小是隐含的:AL是一个字节,AX两个,EAX四个和RAX 八。如果一个操作数是内存位置而另一个是立即值,you 必须指定所需的大小:

mov  BYTE PTR [RAX], 1    ;  *(uint8_t *)(rax) = 1
mov  WORD PTR [RAX], 1    ; *(uint16_t *)(rax) = 1
mov DWORD PTR [RAX], 1    ; *(uint32_t *)(rax) = 1
mov QWORD PTR [RAX], 1    ; *(uint64_t *)(rax) = 1

以上是架构手册使用的英特尔语法。在 AT&T 语法中,第一行是 movb , (%rax); AT&T 语法使用 movbmovwmovdmovq 等后缀指令来指示操作数宽度。