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.
书搞进脑袋 创新 创造; 积极