Joh*_*ica 6 delphi debugging callstack delphi-xe7
看着调用堆栈我刚才注意到了这一点:

请注意Opt.out顶部.
只是好奇,什么Opt.out意思?
这是我要介绍的片段:
function BinaryEquals(Left, Right: pointer; Size: integer): boolean;
....
{$IFDEF CPUX64}
asm
....
sub r8,4
@loop1:
inc R8
Run Code Online (Sandbox Code Playgroud)
我不确定助记符的含义,但调用堆栈告诉你的是它无法可靠地报告参数的值.
考虑这个程序:
procedure Foo(Bar: Pointer);
asm
xor eax,eax
end;
begin
Foo(nil);
end.
Run Code Online (Sandbox Code Playgroud)
走进去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位中使用我不知道,但它的含义很清楚.