易截截图软件、单文件、免安装、纯绿色、仅160KB

Delphi 循环的秘密

技术交流,DH讲解. 哈哈,我承认我是标题党.
最近看天书夜读里面是对C语言的代码反汇编,不错,可惜Delphi没有这样的书,那我们自己动手吧.
首先进入For循环了. Function TestFor( a, b: Integer ): Integer ;
Var
I: Integer ;
Begin
Result := a + b ;
For I := 0 To 49 Do
Result := Result + I ;
End ;
{$R *.dfm}
Procedure TForm1.btn1Click( Sender: TObject ) ;
Begin
ShowMessage( IntToStr( TestFor( 1, 2 ) ) ) ;
End ;
反汇编代码:
Unit4.pas.28: Result := a + b ;
00523AE0 03D0 add edx,eax //执行a+b,但是我很奇怪为什么不用add eax,edx 这样最后就不用执行那句mov eax,edx了,节约一句
Unit4.pas.29: For I := 0 To 49 Do
00523AE2 33C0 xor eax,eax //清除eax,来充当I这个循环变量
Unit4.pas.30: Result := Result + I ;
00523AE4 03D0 add edx,eax //累计和,并把循环变量+1,这里就是循环体的执行代码
00523AE6 40 inc eax
Unit4.pas.29: For I := 0 To 49 Do
00523AE7 83F832 cmp eax,$32 //边界比较,不等于就跳回去,继续执行循环体代码.
00523AEA 75F8 jnz $00523ae4 //看来还是再写个函数来看看
Unit4.pas.31: End ;
00523AEC 8BC2 mov eax,edx
00523AEE C3 ret
对比书中C的反汇编代码,Delphi反汇编出来的代码很精简,虽然声明了局部变量,但是函数直接用寄存器代替了.很好.

书中C循环体先直接用Jmp跳过去与临界变量比较,然后再来看是否执行循环体,而改变循环变量它用了add eax,1,然后再把eax传给栈上面的I.

后来我尝试改成0 to -1 Delphi编译器会识别出来,然后不会添加任何循环代码到函数中去的.

接下来是do循环,也就是Repeat
function TestRepeat(a,b:Integer):Integer ;
var
I:Integer;
begin
Result:=a + b;
I:=0;
repeat
Result:= Result + I;
Inc(I);
until I = 50;
end;
反汇编代码:
Unit4.pas.30: Result:=a + b;
00523AE0 03D0 add edx,eax
Unit4.pas.31: I:=0;
00523AE2 33C0 xor eax,eax
Unit4.pas.33: Result:= Result + I;
00523AE4 03D0 add edx,eax
Unit4.pas.34: Inc(I);
00523AE6 40 inc eax
Unit4.pas.35: until I = 50;
00523AE7 83F832


相关文档:

Oracle性能优化与Delphi代码

Oracle性能优化与Delphi代码

刚学了点oracle方面的知识,感觉以前写代码只凭喜好写,完全没有深究缘由,导致在内行人看来,写的都是垃圾代码,现在就把学到的一些东西写出来,也算是给刚入门的朋友一点帮助吧。
以前,写数据库访问代码,感觉很简单,不就是sql语句嘛,所以什么语句都是这样写:
A:
 
......

delphi中的realAudio ActiveX控件的使用

delphi中的realAudio ActiveX控件的使用
作者:seeker 日期:2009-04-26
1:{=====================打开=========================}
procedure TRealOneFrm.OpenBtnClick(Sender: TObject);
begin
if OpenRMDlg.Execute then
begin
RealAudio1.SetSource(RealOneFrm.OpenRMDlg.FileName);
RealAudio1.DoPlay;
EndPos ......

在Delphi程序中操作注册表(转)

   32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息。     
    一、创建和释放TRegistry对象  
   
    1.创建TRegistry对象。为了操作注册表,要创建一个TRegistry对象:ARegistry   :=   TRegistry.Create;  
&n ......

Delphi动态事件深入分析

Delphi动态事件深入分析
2009-2-7
作者:不得闲
核心提示:本实验证明了在类中方法的调用时候,所有的方法都隐含了一个Self参数,并且该参数作为对象方法的第一个参数传递...
首先做一个空窗体,放入一Button。
在implementation下面声明两个方法如下:
//外部方法,只声明一个参数,此时按照标准的对象内部事件方法T ......

15本Delphi书籍(PDF格式)下载 (转)

15本Delphi书籍(PDF格式)下载 (转)

文件名:  Delphi组件参考大全.rar
下载地址:  http://www.rayfile.com/files/678ca1e3-f73f-11de-9d02-0014221b798a/
文件名:  Delphi信息系统开发实例精选.rar
下载地址:  http://www.rayfile.com/files/fb328f02-f73e-11de-8a76-0014221b798a/
文件名 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号