2012-01-02 27 views
10

Asm bloğu bağlamında belgesiz bir sabit eof görünüyor. Bu Bu 14 yazdırır Delphi 7.Delphi assembler sabiti 'eof'

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

kullanılarak test edilmiştir.

Bu sabit eof ve değeri $0E veya 14 değeri nereden geliyor?


DÜZENLEME: Bu

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

cevap

5

Eof aslında bir function defined in the System unit içindedir derleme sonucudur.

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

ben: I eldeki Delphi 6 ve Xe2 Eof aşağıdaki işlevlerden birini bir çağrı ile sonuçlanan bir intrinsic routine olarak uygulanır, uygun olduğu hallerde Delphi uygulamalarda

assembler kodunuzun neden mov [...],$0000000e'a dönüştüğüne dair hiçbir fikriniz yok. System biriminin kodundaki eof kodunu kullandığını, örneğin TextOpen numaralı telefon numarasını kullandığınızı belirttiniz. XE2'deki aynı kod şimdi saf Pascal'dır ve $0E yerine $1A değerini arar. Bu, uygulama detayı olarak görülüyor. Bunun neden böyle olduğunu anlamak istiyorsanız, o zaman System birimindeki kodu tersine çevirmeniz veya Embarcadero'daki mühendislerin uygulamayı size açıklayıp uygulamadığını kontrol etmeniz gerektiğini düşünüyorum.

+0

Bu aslında 'system.pas' içinde de kullanılır. 'TextOpen' işlevine bakın. // if (f.Buffer [i] == eof) 'dan sonra. Satır CMP bayt ptr [ESI] .TextRec.Buffer [EAX], eof'. – Egon

+0

Kesinlikle, bu bir yerleşiktir. Yerleşik, belirttiğiniz işlevler olan rtl yardımcısını çağırır, ancak kod üretebilir ve başka işlevleri de (örn., Iotest) çağırabilir. EOF, benzer yapıdaki (örneğin, tüm IOCheck/IOTest yerleşkeleri), ancak tahmin edilen derleyici kaynağı olmaksızın birden çok yerleşik parçayı düzene koymaya yardımcı olmak amacıyla, yerleşik için bazı dahili sıra numarası olabilir. –

+0

Ve XE2'de, eşdeğer kod "$ 1A" için görünüyor. Bu, System.pas'ta açıkça uygulama detayıdır. Hangi sorunu çözmeye çalışıyorsunuz yoksa bu sadece meraktan yoksun. –