zoukankan      html  css  js  c++  java
  • 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.
    书搞进脑袋 创新 创造; 积极
  • 相关阅读:
    有一天,我们能这样相爱吗?
    端午节来源六说
    一个ini类代替缓存使用
    创意生活可爱香皂
    漂亮的韩国发饰
    Oracle中PL/SQL单行函数和组函数详解
    真正爱你的女人是这样的
    执子之手,与子偕老。你同意么?
    男人如茶
    Oracle SQL 內置函數大全
  • 原文地址:https://www.cnblogs.com/tobetterlife/p/12169687.html
Copyright © 2011-2022 走看看