我正在处理一些x86
汇编程序分析任务,我正在尝试找出 fastcall 行为。
虽然在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
!)和{{1传递参数。
所以这是我的问题:这种edx
优化有没有明确的定义?我找不到一些信息来源......