读书人

哪位高手帮小弟我详细地讲解一下这段代

发布时间: 2013-09-05 16:02:06 作者: rapoo

谁帮我详细地讲解一下这段代码的汇编指令的意思,我汇编还在学习中,很菜。。。
如题:

11: _snprintf(cBuf, MAX_LEN, "%d: %s", nPid, cBuf); /* cBuf既是源又是目标,函数使用不安全 */
0040D770 lea ecx,[ebp-404h]
0040D776 push ecx
0040D777 mov edx,dword ptr [ebp-408h]
0040D77D push edx
0040D77E push offset string "sizeof(a):%d\n" (0042201c)
0040D783 push 400h
0040D788 lea eax,[ebp-404h]
0040D78E push eax
0040D78F call _snprintf (00406f20)
0040D794 add esp,14h

[解决办法]


_snprintf(cBuf, MAX_LEN, "%d: %s", nPid, cBuf); /* cBuf既是源又是目标,函数使用不安全 */
0040D770 lea ecx,[ebp-404h]//cBuf的地址
0040D776 push ecx //cBuf的地址入栈
0040D777 mov edx,dword ptr [ebp-408h]
0040D77D push edx//nPid入栈
0040D77E push offset string "sizeof(a):%d\n" (0042201c) //"%d: %s"地址入栈
0040D783 push 400h//MAX_LEN入栈
0040D788 lea eax,[ebp-404h]
0040D78E push eax//cbuf入栈
0040D78F call _snprintf (00406f20)//调用函数
0040D794 add esp,14h//出栈




[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:


_snprintf(cBuf, MAX_LEN, "%d: %s", nPid, cBuf); /* cBuf既是源又是目标,函数使用不安全 */
0040D770 lea ecx,[ebp-404h]//cBuf的地址
0040D776 push ecx //cBuf的地址入栈
0040D777 mov edx,dword ptr [ebp-408h]
0040D77D push edx//nPid入栈
0040D77E push offset string "sizeof(a):%d\n" (0042201c) //"%d: %s"地址入栈
0040D783 push 400h//MAX_LEN入栈
0040D788 lea eax,[ebp-404h]
0040D78E push eax//cbuf入栈
0040D78F call _snprintf (00406f20)//调用函数
0040D794 add esp,14h//出栈


是什么样的执行过程导致出现了这个结果:0: 0: 0: 0: 0: 的,我大致明白是什么原因,但是想弄清楚其具体的过程。。。

直接看源码,不要看汇编。 源码都够复杂,应该有个有限状态机。

建议查看函数的使用手册。

我的意思不是说要把每一行的执行过程都讲清楚,就是具体地说一下是什么步骤出现这个结果,先干什么,再干什么,最后干什么出现这个结果的。。。

什么结果?
不就是参数从右往左依次进栈,call fun,然后再由调用者平衡堆栈吗?
汇编代码很直接了当嘛

我是说的结果是这句代码出现0: 0: 0: 0: 0: 的这个结果

sprintf,memcpy,这类函数如果源地址和目标一样,结果是未定义的。最好不要这样用。
如果非要纠结结果,从你给出的汇编代码是不够的,你得给出
_snprintf (00406f20)
的汇编代码(最好是C源代码)

读书人网 >C语言

热点推荐