Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';在我看来,大会不是一致的吗?_C++_Visual Studio_Assembly - Fatal编程技术网

C++ 为什么';在我看来,大会不是一致的吗?

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

从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 (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吗