I am working on some x86
assembly program analysis tasks, and I am trying to figure out the fastcall behavior.
Although on 32-bit x86
platform, the stack is defined to pass the function parameters in the calling conversion. However, I observed that many function calls are indeed leveraging two registers, eax
and edx
to pass the first two function parameters.
For example, here is a (simplified) example found in 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)
As you can see, register eax
and edx
are used to pass parameters. My observation is that those two registers are always used to pass the first two parameters.
Note that I am using gcc
to compile the code. However, I can only find the fastcall
definition of the Microsoft
compiler, which uses register ecx
(not eax
!) and edx
to pass parameters.
So here is my question: is there any clear definition of such gcc
optimization? I just cannot find some informative sources...