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 如何被使用,通常能推断返回值语义。

评论

...

正在读取评论。