我正在处理一些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
所以这是我的问题:这种优化有什么明确的定义吗?我只是找不到一些信息来源......