看着调用堆栈我刚刚注意到这个:
注意顶部的Opt.out
。
只是好奇,Opt.out
是什么意思?
这是我正在跟踪的片段:
function BinaryEquals(Left, Right: pointer; Size: integer): boolean;
....
{$IFDEF CPUX64}
asm
....
sub r8,4
@loop1:
inc R8
看着调用堆栈我刚刚注意到这个:
注意顶部的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调试器告诉您的是参数已经存储在寄存器中。一旦汇编函数体被执行,它就无法控制您对寄存器的使用。因此,它拒绝尝试报告参数值。
???
明确表示了这一点。我不知道为什么在64位系统中使用文本 Opt.out
,但其含义是清楚的。