======================================================
注:本文源代码点此下载
======================================================
技术交流,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 03d0add edx,eax //执行a+b,但是我很奇怪为什么不用add eax,edx 这样最后就不用执行那句mov eax,edx了,节约一句
unit4.pas.29: for i := 0 to 49 do
00523ae2 33c0xor eax,eax //清除eax,来充当i这个循环变量
unit4.pas.30: result := result + i ;
00523ae4 03d0add edx,eax //累计和,并把循环变量+1,这里就是循环体的执行代码
00523ae6 40inc eax
unit4.pas.29: for i := 0 to 49 do
00523ae7 83f832cmp eax,$32 //边界比较,不等于就跳回去,继续执行循环体代码.
00523aea 75f8jnz $00523ae4 //看来还是再写个函数来看看
unit4.pas.31: end ;
00523aec 8bc2mov eax,edx
00523aee c3ret
对比书中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 03d0add edx,eax
unit4.pas.31: i:=0;
00523ae2 33c0xor eax,eax
unit4.pas.33: result:= result + i;
00523ae4 03d0add edx,eax
unit4.pas.34: inc(i);
00523ae6 40inc eax
unit4.pas.35: until i = 50;
00523ae7 83f832cmp eax,$32
00523aea 75f8jnz $00523ae4
unit4.pas.36: end;
00523aec 8bc2mov eax,edx
00523aee c3ret
我们发现反汇编代码和for是一样的.
这段代码就和vc反编译出来的差不多了,先执行循环体然后再比较边界.
好,看看while呢?
function testwhile(a, b: integer): integer;
var
i: integer;
begin
result:= a+ b;
i:= 0;
while i
反汇编代码:
unit4.pas.38: result:= a+ b;
00523ae0 03d0add edx,eax
unit4.pas.39: i:= 0;
00523ae2 33c0xor eax,eax
unit4.pas.42: result:= result+ i;
00523ae4 03d0add edx,eax
unit4.pas.43: inc(i);
00523ae6 40inc eax
unit4.pas.40: while i
我晕,居然还是一样的.也就是delphi里面3种循环执行效率是一样的吧.
而vc同样是先初始化循环变量,然后无条件跳转到边界检测,然后才执行循环体代码.
循环就这么多,以后该是条件判断
绿色通道:好文要顶关注我收藏该文与我联系

======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
本文通过Delphi编译器生成的反汇编代码,详细解析了for、do-while三种循环结构的实现方式及其效率对比。通过对具体代码示例的分析,展示了Delphi如何高效地处理不同类型的循环。
1351

被折叠的 条评论
为什么被折叠?



