Win32汇编中的函数调用约定(子程序的参数传递和堆栈平衡)
(1) 子程序的调用过程:调用者首先把参数压入堆栈,然后调用子程序,在完成后,由于堆栈中先前压入的参数不再有用,调用者或被调用者必须有一方把堆栈指针修正到调用前的状态,即堆栈平衡或平衡堆栈。
(2) 最右边的参数先入堆栈,还是最左边的参数先入堆栈。即:参数从右到左压入堆栈,还是从左到右压入堆栈。这需要约定。
(3) 有调用者修正堆栈,还是有被调用者修正堆栈。这也需要约定。
下表给出了不同语言的调用约定
|
C |
SysCall |
StdCall |
Basic |
Fortran |
Pascal |
最先入栈参数 |
右 |
右 |
右 |
左 |
左 |
左 |
清除堆栈者 |
调用者 |
子程序 |
子程序★ |
子程序 |
子程序 |
子程序 |
允许使用VARARG |
是 |
是 |
是 |
否 |
否 |