TO:savetime 、积步 我也正在学习汇编。其实我也有savetime的想法。可是自己能力
和时间的问题。只能向你们学习了。关于:积步兄的问题确实有趣!而且 savetime兄的回答就精妙了! 现在我调试一下结果是下面的:
1.这是(savetime)做的:MOV ECX, TA(EBX).FA
// 通知编译器 EBX 指向的是 TA class
其实这句话可以这样翻译过来(这是我的个人看法,有步不的地方请指正):
asm
MOV EAX, [A];//这句是把这个实例的引用传进寄存器EAX,也就是堆中的首地址
//MOV EAX,TA(EAX).FA;
MOV tmpInt,EAX ;//这里是把寄存器中的值(也就是实例的首地址,而不是变量的地址)传给tempInt;
end;
//在这里也就是相当于(savetime)的那句话了
ShowMessage(IntToStr(TA(tmpInt).FA));
2.这是(积步)提问的:
procedure TForm1.Button1Click(Sender: TObject);
var
A: TA;
tmpInt: Integer;
begin
A := TA.Create;
tmpInt := 0;
A.SetA(100);
asm
MOV ECX, A
//為什麼A.FA => 100 立即數就可以顯示為 100, 如果不改就顯示為其它值。(这里修改一下)
MOV tmpInt, ECX;
end;
ShowMessage(IntToStr(TA(tmpInt).FA));//主意这里如果改为这样就对了,这里可能是编译器做的
A.Free;
end
其实(积步)的做法就是得到这个类的段地址的FA的偏移地址。而不是该地址
里面的内容,至于怎么样取出我们要找到该变量地址的值,就象(savetime)那样
做!但是那样那做为什么能够取出他的值?后来(积步)用寄存器加上立即数也可以
取出来,我还是模糊???