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
相关文档:
//Delphi部分
//回调函数定义
type TOnMyCallBack = procedure(data:pchar; id:Integer);stdcall;
//DLL中的导出函数声明
procedure StartCall(param: TOnMyCallBack(data:pchar; id:Integer);stdcall;
begin
...
...
end;
&n ......
Delphi中实现全角转半角
function SbctoDbc(s:string):string;
var
nlength,i:integer;
str,ctmp,c1,c2:string;
{
在windows中,中文和全角字符都占两个字节,
并且使用了ascii chart 2
(codes 128 - 255
)。
全角字符的第一个字节总是 ......
常用的BCB & Delphi 函数
关键字:BCB,delphi,函数
作者:鲁小班 更新:2003-08-12 浏览:12686
翻译的不好,请见谅。
翻译:鲁小班
文件: ActnList
CreateAction 函数 创建一个指定类型的Action,显示在action list editor中。
EnumRegisteredAction 过程 枚举已经注册的 ......
有些时候,要写一些程序,在 JAVA 里面好难实现, 但如果使用其它编程语言却又比较容易时,我们不妨通过 JNI 来让不同语言的程序共同完成.
JNI 的教程, 网上 C 的比较多,Java 也提供了 javah.exe 为 C 语言的 JNI 程序生成头文件, 如果你是一个 Delphi 编程员, 能否让 JAVA 与 Delphi 程序交互呢? 答案是肯定的,今天我们就来 ......