Delphi汇编程序常量'eof'

时间:2012-01-02 16:06:15

标签: delphi assembly delphi-7

在asm块上下文中似乎有一个未记录的常量eof。这是使用Delphi 7测试的。

program TestEof;
{$APPTYPE CONSOLE}
var
  example : Integer;
begin
  asm
    mov example, eof
  end;
  writeln(example);
  readln;
end.

打印出14

常量eof及其值$0E14来自何处?


编辑:这是编译结果

...
call @InitExe
// mov example, eof
mov [example], $0000000e
// writeln(example)
mov eax, [$004040a4]
mov edx, [example]
call @Write0Long
call @WriteLn
call @_IOTest
// readln;
...

1 个答案:

答案 0 :(得分:5)

Eof实际上是function defined in the System unit

在我手头的Delphi实现中,Delphi 6和XE2 Eof被实现为intrinsic routine,导致调用以下函数之一,视情况而定:

function _EofFile(var f: TFileRec): Boolean;
function _EofText(var t: TTextRec): Boolean;

我不知道为什么汇编程序代码变成了mov [...],$0000000e。您在评论中指出System单元本身在eof代码中使用了asm,例如在TextOpen中。 XE2中的相同代码现在是纯Pascal,并且搜索$1A而不是$0E的值。这似乎是一个实现细节。如果您想了解为什么会这样,那么我认为您需要对System单元中的代码进行反向工程,或者看看Embarcadero的工程师是否会向您解释实施。