这是编译器错误吗?
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块中使用我该怎么办?
您不能使用编译器内在函数,因为它们由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)
此功能按预期执行.
这里的文档:汇编表达式,表达式运算符.
是的,您的代码编译的事实应该被视为一个错误.
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |