Opt.out 是什么意思?

What does Opt.out mean?

查看调用堆栈,我刚刚注意到:

注意顶部的 Opt.out

只是好奇,Opt.out 是什么意思?

这是我正在逐步执行的代码段:

function BinaryEquals(Left, Right: pointer; Size: integer): boolean;
....
{$IFDEF CPUX64}
asm
 ....
  sub r8,4
@loop1:
  inc  R8

我不确定助记符是什么意思,但调用堆栈告诉您的是它无法可靠地报告参数值。

考虑这个程序:

procedure Foo(Bar: Pointer);
asm
  xor eax,eax
end;

begin
  Foo(nil);
end.

步入Foo。当你这样做时,调用堆栈在 32 位中看起来像这样:

Project1.Foo(nil)
Project1.Project1
:76f5337a kernel32.BaseThreadInitThunk + 0x12
:775b92e2 ntdll.RtlInitializeExceptionChain + 0x63
:775b92b5 ntdll.RtlInitializeExceptionChain + 0x36

这是 64 位的:

Project1.Foo(nil)
Project1.Project1
:00000000772959CD ; C:\Windows\system32\kernel32.dll
:00000000773CB981 ; ntdll.dll

然后跨过Foo的第一行。现在 32 位的调用堆栈看起来像这样:

Project1.Foo(???)
Project1.Project1
:76f5337a kernel32.BaseThreadInitThunk + 0x12
:775b92e2 ntdll.RtlInitializeExceptionChain + 0x63
:775b92b5 ntdll.RtlInitializeExceptionChain + 0x36

这是 64 位的:

Project1.Foo(Opt.out)
Project1.Project1
:00000000772959CD ; C:\Windows\system32\kernel32.dll
:00000000773CB981 ; ntdll.dll

调试器告诉您的是参数到达了寄存器。一旦执行了 asm 函数体,它就无法控制您对寄存器的操作。因此它拒绝尝试报告参数值。

如果您切换到 32 位编译器,并更改调用约定以使参数到达堆栈而不是寄存器,则行为会有所不同。在那种情况下,调试器有信心报告参数值,因为它相信您不会破坏堆栈。

在32位中使用???表示清楚。为什么文本 Opt.out 在 64 位中使用我不知道,但它的意思很清楚。