gpt4 book ai didi

delphi - 选择退出是什么意思?

转载 作者:行者123 更新时间:2023-12-03 14:59:54 25 4
gpt4 key购买 nike

查看调用堆栈我刚刚注意到这一点:

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

最佳答案

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

考虑这个程序:

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 位中,可以通过使用 ??? 来明确这一点。我不知道为什么在 64 位中使用文本 Opt.out,但它的含义很清楚。

关于delphi - 选择退出是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31023390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com