2012-01-02 25 views
10

Dường như có một hằng số không có giấy tờ eof trong ngữ cảnh khối asm. Điều này đã được thử nghiệm bằng Delphi 7.hằng số bộ ghép Delphi 'eof'

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

Điều này in ra 14.

Hằng số đó ở đâu eof và giá trị giá trị của nó là $0E hoặc 14 đến từ đâu?


EDIT: đây là kết quả tổng hợp

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

Trả lời

5

Eof là trong thực tế, một function defined in the System unit.

Trong triển khai của Delphi mà tôi có trong tay, Delphi 6 và XE2, Eof được thực hiện như một intrinsic routine có kết quả trong một cuộc gọi đến một trong các chức năng sau, khi thích hợp:

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

Tôi có không có ý tưởng tại sao mã lắp ráp của bạn được chuyển thành mov [...],$0000000e. Bạn chỉ ra trong nhận xét rằng chính đơn vị System sử dụng mã số eof trong mã asm, ví dụ: TextOpen. Cùng một mã trong XE2 bây giờ là Pascal thuần túy và tìm kiếm một giá trị là $1A thay vì $0E. Điều này rất có vẻ là một chi tiết thực hiện. Nếu bạn muốn hiểu tại sao điều này là như vậy thì tôi nghĩ rằng bạn sẽ cần phải đảo ngược kỹ sư mã trong đơn vị System hoặc xem liệu các kỹ sư tại Embarcadero có giải thích việc triển khai cho bạn hay không.

+0

Điều này cũng thực sự được sử dụng trong 'system.pas'. Xem chức năng 'TextOpen'. Sau '// if (f.Buffer [i] == eof)'. Dòng 'CMP byte ptr [ESI] .TTextRec.Buffer [EAX], eof'. – Egon

+0

Nói đúng ra, nó được tích hợp sẵn. Trình dựng sẵn gọi trình trợ giúp rtl là các hàm mà bạn chỉ định, nhưng cũng có thể tạo mã và gọi các hàm khác (ví dụ: iotest). EOF có thể là một số thứ tự nội bộ cho bản dựng sẵn, để giúp hợp lý hóa nhiều bản dựng sẵn tương tự (ví dụ: tất cả các nội trang IOCheck/IOTest) nhưng không có nguồn trình biên dịch phỏng đoán. –

+0

Và trong XE2 mã tương đương tìm kiếm '$ 1A'. Đây là chi tiết thực hiện rõ ràng trong System.pas. Bạn đang cố gắng giải quyết vấn đề gì hoặc điều này chỉ là do tò mò. –