Константа ассемблера Delphi 'eof' - PullRequest
10 голосов
/ 02 января 2012

Кажется, что есть недокументированная константа eof в контексте блока 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;
...

1 Ответ

5 голосов
/ 02 января 2012

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 реализацию

.
...