在ASM块上下文中似乎有一个无证的常数.这是使用Delphi 7进行测试.
program TestEof; {$APPTYPE CONSOLE} var example : Integer; begin asm mov example,eof end; writeln(example); readln; end.
这打印出14.
那个常数eof和它的价值是$0E还是14来自哪里?
编辑:这是编译结果
... call @InitExe // mov example,eof mov [example],$0000000e // writeln(example) mov eax,[$004040a4] mov edx,[example] call @Write0Long call @WriteLn call @_IOTest // readln; ...
解决方法
Eof其实是
function defined in the
System
unit.
在Delphi 6中,Delphi 6和XE2的实现中,Eof被实现为intrinsic routine,可以调用以下功能之一:
function _EofFile(var f: TFileRec): Boolean; function _EofText(var t: TTextRec): Boolean;
我不知道为什么你的汇编代码变成mov […],$0000000e.您在注释中指出,系统单元本身在asm代码中使用eof,例如在TextOpen中. XE2中的相同代码现在是纯Pascal,搜索值为1A,而不是$0E.这似乎是一个实现细节.如果您想了解为什么会这样,那么我认为您需要对系统单元中的代码进行逆向工程,或者看看Embarcadero的工程师是否会向您解释实现.