堆栈问题(50分)

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

yyok

Unregistered / Unconfirmed
GUEST, unregistred user!
在DELPHI中如何操作堆栈,能否给一个例子。
 
procedure TForm1.ExecMethodByName(AName: string);
var
PAddr: Pointer;
I:Integer;
begin
PAddr := MethodAddress(AName);
asm
mov edx, 30
mov ecx, 15
Add ecx,edx
push ecx
mov eax, Self
call PAddr
pop ecx
mov I, ecx
end;
ShowMessage(InttoStr(I));
//显示为45
end;
 
一定要用汇编吗?
 
我给你的一段程序是从自己的一个程序中复制的,实际上我调用汇编只是让你能更方便地理解,
在Delphi中随时可以见到堆栈的使用,只是大多数时候是隐式调用而已。你有留意到我给你的
程序中的call PAddr吗?那就是一条调用其他过程的代码,程序里我使用了这条语句:
ShowMessage(Self.Name + '->' + InttoStr(I + J));PAddr中存放的就是调用这个语句的过程
的地址,这时
mov edx, 30
mov ecx, 15
就是把30赋值给edx,15赋值给ecx,在进行加法运算之后,两个寄存器所存放的值就变了,
如果我们之前采用Push edx,Push ecx保存原值的话,再Pop出来就可以看到两个原值了,
Delphi中VCL的源码对参数的处理也是采用堆栈方式。Delphi函数实际上是一段能传递参量
并能返回一个值的子程序;函数都是由函数原型声明,原型描述了返回值的类型、函数名以及参量变量;
遵守“后进先出”原则;
 
在C语言中有POP和PUSH来操作堆栈,在DELPHI中能实现同样的操作吗?
 
天呀,怎么一直不明白?C语言是中级语言,而Pascal是高级语言,C能直接写很多涉及内存、
指针和中断的语句,而Pascal则需要嵌入汇编语句,如果说有某些函数实现了低层的内存读
写、堆栈、队列等功能,也不过是封装了汇编语句而已。
还是你直接只想要一个涉及类似堆栈操作的实例呢?那种东西难道还不容易写吗?真奇怪!
 
我似乎明白了,谢谢你的耐心解答。
 
谢啦!http://www.delphibbs.com/delphibbs/dispq.asp?lid=2574275
 
接受答案了.
 
堆栈到底是什么??实际上,是一种概念性的东西,本没有堆栈,是人们为了方便
而创造了他,给了他一个定义,是人为规定的(这里不详细介绍相关内容,可以看书)
由于堆栈先进后出的特性在计算机中实在是太有用处了,比如,我们的程序调用子过程
而子过程又调用了子子过程。。。。如何正确保存和恢复父过程的指令地址?用堆栈
是一个非常好的解决方法,堆栈的特性正符合我们的要求。。 所以,堆栈被引入到了
计算机机器级,我觉得应该是硬件工程师在设计Cpu的时候引入了堆栈,因为Cpu这样工
作才是非常合理的。。。但是,堆栈只是个概念,不仅仅可以被用在决定Cpu工作方式。
还有很多地方可以用到,这个时候,我们可以用高级语言来构造、模拟一个堆栈(使他
具有堆栈的特性和功能),比如:括号的匹配判断。。。。
 
后退
顶部