2012-01-02 5 views
10

asm 블록 컨텍스트에 문서화되지 않은 상수 eof이있는 것 같습니다. 이것은 Delphi 7을 사용하여 테스트되었습니다.델파이 어셈블러 상수 'eof'

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; 
... 

답변

5

Eof 사실 function defined in the System unit에있는 컴파일 결과입니다.

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

I가있다 : I가 손 델파이 6 XE2, Eof 다음 기능들 중 하나에 대한 호출 결과 intrinsic routine로서 구현되는, 적절한있는 델피의 구현에서

왜 어셈블러 코드가 mov [...],$0000000e으로 바뀌 었는지 전혀 알 수 없습니다. 당신은 System 단위 자체가 코드에서 eof을 사용한다는 의견에서, 예를 들어 TextOpen으로 지적합니다. XE2의 동일한 코드는 현재 순수 파스칼이며 $0E 대신 $1A 값을 검색합니다. 이것은 구현 세부 사항 인 것처럼 보입니다. 왜 그런지 이해하고 싶다면 System 유닛의 코드를 리버스 엔지니어링하거나 Embarcadero의 엔지니어가 구현 방법을 설명하는지 확인해야합니다.

+0

실제로 이것은'system.pas'에서도 실제로 사용됩니다. TextOpen 함수를 참조하십시오. '// if (f.Buffer [i] == eof)'다음에. Line'CMP 바이트 ptr [ESI] .TTextRec.Buffer [EAX], eof'. – Egon

+0

엄밀히 말하면 내장되어 있습니다. 내장 함수는 사용자가 지정한 함수 인 rtl 도우미를 호출하지만 코드 생성과 다른 함수 (예 : iotest) 호출도 할 수 있습니다. EOF는 비슷한 (예 : 모든 IOCheck/IOTest 기본 제공)의 여러 내장 함수를 간소화하는 데 도움이되는 내장 함수의 내부 시퀀스 번호 일 수 있지만 컴파일러 소스는 추측입니다. –

+0

그리고 XE2에서 등가 코드는'$ 1A'을 찾습니다. 이것은 System.pas의 구현 세부 사항입니다. 어떤 문제를 해결하려고하는지 아니면 호기심에서 벗어난 것입니까? –