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

Joh*_*ica 7 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.
Run Code Online (Sandbox Code Playgroud)

该程序输出各种东西,除了4/8.

这是一个错误还是记录在一起我不能在汇编程序中使用SizeOf和其他编译器内在函数?
如果我想SizeOf(xx)在asm块中使用我该怎么办?

Dav*_*nan 7

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

SizeOf您需要使用type程序集表达式运算符的情况下:

add eax, type NativeInt
Run Code Online (Sandbox Code Playgroud)

或者确实:

function Test: integer;
asm
  mov eax, type NativeInt
end;
Run Code Online (Sandbox Code Playgroud)

此功能按预期执行.

这里的文档:汇编表达式,表达式运算符.

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