2012-01-02 4 views
10

Sembra esserci una costante non documentata eof in contesto di blocco asm. Questo è stato testato utilizzando Delphi 7.Costante assemblatore Delphi 'eof'

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

Questo stampa 14.

dove che costante eof e il suo valore valore $0E o 14 viene?


EDIT: questo è il risultato della compilazione

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

risposta

5

Eof è in realtà un function defined in the System unit.

Nelle implementazioni di Delphi che ho a portata di mano, Delphi 6 e XE2, Eof è implementato come un intrinsic routine che si traduce in una chiamata a una delle seguenti funzioni, a seconda dei casi:

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

ho non ho idea del perché il tuo codice assembler sia stato trasformato in mov [...],$0000000e. Si segnala in un commento che l'unità System utilizza lo eof nel codice asm, ad esempio in TextOpen. Lo stesso codice in XE2 è ora puro Pascal e cerca il valore di $1A anziché $0E. Questo sembrerebbe essere un dettaglio di implementazione. Se vuoi capire perché è così, allora penso che dovrai eseguire il reverse engineering del codice nell'unità System o vedere se gli ingegneri di Embarcadero ti spiegheranno l'implementazione.

+0

Questo è effettivamente utilizzato anche in 'system.pas'. Vedi la funzione 'TextOpen'. Dopo '// if (f.Buffer [i] == eof)'. Riga 'CMP byte ptr [ESI] .TTextRec.Buffer [EAX], eof'. – Egon

+0

In senso stretto, è un built-in. Il builtin chiama l'helper rtl che sono le funzioni specificate dall'utente, ma può anche generare codice e chiamare altre funzioni (ad es. Iotest). L'EOF potrebbe essere un numero di sequenza interno per il build-in, per semplificare più built-in che sono simili (ad esempio tutti i builder IOCheck/IOTest) ma senza l'origine del compilatore che è congettura. –

+0

E in XE2 il codice equivalente cerca '$ 1A'. Questo è chiaramente il dettaglio di implementazione in System.pas. Che problema stai cercando di risolvere o è solo per curiosità. –