x64 暫存器速查表

💡 原文中文,约1900字,阅读约需5分钟。
📝

内容提要

本文总结了x64架构下的核心寄存器状态与ABI约定,包括通用寄存器的用途、函数调用约定及关键状态标志。介绍了System V和Microsoft x64的参数传递顺序及返回值处理,强调了易失性和非易失性寄存器的区别。

🎯

关键要点

  • x64架构下的通用寄存器分为易失性和非易失性寄存器,易失性寄存器在函数调用后可能会改变,非易失性寄存器在函数返回时必须保持不变。

  • System V AMD64 ABI的参数传递顺序为RDI、RSI、RDX、RCX、R8、R9,超过6个参数时通过栈传递,返回值通过RAX传递。

  • Microsoft x64的参数传递顺序为RCX、RDX、R8、R9,超过4个参数时通过栈传递,并且调用者需预留32字节的Shadow Space,返回值同样通过RAX传递。

  • 关键状态标志包括ZF(零标志)、SF(符号标志)、OF(溢出标志)和CF(进位标志),用于控制流指令的判断。

  • 浮点参数在System V ABI中通过XMM0到XMM7传递,浮点返回值通过XMM0返回,XMM0到XMM15通常为易失性寄存器。

🔎

延伸解读

易失性与非易失性寄存器的区别

在x64架构中,易失性寄存器在函数调用后可能会被修改,因此调用者需要在调用前保存其值。而非易失性寄存器则必须在函数返回时保持不变。这一特性对编写高效的汇编代码至关重要,开发者需根据寄存器的特性合理安排数据存储与函数调用。

参数传递的不同约定

System V和Microsoft x64在参数传递顺序上存在显著差异。前者使用RDI、RSI等六个寄存器,而后者则使用RCX、RDX等四个寄存器。了解这些差异对于跨平台开发和调试至关重要,尤其是在处理系统调用和函数返回值时,开发者需特别注意各自的约定。

关键状态标志的作用

ZF、SF、OF和CF等关键状态标志在控制流指令中起着重要作用。它们的状态决定了程序的执行路径,因此在编写条件跳转指令时,开发者需要清楚这些标志的含义和设置条件,以确保程序逻辑的正确性。

延伸问答

x64架构下的寄存器分为哪两类?

x64架构下的寄存器分为易失性寄存器和非易失性寄存器。

System V AMD64 ABI的参数传递顺序是什么?

System V AMD64 ABI的参数传递顺序为RDI、RSI、RDX、RCX、R8、R9,超过6个参数时通过栈传递。

Microsoft x64的参数传递有什么特别之处?

Microsoft x64的参数传递顺序为RCX、RDX、R8、R9,超过4个参数时通过栈传递,并需预留32字节的Shadow Space。

关键状态标志ZF、SF、OF和CF分别代表什么?

ZF表示运算结果为0,SF表示结果为负,OF表示有符号运算溢出,CF表示无符号运算进位或借位。

浮点参数在System V ABI中如何传递?

浮点参数在System V ABI中通过XMM0到XMM7传递,浮点返回值通过XMM0返回。

什么是易失性寄存器和非易失性寄存器的区别?

易失性寄存器在函数调用后可能会改变,而非易失性寄存器在函数返回时必须保持不变。

🏷️

标签

➡️

继续阅读