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 位中使用我不知道,但它的意思很清楚。
查看调用堆栈,我刚刚注意到:
注意顶部的 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 位中使用我不知道,但它的意思很清楚。