关于length(S)函数,你能回答吗?(100分)

  • 主题发起人 主题发起人 zj1978
  • 开始时间 开始时间
Z

zj1978

Unregistered / Unconfirmed
GUEST, unregistred user!
&nbsp; 大家都用过function Length(S): Integer;这个函数吧,但是在delphi内部是怎么实现的呢?<br>&nbsp; &nbsp;我今天就没找到他的实现(帮助里说在system.pas),<br>&nbsp; &nbsp;所以我跟了一下<br>&nbsp; &nbsp;用count:=length('aa');<br>&nbsp; &nbsp;cpu显示 &nbsp;004D95A8 BB0200000 &nbsp;mov ebx $00000002<br>&nbsp; &nbsp;直接将2就赋过来了,莫非编译器内部直接把这个函数给处理了???<br><br>&nbsp; &nbsp;假如写成 &nbsp;<br>&nbsp; &nbsp;aa:=inttostr(random(10000));<br>&nbsp; &nbsp;j:=length(aa);<br>&nbsp; &nbsp;cpu为 &nbsp;<br>&nbsp; &nbsp; mov eax,[ebp-$04]<br>&nbsp; &nbsp; call @LStrLen<br>&nbsp; &nbsp; Mov &nbsp;ebx,eax<br>&nbsp; 可以看到调用了位于system.pas &nbsp;6042行这个函数<br>&nbsp; function &nbsp; &nbsp; &nbsp; &nbsp;_LStrLen{str: AnsiString}: Longint; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br>&nbsp; 那么是怎么调用了,到底是怎么绕到这个上来的?是不是编译器内部在操作?<br>&nbsp; 还有一个问题就是system.pas中有很多以 &nbsp;' _ &nbsp;'打头的汇编函数,那么他们的特殊性在那里?<br><br><br>&nbsp;
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=139871
 
var<br>&nbsp; Str:String;<br>begin<br>&nbsp; Str:='abc'+Caption;<br>&nbsp; Tag:=Length(Str);<br>//mov eax,[ebp-$04]<br>//call @LStrLen<br>// &nbsp;test eax,eax<br>// &nbsp;jz @LStrLen + $7 &nbsp; &nbsp;如果字符串为nil...<br>// &nbsp;mov eax,[eax-$04] &nbsp; 将长度信息写入eax<br>// &nbsp;ret<br>&nbsp; Caption:=IntToHex(DWord(@Str[1]),8); //Str的地址:00CB3418 &nbsp;与上面的eax相同<br>end;<br><br>&nbsp; Delphi中的字符串的存储方式为:-3..0 Byte,共4Bytes,存放长度;1..N Byte存放字符数组。<br>字符串的实际指针指向字符数组的第一个成员。上面的LStrLen过程就是将字符串指针前面4Bytes<br>的信息放入EAX,获得了长度。<br><br>&gt;&gt;怎么绕到这个上来的<br>&nbsp; String类型是Pascal语言中非常特殊的类型,编译器对它有特殊的处理。<br><br>&gt;&gt;system.pas中有很多以'_'打头的汇编函数<br>&nbsp; Delphi编译器对它们进行了特殊处理,在编译时自动将其包含进来,不能在程序代码中直接调用。<br>(属于“编译器魔术”[:)]),New等标准Pascal过程也一样。
 
呵呵这个长度其实就是存放在字符串存放地址的负偏移处的4个字节,<br>当然是直接一 MOV 就过来了[:)]
 
都让你们给说了,我还说什么呵呵<br>
 
接受答案了.
 
后退
顶部