├── README.md ├── align.md ├── array.md ├── bss.md ├── byval.md ├── call.md ├── dynamicstack.md ├── frame.md ├── gcc.md ├── globalvar.md ├── inlineasm.md ├── localvar.md ├── macro.md ├── main.md ├── mem.md ├── name.md ├── optimize.md ├── pfunc.md ├── process0.01.md ├── process2.6.md ├── recur.md ├── static.md ├── staticstack.md ├── string.md ├── struct.md └── varargs.md /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 |
其实程序运行就好比一帧一帧地放电影,每一帧是一次函数调用,电影放完了,我们就看到结局了。14 | 15 | 我们用一个递归求解阶乘的程序来看看这个放映过程(fac.c): 16 | 17 | #include
41 |
|
62 | ![]() |
63 |
113 |
|
131 | ![]() |
132 |
调用惯例 | 174 |出栈方 | 175 |参数传递 | 176 |名字修饰 | 177 |
---|---|---|---|
cdecl | 180 |函数调用方 | 181 |从右至左的顺序压参数入栈 | 182 |下划线+函数名 | 183 |
stdcall | 186 |函数本身 | 187 |从右至左的顺序压参数入栈 | 188 |下划线+函数名+@+参数的字节数, 189 | 如函数 int func(int a, double b)的修饰名是 190 | _func@12 | 191 |
fastcall | 194 |函数本身 | 195 |头两个 DWORD(4字节)类型或者更少字节的参数 196 | 被放入寄存器,其他剩下的参数按从右至左的顺序入栈 | 197 |@+函数名+@+参数的字节数 | 198 |
pascal | 201 |函数本身 | 202 |从左至右的顺序入栈 | 203 |较为复杂,参见pascal文档 | 204 |