delphi内嵌汇编

{
前面知道了一个汇编的赋值指令(MOV), 再了解一个加法指令(ADD), 就可以做个例子了.

譬如: ADD AX,BX; 这相当于 Delphi 中的 AX := AX + BX;

另外提前来个列表 - Delphi 可以用汇编管理以下寄存器:
32 位寄存器: EAX EBX ECX EDX ESP EBP ESI EDI
16 位寄存器: AX BX CX DX SP BP SI DI
8 位寄存器 : AL BL CL DL AH BH CH DH
16 位段寄存器: CS DS SS ES 以及协处理器寄存器堆栈: ST

}

unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

//使用汇编的函数
function add(x,y: Short): Integer;
var
  count: short;
begin
  asm
    MOV AX,x      {把 x 值放入寄存器 EAX}
    MOV CX,y      {把 y 值放入寄存器 ECX}
    ADD AX,CX    {把 EAX + ECX 的值放入 EAX}
    MOV count,AX  {把 EAX 的值给变量 count}
  end;
  Result := count; {返回值}

{asm 中每个语句换行即可分句, 无须 ; 在这里加上也没有问题}
end;

//使用汇编的函数
function add2(x,y: Integer): Integer;
var
  count: Integer;
begin
  asm
    MOV EAX,x      {把 x 值放入寄存器 EAX}
    MOV EbX,y      {把 y 值放入寄存器 ECX}
    mov Ecx,1000000000
    @s:ADD EAX,EbX    {把 EAX + ECX 的值放入 EAX} {内部标签必须使用 @ 前缀; 也可以使用 Delphi 的标签}
    loop @s
    MOV count,EAX  {把 EAX 的值给变量 count}
  end;
  Result := count; {返回值}

{asm 中每个语句换行即可分句, 无须 ; 在这里加上也没有问题}
end;

function add3(x,y:integer):Integer;
var
  i:Integer;
begin
  result:=x;
  for i:=1 to 1000000000 do
    Result:= result+y;
end;

//测试
procedure TForm1.btn1Click(Sender: TObject);
var
  i: Integer;
  t:Cardinal;
begin
  //两个add方法都可以
  //i := add(2,4);
  t:=GetTickCount;
  i:=add3(5,10);
  t:= GetTickCount-t;
  Self.Caption:= IntToStr(t);

  //没想到汇编 耗时更长,也许delphi自带的编译器 优化的很不错了
  t:=0;
  t:=GetTickCount;
  i := add2(5,10);
  t:= GetTickCount-t;
  Self.Caption:=Self.Caption+';'+ IntToStr(t)+';'+inttostr(i);

//  ShowMessage(IntToStr(i)); {6}
end;

end.
posted @ 2020-01-09 09:36  创新创造学习整合套路  阅读(312)  评论(0编辑  收藏  举报