delphi – Opt.out是什么意思?
发布时间:2020-12-15 09:52:48 所属栏目:大数据 来源:网络整理
导读:看着调用堆栈我刚才注意到了这一点: 注意顶部的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:Windowssystem32kernel32.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:Windowssystem32kernel32.dll :00000000773CB981 ; ntdll.dll 调试器告诉你的是参数到达寄存器.一旦执行了asm函数的主体,它就无法控制对寄存器的操作.因此它拒绝尝试报告参数值. 如果切换到32位编译器,并更改调用约定以使参数到达堆栈而不是寄存器,则行为是不同的.在这种情况下,调试器会自信地报告参数值,因为它认为您不会丢弃堆栈. 在32位中,使用???表明了这一点.为什么文本Opt.out用于64位我不知道,但它的含义很清楚. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |