C++ 为什么';在我看来,大会不是一致的吗?
从visual studio中转储:C++ 为什么';在我看来,大会不是一致的吗?,c++,visual-studio,assembly,C++,Visual Studio,Assembly,从visual studio中转储: CheckPointer(pReceivePin,E_POINTER); 017D616D cmp dword ptr [ebp+0Ch],0 017D6171 jne CBasePin::Connect+4Dh (17D617Dh) 017D6173 mov eax,80004003h 017D6178 jmp CBasePin::Connect+1A7h (17D62D
CheckPointer(pReceivePin,E_POINTER);
017D616D cmp dword ptr [ebp+0Ch],0
017D6171 jne CBasePin::Connect+4Dh (17D617Dh)
017D6173 mov eax,80004003h
017D6178 jmp CBasePin::Connect+1A7h (17D62D7h)
但实际的定义是:
#define CheckPointer(p,ret) {if((p)==NULL) return (ret);}
虽然我的汇编不是很好,但我看不出源代码和asm之间有任何关系。
CheckPointer(pReceivePin,E_POINTER);
017D616D cmp dword ptr [ebp+0Ch],0
017D6171 jne CBasePin::Connect+4Dh (17D617Dh)
017D6173 mov eax,80004003h
017D6178 jmp CBasePin::Connect+1A7h (17D62D7h)
precivepin
恰好位于存储在堆栈上的地址-它通常通过使用ebp
中的值存储进行间接访问
将该值与null进行比较,如果该值为null(jne
未生效),则E_指针的实际值将移动到eax
(eax
用于存储函数的返回值),并将控制传递到函数尾声,在该尾声中完成清理,然后将控制返回给调用方(ret
指令)。如果precivepin
的值不为空(jne
确实启动),控制权将传递到另一个位置,在该位置存储发生在CheckPointer
之后的代码,然后执行该代码。
CheckPointer(pReceivePin,E_POINTER);
017D616D cmp dword ptr [ebp+0Ch],0
017D6171 jne CBasePin::Connect+4Dh (17D617Dh)
017D6173 mov eax,80004003h
017D6178 jmp CBasePin::Connect+1A7h (17D62D7h)
precivepin
恰好位于存储在堆栈上的地址-它通常通过使用ebp
中的值存储进行间接访问
将该值与null进行比较,如果该值为null(jne
未生效),则E_指针的实际值将移动到eax
(eax
用于存储函数的返回值),并将控制传递到函数尾声,在该尾声中完成清理,然后将控制返回给调用方(ret
指令)。如果precivepin
的值不为空(jne
不起作用)控件被传递到另一个位置,在该位置存储发生在检查点之后的代码,然后执行该代码。您需要提供更多的上下文,但很可能最后一行跳转到CBasePin::Connect函数的结束部分,该函数随后很快执行RET。这与宏的逻辑。如果指针不为零(即null),则第二行在最后一行之后跳转.您需要提供更多的上下文,但很有可能,最后一行跳转到CBasePin::Connect函数的结束部分,后面紧接着一个RET。这与宏的逻辑非常一致。如果指针不为零(即null),第二行就在最后一行之后跳转.您遗漏的内容太多,很难确定,但可以排序的部分看起来合理。NULL==0,因此:
017D616D cmp dword ptr [ebp+0Ch],0 ; if [ebp+0ch] == 0
017D6171 jne CBasePin::Connect+4Dh (17D617Dh) ; goto 172617dh
017D6173 mov eax,80004003h ; else load 'ret'
017D6178 jmp CBasePin::Connect+1A7h (17D62D7h) ; and return it.
明显的问题是,您没有向我们显示17D617Dh或17D62D7h的值,因此我们无法真正猜测这些值的实际值。您遗漏的内容太多,很难确定,但可以排序的部分看起来合理。NULL==0,因此:
017D616D cmp dword ptr [ebp+0Ch],0 ; if [ebp+0ch] == 0
017D6171 jne CBasePin::Connect+4Dh (17D617Dh) ; goto 172617dh
017D6173 mov eax,80004003h ; else load 'ret'
017D6178 jmp CBasePin::Connect+1A7h (17D62D7h) ; and return it.
明显的问题是,您没有向我们展示17D617Dh或17D62D7h的功能,因此我们无法真正猜测这些值的实际功能。组件看起来非常好
cmp dword ptr[ebp+0Ch],0
是precivepin
与NULL
的比较precivepin
是函数内部的一个局部变量,因此它的地址是从函数堆栈帧开始的偏移量。ebp
保存堆栈帧开始的地址。0Ch
是precivepin的偏移量
在堆栈框架内。函数中的所有局部变量将被寻址为[ebp-something]
,参数除外。参数通常被寻址为[ebp-something]
mov eax,80004003h
只不过是放入函数“返回值”区域的E_指针
值(寄存器eax
用于此目的)
最后一个jmp
将控制发送到当前函数的尾声代码(CBasePin::Connect
),该函数以ret
命令结束(并“返回”当前eax
值,即e_指针
)
中间的jne
会在宏之后立即将控件感测到代码,如果precivepin
不等于E_指针
,则程序集看起来非常好
cmp dword ptr[ebp+0Ch],0
是precivepin
与NULL
的比较precivepin
是函数内部的一个局部变量,因此它的地址是从函数堆栈帧开始的偏移量。ebp
保存堆栈帧开始的地址。0Ch
是precivepin的偏移量
在堆栈框架内。函数中的所有局部变量将被寻址为[ebp-something]
,参数除外。参数通常被寻址为[ebp-something]
mov eax,80004003h
只不过是放入函数“返回值”区域的E_指针
值(寄存器eax
用于此目的)
最后一个jmp
将控制发送到当前函数的尾声代码(CBasePin::Connect
),该函数以ret
命令结束(并“返回”当前eax
值,即e_指针
)
中间的jne
会在宏之后立即感知对代码的控制,如果precivepin
不等于E_指针
,ret
,为什么你要提到ret
,在我的vs转储中没有这样的指令,对吗?@ollydbg:它在其他地方。试着调用precivepin
为空的代码-代码会执行jne
并到达ret
所在的epligue。为什么你提到ret
,我的vs转储中没有这样的指令,对吗?@ollydbg:它在其他地方。尝试调用previvepin
为空的代码-代码将执行jne
并到达ret
所在的epligue。为什么是precivepi吗