关于@的一个问题?(50分)

  • 主题发起人 主题发起人 吴明星
  • 开始时间 开始时间

吴明星

Unregistered / Unconfirmed
GUEST, unregistred user!
如有一个过程变量proc,且已赋值,请问@proc为什么是入口指针,还能给@proc赋值,而
且@@proc才返回proc的地址?
 
proc本身是函数调用, 相当于:
call procaddress
意思是将proc所包含的地址作为函数调用

而用@proc相当于addr(proc), 意思是取proc所包含的函数调用的地址
而@@proc相当于取这个函数调用地址在内存中存放的地址. 画个图就比较容易理解了:

type TProc=function SetInt:integer;

var proc:tproc;



$00401021(数据段,proc变量,4 bytes function pointer):
Proc [$0020103c]
|
| 调用
|
V
$0020103C(SetInt的代码段):
i:=100;
result:=i;


可以看出, proc是在数据段的, 它所在的地址是$00401021, 它的内容是
$0020103C, 因为是函数类型的变量, 所以直接应用的时候会自动跳转到
它的内容所在的地址, 并作为代码来执行, 得到的是返回值.
@proc得到的是函数入口$0020103C所在的地址, 即$0020103C, 而
@@proc是指保存$0020103C的变量所在的地址, 即proc在数据段中的地址,
就是$00401021
 
为什么又能给@proc赋值呢?
 
给@proc赋值相当于在数据段proc所在的地址空间中填入内容,
由于数据段的proc空间是程序实际分配过的,所以可以赋值。

就相当于把函数的入口地址$0020103C看成是整数,
4 bytes的数据段的proc空间(@proc)也看成是一个整数变量,
不是可以赋值的么? ^_^
 
接受答案了.
 
后退
顶部