这是编译器错误吗?
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和其他编译器内在函数?
如果我想在asm块中使用SizeOf(xx)
我该怎么办?
答案 0 :(得分:7)
您不能使用编译器内在函数,因为它们由Delphi编译器而不是汇编程序处理。通过Pascal编译器处理和解析Pascal表达式,然后发出代码来解析内在函数。这是编译器而不是汇编程序的工作。至少,这是我的心理模型。
对于SizeOf
,您需要使用type
程序集表达式运算符:
add eax, type NativeInt
或者确实:
function Test: integer;
asm
mov eax, type NativeInt
end;
此功能按预期执行。
此处的文档:Assembly Expressions, Expression Operators。
是的,您的代码编译的事实应该被视为一个错误。