一段小程序,老是得不到正确数据,请帮忙!(100分)

  • 主题发起人 主题发起人 晶晶
  • 开始时间 开始时间

晶晶

Unregistered / Unconfirmed
GUEST, unregistred user!
正在学嵌入式汇编,但下面这个程序怎么也得不到正确的数据。
Tclass1=class
private
val1:integer;
public
val2:integer;
procedure valp;
function valf(int1,int2:integer):integer;
procedure proc;virtual;
function ppp(b:integer):integer;
end;
procedure tclass1.proc;
function vpf:integer;
asm
lea eax,self
lea edx,[eax].val2
mov @result,edx
end;
var i:integer;
begin
i:=vpf;
showmessage('val2 is:'+inttostr(i));//1
i:=self.val1;
showmessage('val2 is:'+inttostr(i));//2
end;
其中1是用汇编得到的数据,2是用常用的pascal得到的数据,2正确输出,但1却老是出现诸如
1241800的数据,并没有得到正确的数据!
请各位大侠帮助,我还试着用了偏移地址,但地址好像正确,就是数据不对!
 
function vpf:integer;
asm
lea eax,self
lea edx,[eax].val2
mov @result,edx
end;
end;
你贴的应该调试不通

 
对了,一个地方写错了,应该是:
Tclass1=class
private
val1:integer;
public
val2:integer;
procedure valp;
function valf(int1,int2:integer):integer;
procedure proc;virtual;
function ppp(b:integer):integer;
end;
procedure tclass1.proc;
function vpf:integer;
asm
lea eax,self
mov edx,[eax].val2
mov @result,edx
end;
var i:integer;
begin
i:=vpf;
showmessage('val2 is:'+inttostr(i));//1
i:=self.val1;
showmessage('val2 is:'+inttostr(i));//2
end;
 
这样就能通过了吗?[?]
 
能啊,无论是实践还是理论上都可行,但就是得不到正确的东西哟
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
type
Tclass1=class
private
val1:integer;
public
val2: integer;
function vpf:integer
virtual
register;
procedure proc;virtual;
end;

function tclass1.vpf:integer;
asm
mov eax,[eax].val2
end;

procedure tclass1.proc;
var i:integer;
begin
i:=vpf;
showmessage('val2 is:'+inttostr(i));//1
i:=self.val2;
showmessage('val2 is:'+inttostr(i));//2
end;

procedure TForm1.Button1Click(Sender: TObject);
var
a : tclass1;
begin
a := tclass1.Create;
a.val2 := 1234;
a.proc;
a.Free;
end;

end.
 
噫!!!这个怎么行啊,我运行通过而且正确无误,
asm
mov eax,[eax].val2
end;
一句就搞定了,那么eax寄存器中原本就是存self指针的值的吗?那返回值也是放在eax寄存器
中的吗?在Object Pascal的inline中到底还有多少特定的东西啊。tseug可以帮我讲讲吗?
我的语句怎么就得不到呢?什么原因啊?

 
对于用Register方式调用的方法,入口EAX保存了实例,出口时EAX保存的是Result

你的代码里是在一个方法中声明的函数,对于函数他没有实例变量,所以你是得不到
Self的,尽管Proc方法可以得到,但是vpf函数如果不通过特殊的方法是得不到Self
的,所以你的引用也就错了。
 
谢谢你的回答,现在知道了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
814
import
I
后退
顶部