我正在处理一些x86汇编程序分析任务,并试图找出快速调用行为。
虽然在32-bit x86平台上,堆栈被定义为在调用转换中传递函数参数。但是,我观察到许多函数调用确实利用了两个寄存器,eax并edx传递了前两个函数参数。
例如,这是一个(简化的)示例,位于libgcrypt 1.6.1:
mov 0x24(%esp), %eax
...
mov 0x1c(%esp), %edx
call mul_n
...
mul_n:
...
mov %eax, 0x20(%esp)
mov %edx, 0x24(%esp)
如您所见,注册eax并edx用于传递参数。我的观察是这两个寄存器总是用来传递前两个参数。
请注意,我正在使用它gcc来编译代码。但是,我只能找到编译器的fastcall定义Microsoft,它使用寄存器ecx(不是eax!)并edx传递参数。
gcc所以这是我的问题:这种优化有什么明确的定义吗?我只是找不到一些信息来源......