x86 汇编:调用约定
调用约定规定函数之间如何协作。
它通常回答这些问题:
- 参数放在哪里?
- 返回值放在哪里?
- 哪些寄存器由调用者保存?
- 哪些寄存器由被调用者保存?
返回值
很多 ABI 中,整数返回值放在 rax。
参数
x86-64 下不同平台约定不同。Linux System V 和 Windows x64 的参数寄存器并不完全一样。
阅读汇编前要先确认平台和 ABI,否则容易误判参数含义。
System V 与 Windows x64
在 Linux x86-64 的 System V ABI 中,前几个整数或指针参数通常放在:
rdi, rsi, rdx, rcx, r8, r9
Windows x64 则常见:
rcx, rdx, r8, r9
这就是为什么同一段 C++ 函数,在不同平台上反汇编出来的寄存器使用会不一样。
返回值和调用者责任
大多数整数返回值会放在 rax。调用者在调用函数前,要假设某些寄存器会被破坏;被调用者则必须恢复一部分约定要求保存的寄存器。
实际阅读技巧
看函数调用前的几条指令,通常能推断参数准备过程。看调用后的 rax 如何被使用,通常能推断返回值语义。
评论
...正在读取评论。