• 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.
    书搞进脑袋 创新 创造; 积极
  • 相关阅读:
    使用 RestSharp 调用 WebAPI 接口
    Android Studio 下载安装目录
    多线程之await/async
    ScriptX进行Web打印
    Sqlserver 查询最新修改过的表、过程和视图等
    SqlServer中的bit类型
    .Net 6
    PDA 使用总结
    SQL Server 发布订阅 发布类型详解
    Profile对象
  • 原文地址:https://www.cnblogs.com/tobetterlife/p/12169687.html
Copyright © 2020-2023  润新知