2015-06-11 32 views
7

這是一個編譯器錯誤?爲什麼我不能在asm塊中使用編譯器內部函數?

program Project44; 
{$APPTYPE CONSOLE} 
uses 
    System.SysUtils; 

function Test: integer; 
asm 
    xor eax,eax 
    add eax,SizeOf(NativeInt); 
end; 

begin 
    WriteLn(Test); //Typically outputs 31 or 49 
    {$ifdef CPUX86} 
    WriteLn('should be 4'); 
    {$else} 
    {$ifdef CPUX64} 
    WriteLn('should be 8'); 
    {$endif}{$endif} 
    ReadLn 
end. 

該程序輸出各種東西,除了4/8。

這是一個錯誤,或者它記錄的是我不能在彙編使用sizeof和其他編譯器內在?
如果我想使用SizeOf(xx)在ASM塊我該怎麼辦?

+0

我猜你的代碼只是一個示例是,所以把這個作爲一個旁註;在這種情況下,你可以聲明一個常量。 – TLama

回答

7

,因爲它們是由Delphi編譯器而非彙編處理不能使用編譯器內在。內部函數由Pascal編譯器處理和解析Pascal表達式解析,然後發出代碼。這是編譯器的工作,而不是彙編器。至少,這是我的心智模式。

SizeOf的情況下,你需要使用type組裝表達式運算符:

add eax, type NativeInt 

或者確實:

function Test: integer; 
asm 
    mov eax, type NativeInt 
end; 

此功能,你期望執行。

文檔在這裏:Assembly Expressions, Expression Operators

是的,事實上,你的代碼編譯應該被認爲是一種錯誤。

相關問題