2015-06-11 26 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

是的,事实上,你的代码编译应该被认为是一种错误。

相关问题