delphi函数调用,参数与返回值问题,300分!与汇编有关!(300分)

  • 主题发起人 主题发起人 yeskert1
  • 开始时间 开始时间
Y

yeskert1

Unregistered / Unconfirmed
GUEST, unregistred user!
例如一个函数:f(p1,p2,p3,p4,p5:integer):integer;
调用时,参数如何入栈,返回时,返回值如何返回?
i:=f(1,2,3,4,5);的等价的汇编语句如何写?
asm
???
???



call f
???
end;
 
push p5
push p4
push p3
push p2
push p1
call f的地址(例如0040544C)
 
function f(a, b, c, d, e: Integer): Integer
stdcall
// 这是关键
var
s: string;
begin
s := Format('a=%d,b=%d,c=%d,d=%d,e=%d', [a, b, c, d, e]);
ShowMessage(s);
Result := a + b + c + d + e;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
a, b, c, d, e: Integer;
r: Integer;
begin
r := 0;

a := 1;
b := 2;
c := 3;
d := 4;
e := 5;

asm
// 入栈顺序参照调用约定
push e
push d
push c
push b
push a

call f // 之后是否清除堆栈参照调用约定

mov r, eax
end;

ShowMessage('Sum = ' + IntToStr(r));
end;
 
Directive Parameter order Clean-up Passes parameters in registers?
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No
所以,
对于采用pascal声明的函数,应该是
push p1
push p2
push p3
push p4
push p5
call f的地址(例如0040544C)
mov i,eax //一般返回值会放在eax中
对于采用register声明的函数,参数放在寄存器中;
对于其他3种形式,同意qianwt。这种形式多用于win api的调用。
此外,具体到某一个函数的调用形式(参数是传递值还是地址)还同其他一些因素有关(如参数是否采用var修饰等)。
你要想知道一个函数的汇编形式的调用方法,最简单的方法就是先用delphi的方法调用他,然后再cpu窗口中找到那句代码,直接抄下来就行了。
 
谢谢大家![:D]

to cqbaobao:
为何是eax ?你怎么知道的?
如果返回值是字符串会怎样?
这种方式直接调用format或者copy怎样呢?
请多多指教!
此致!
 
to tt.t:
可否全面的就各种情况下的调用、返回给以总结?
非常感谢!
 
看看这里:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1774764
 
在汇篇中,EAX,EBX,ECX,EDX,ESI,EDI(32bit)是通用register
其中EAX作累加器使用!
 
若想返回非基本类型的数据(如整、BOOL、CHAR),
你得在调用函数前准备返回值的内存空间,
把这个内存地址作为函数的参数传入,在函数内修改该地址指向的内存;
 
返回interger,bool,dword在eax中。
返回word,char,byte在ax或al中。
返回pointer,string在eax指向的地址中。
等等!

 
我想用内嵌汇编实现这样功能:
s:=copy(s1,2,3);
该怎样写?
 
还是这句话:
你要想知道一个函数的汇编形式的调用方法,最简单的方法就是先用delphi的方法调用他,然后再cpu窗口中找到那句代码,直接抄下来对应的汇编语句就行了。
 
谢谢你!tt.t[:D]
我试过,调用copy的汇编,在delphi里通不过!
汇编中是call @LStrCopy,LStrCopy是哪里声明的?
请大哥指教!
 
ft,你应该直接调用win api:copymemory就行了,不要用delphi提供的函数
 
都是高手!学习
 
唉,不懂底层的东西。:(
努力中
 
我觉得学汇编,不要拿 Delphi 里的 String 开刀,
按我说的方法吧,使用 PChar,这才是原理!
 
非常感谢大家!
我的原意是想知道一个统一的asm方法来访问delphi提供的所有函数。
大家的建议很让我启发!
 
后退
顶部