如何判断x86中寄存器的大小?

bcl*_*man 1 x86 assembly

您如何知道如何在以下汇编代码中填写下划线:

mov_ %eax, (%rsp)
Run Code Online (Sandbox Code Playgroud)

字节为"b",字为"w",双字为"l",四字为"q".寄存器的语法应该(我认为)表明移动了多少数据.我查看了我的书,似乎无法确定如何确定.

有一般的方法来解决这个问题吗?

Ker*_* SB 6

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

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
Run Code Online (Sandbox Code Playgroud)

以上是架构手册使用的Intel语法.在AT&T语法中,第一行是movb $1, (%rax); AT&T的语法使用后缀的指令一样movb,movw,movdmovq指示操作数的宽度.

  • @bclayman:阅读架构手册吗?通用寄存器是AX,BX,CX,DX,SI,DI,SP和BP。x86-64添加了另一个8,名为R08-R15,它使用R00-R07作为原始8的别名。 (2认同)

Mar*_*ort 5

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

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

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

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