unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;  TCsdner = class(TObject)
  private
    FName: string;
    FLevel: string;
    FScore: Integer;
  public
    constructor Create(const AName: string; const ALevel: string = 'low'; const AScore: Integer = 0); virtual;
    class function IsPureMan: Boolean;
    procedure GiveScore(const AScore: Integer); virtual;
    procedure RecvScore(const AScore: Integer); virtual;
  published
    property Score: Integer read FScore stored False default 0;
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
const
  SCORE: Integer = 100;
var
  LZ, Me: TCsdner;
begin
  if TCsdner.IsPureMan then
    ShowMessage('Pure Man!');
  LZ := TCsdner.Create('LZ', 'high', 10000);
  Me := TCsdner.Create('Me');
  try
    LZ.GiveScore(SCORE);
    Me.RecvScore(SCORE);
    ShowMessageFmt('LZ: %d; Me: %d', [LZ.Score, Me.Score]);
  finally
    Me.Free;
    LZ.Free;
  end;
  ExitThread(0);
end;{ TCsdner }constructor TCsdner.Create(const AName, ALevel: string;
  const AScore: Integer);
begin
  FName := AName;
  FLevel := ALevel;
  FScore := AScore;
end;class function TCsdner.IsPureMan: Boolean;
asm
  MOV @Result, True
end;procedure TCsdner.GiveScore(const AScore: Integer);
asm
  SUB Self.FScore, EDX
end;procedure TCsdner.RecvScore(const AScore: Integer);
asm
  ADD Self.FScore, EDX
end;end.
没事写着玩儿的

解决方案 »

  1.   

    学习,不过好像有点问题,执行了程序没有退出来。请教一下,在FormCreate里面为什么要用ExitThread(0)为什么不用Application.Terminate;还有MOV @Result, True;和MOV Result, True有什么区别。后面两句汇编SUB [EAX].FScore, EDX,ADD [EAX].FScore, EDX也可直接用[EAX]吧,看VCL里面的汇编好象还少用self哦。
      

  2.   

    1、使用ExitThread(0), 线程退出时,如果没有其他线程了,就退出进程(我这里测试是退出的)
    2、Result 和 @Result 区别我也不太明白,内嵌汇编里就用 @Result ?
    3、后面两句汇编中的Self确实可以用[EAX],但不知道原因……原来两句中的Self是我试验出来的,EDX是看CPU窗口才改的,原来我写的类似这样:ADD FScore, EAX。因为当时我想,FScore就是个私有成员,不需要Self来引用;还有函数的第一个参数是EAX吧,EDX不是第二个参数吗?

    请大虾解惑!
      

  3.   

    呵呵,因为在类里面EAX存放的是类的基址就是self,所以类方法参数传递就是从EDX开始,如果你的方法定义在类以外的话就是EAX。至于FScore不能访问也是和在类里面定义有关,因为要根据类的基址(self)在这个变量的偏移地址才能访问到,如果定义在类外面的全局变量就可以直接访问。ExitThread是用在线程里面的,用你的代码在D7里面测试一下退出不出来,程序还在进程里面。你用这个似乎不太合适吧。