Константа ассемблера Delphi 'eof'

В контексте asm-блока существует недокументированная константа eof. Это было проверено с помощью Delphi 7.

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

Отпечатает 14.

Где эта константа eof и значение значения $0E или 14 исходит из?


EDIT: это результат компиляции

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

Ответ 1

Eof фактически является функцией определенной в блоке System.

В реализациях Delphi, которые я имею под рукой, Delphi 6 и XE2, Eof реализуется как внутренняя процедура, что приводит к вызову одного из следующие функции:

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

Я не знаю, почему ваш код ассемблера превращен в mov [...],$0000000e. Вы отмечаете в комментарии, что сам блок System использует код Eof в asm, например, в TextOpen. Тот же код в XE2 теперь является чистым Pascal и ищет значение $1A вместо $0E. Это очень похоже на детали реализации. Если вы хотите понять, почему это так, я думаю, вам нужно будет перепроектировать код в модуле System или посмотреть, объяснят ли разработчики Embarcadero вам эту реализацию.