在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
技术交流,DH讲解. 哈哈,我承认我是标题党. 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反汇编出来的代码很精简,虽然声明了局部变量,但是函数直接用寄存器代替了.很好. 接下来是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 cmp eax,$32 00523AEA 75F8 jnz $00523ae4 Unit4.pas.36: end; 00523AEC 8BC2 mov eax,edx 00523AEE C3 ret 我们发现反汇编代码和For是一样的. Function TestWhile(A, B: Integer): Integer; Var I: Integer; Begin Result:= A+ B; I:= 0; While I< 50 Do Begin Result:= Result+ I; Inc(I); End; End; 反汇编代码: Unit4.pas.38: Result:= A+ B; 00523AE0 03D0 add edx,eax Unit4.pas.39: I:= 0; 00523AE2 33C0 xor eax,eax Unit4.pas.42: Result:= Result+ I; 00523AE4 03D0 add edx,eax Unit4.pas.43: Inc(I); 00523AE6 40 inc eax Unit4.pas.40: While I< 50 Do 00523AE7 83F832 cmp eax,$32 00523AEA 7CF8 jl $00523ae4 Unit4.pas.45: End; 00523AEC 8BC2 mov eax,edx 00523AEE C3 ret 我晕,居然还是一样的.也就是Delphi里面3种循环执行效率是一样的吧. |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论