调用约定为safecall时,怎么访问函数的参数? ( 积分: 200 )

  • 主题发起人 主题发起人 shixueli
  • 开始时间 开始时间
S

shixueli

Unregistered / Unconfirmed
GUEST, unregistred user!
我要用asm写一个简单求和函数,但这个函数是放在类里面的,而且是safecall的,要实现的功能如下:
function TAsmObj.sum( a1,b,c,d: integer);
begin
result := a1+b+c+d;
end;

用汇编怎么实现呢?
 
Borland的FastCall在Delphi中被叫作Register约定.
前三个参数由eax,edx,ecx方式传递,其他参数按照Pascal约定调用.
由于你给的是成员函数,那么第一个参数一定是Self(也就是C中的this).
所以你传递的4个参数就放在edx,ecx和栈中.参数在栈中的位置是EBP+XXXX
XXX是参数的偏移.注意最后一个参数是EBP+8,因为EBP+4的位置是函数执行后的返回地址.
function TAsmObj.sum(a, b, c, d: Integer): Integer;
asm
//eax中存放的是真正的第一个参数Self
//a在edx,b在ecx,d在[ebp+12],e在[ebp+8]
mov eax, edx
add eax, ecx
add eax, [ebp + 12]
add eax, [ebp + 8]
end;//返回值是放在eax中的.
如果你给的不是成员函数而是独立的函数的话,参数依次向前挪
 
safecall等同于stdcall方式,将参数反转就对了。
 
后退
顶部