我正在查看一些 x86 代码,我相信这些代码是使用 Microsoft 工具链构建的,并试图找出在此调用期间使用的调用约定:
push esi ; save ESI (it gets restored later)
lea esi, [ebp-0xC] ; set param 1 for call to FOO
call FOO
test eax, eax ; test return value
jz somelabel
函数 FOO 是这样开始的:
FOO:
mov edi, edi
push ebx
xor ebx, ebx
push ebx ; null
push esi ; pass ESI in as second param to upcoming call, which has been set by caller
push ptr blah
mov [esi+0x8], ebx
mov [esi+0x4], ebx
mov [esi], ebx
call InterlockedCompareExchange ; known stdcall func which takes 3 params
test eax, eax
...
由于 ESI 没有在 FOO 的主体中初始化,我假设它是由调用者作为参数传入的。
这是什么调用约定?它看起来是 fastcall 的一个变种。这个公约有名字吗?