为什么使用8字节寄存器来携带8字节类型,而不是使用4字节寄存器来携带4字节类型

  • 本文关键字:字节 寄存器 类型 c++ assembly x86-64
  • 更新时间 :
  • 英文 :


这是我正在寻找的代码片段

#include <cstdint>
int main() {
unsigned int i = 0x11111111;
unsigned int j = 0xFFFFFFFF;
uint64_t k = 0xFFFFFFFF11111111;
}
0000000140001000  sub         rsp,18h  
0000000140001004  mov         dword ptr [rsp],11111111h  
000000014000100B  mov         dword ptr [rsp+4],0FFFFFFFFh  
0000000140001013  mov         rax,0FFFFFFFF11111111h  
000000014000101D  mov         qword ptr [rsp+8],rax  
0000000140001022  xor         eax,eax  
0000000140001024  add         rsp,18h  
0000000140001028  ret

我们使用rax寄存器来携带uint64_t的值。

为什么我们不使用eax或其他32位寄存器的int?

由于您没有使用优化编译,因此它不使用寄存器来保存任何变量—它们都在堆栈帧中(在rsp, rsp+4和rsp+8)

这里的rax只是用于暂时保存常量0xFFFFFFFF11111111,因为没有单个指令将64位值写入内存。有一条指令将32位值写入内存,用于unsigned int初始化

最新更新