为什么我不能在asm块中使用编译器内在函数?

时间:2015-06-11 21:00:49

标签: delphi assembly

这是编译器错误吗?

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)我该怎么办?

1 个答案:

答案 0 :(得分:7)

您不能使用编译器内在函数,因为它们由Delphi编译器而不是汇编程序处理。通过Pascal编译器处理和解析Pascal表达式,然后发出代码来解析内在函数。这是编译器而不是汇编程序的工作。至少,这是我的心理模型。

对于SizeOf,您需要使用type程序集表达式运算符:

add eax, type NativeInt

或者确实:

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

此功能按预期执行。

此处的文档:Assembly Expressions, Expression Operators

是的,您的代码编译的事实应该被视为一个错误。