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.
    书搞进脑袋 创新 创造; 积极
  • 相关阅读:
    949. Largest Time for Given Digits
    450. Delete Node in a BST
    983. Minimum Cost For Tickets
    16. 3Sum Closest java solutions
    73. Set Matrix Zeroes java solutions
    347. Top K Frequent Elements java solutions
    215. Kth Largest Element in an Array java solutions
    75. Sort Colors java solutions
    38. Count and Say java solutions
    371. Sum of Two Integers java solutions
  • 原文地址:https://www.cnblogs.com/tobetterlife/p/12169687.html
Copyright © 2011-2022 走看看