Opt.out是什么意思?

7

看着调用堆栈我刚刚注意到这个:

enter image description here

注意顶部的Opt.out

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

这是我正在跟踪的片段:

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

@Uli 这可能是正确的。在问题示例中,args 不可用的原因与优化器无关。但通常情况下,优化器很可能是 args 不可用的最常见原因。也许调试器开发人员认为没有必要更具体地说明。 - David Heffernan
1个回答

8
我不确定助记符的含义,但调用堆栈告诉你的是它无法可靠地报告参数的值。
考虑以下程序:
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
调试器告诉您的是参数已经存储在寄存器中。一旦汇编函数体被执行,它就无法控制您对寄存器的使用。因此,它拒绝尝试报告参数值。
如果您切换到32位编译器,并更改调用约定以使参数通过堆栈而不是寄存器到达,则行为会有所不同。在这种情况下,调试器感到自信报告参数值,因为它认为您不会破坏堆栈。
在32位系统中,使用 ??? 明确表示了这一点。我不知道为什么在64位系统中使用文本 Opt.out,但其含义是清楚的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接