2012-01-02 21 views
10

Parece que hay una constante no documentada eof en contexto de bloque asm. Esto se probó usando Delphi 7.Constante ensambladora Delphi 'eof'

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

Esto imprime 14.

¿De dónde viene esa constante eof y su valor de valor $0E o 14?


EDIT: este es el resultado de la compilación

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

Respuesta

5

Eof es en realidad un function defined in the System unit.

En las implementaciones de Delphi que tengo a la mano, Delphi 6 y XE2, Eof se implementa como un intrinsic routine que resulta en una llamada a una de las siguientes funciones, según sea apropiado:

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

tengo no hay idea de por qué su código ensamblador se convierte en mov [...],$0000000e. Señala en un comentario que la unidad System hace uso de eof en el código asm, por ejemplo en TextOpen. El mismo código en XE2 ahora es Pascal puro y busca un valor de $1A en lugar de $0E. Esto parecería ser un detalle de implementación. Si quiere entender por qué es así, entonces creo que necesitará realizar una ingeniería inversa del código en la unidad System, o ver si los ingenieros de Embarcadero le explicarán la implementación.

+0

Esto también se usa en 'system.pas'. Ver la función 'TextOpen'. Después de '// if (f.Buffer [i] == eof)'. Línea 'CMP byte ptr [ESI] .TTextRec.Buffer [EAX], eof'. – Egon

+0

Estrictamente hablando, es un built-in. El builtin llama al rtl helper, que son las funciones que usted especifica, pero también puede generar código y llamar a otras funciones (por ejemplo, iotest). El EOF podría ser un número de secuencia interno para el built-in, para ayudar a simplificar múltiples integradas que son similares (por ejemplo, todos los builtins IOCheck/IOTest) pero sin fuente de compilación que sea conjetural. –

+0

Y en XE2, el código equivalente busca '$ 1A'. Esto es claramente un detalle de implementación en System.pas. ¿Qué problema estás tratando de resolver o es solo por curiosidad? –