⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_18335.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:18335 发表者:xiongli 发表日期:2002-10-19 20:07:02
<br>主题:c编译到汇编的语句对比问题
<br>内容:请高手给我解释一下几个c语言到汇编原代码中间我觉得迷惑的地方,谢谢。我的解释和问题我写在&lt;&gt;中,而且编号<BR><BR><BR><BR>--- E:\term3\mas.c&nbsp;&nbsp;----------------------------------------------------------------------------------------------------<BR>1:&nbsp;&nbsp;&nbsp;&nbsp;int ff();<BR>2:&nbsp;&nbsp;&nbsp;&nbsp;int main()<BR>3:&nbsp;&nbsp;&nbsp;&nbsp;{<BR>0040B4F0&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;保存基地址&gt;<BR>0040B4F1&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp,esp&nbsp;&nbsp;&nbsp;&nbsp; 〈设定新的基地址 问题1:为什么用sp??&gt;<BR>0040B4F3&nbsp;&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,50h&nbsp;&nbsp;&nbsp;&nbsp; &lt;设定stack顶位置,开辟50h个空间&gt;<BR>0040B4F6&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;save ebx&gt;<BR>0040B4F7&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;save esi&gt;<BR>0040B4F8&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;save edi&gt;<BR>0040B4F9&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edi,[ebp-50h]&nbsp;&nbsp;&nbsp;&nbsp;&lt;保存 rep stos起始空间&gt;<BR>0040B4FC&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,14h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;设定rep stos执行数目 问题3:为什么是14h&gt;<BR>0040B501&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,0CCCCCCCCh&nbsp;&nbsp;&lt;设定rep stos放进去的内容&gt;<BR>0040B506&nbsp;&nbsp; rep stos&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [edi] &lt;问题4:为什么要放具体的数进去?&gt;<BR>4:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *f;<BR>5:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x,y,z;<BR>6:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f=(char*)malloc(32*sizeof(char));<BR>0040B508&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20h&nbsp;&nbsp; &lt;传递malloc的参数&gt;<BR>0040B50A&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;malloc (004026d0) &lt;调用malloc&gt;<BR>0040B50F&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,4 &lt;问题5:为什么要add 4??因为如果不malloc就没有这句话&gt;<BR>0040B512&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-4],eax&lt;保存char *f&gt;<BR>7:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[20]='a';<BR>0040B515&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [ebp-4] &lt;取出*f&gt;<BR>0040B518&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [eax+14h],61h &lt;在f[20]放'a'&gt;<BR>8:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z=ff();<BR>0040B51C&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@ILT+5(_ff) (0040100a)&lt;调用ff() 问题6:为什么要先call一个<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp语句,然后再jmp到ff()的地址&gt;<BR>0040B521&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-10h],eax&nbsp;&nbsp;&lt;保存ff()返回结果&gt;<BR>9:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(z&gt;0)<BR>0040B524&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-10h],0&nbsp;&nbsp; &lt;比较&gt;<BR>0040B528&nbsp;&nbsp; jle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; main+3Ch (0040b52c)&nbsp;&nbsp; &lt;语句跳转&gt;<BR>10:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto test;<BR>0040B52A&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test (0040b539)&nbsp;&nbsp; &lt;语句跳转&gt;<BR>11:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=10;<BR>0040B52C&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-8],0Ah &lt;保存10到x&gt;<BR>12:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y=x;<BR>0040B533&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,dword ptr [ebp-8]&nbsp;&nbsp;&lt;保存x到ecx&gt;<BR>0040B536&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-0Ch],ecx &lt;保存ecx到y&gt;<BR>13:&nbsp;&nbsp; test:<BR>14:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(f);<BR>0040B539&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx,dword ptr [ebp-4] &lt;准备传递free()参数&gt;<BR>0040B53C&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;传递free()参数&gt;<BR>0040B53D&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free (00403110) &lt;调用free()&gt;<BR>0040B542&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,4&nbsp;&nbsp;&lt;问题7:为什么又要add 4???&gt;<BR>15:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<BR>0040B545&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,eax &lt;设定返回结果&gt;<BR>16:&nbsp;&nbsp; }<BR>0040B547&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp; &lt;load edi&gt;<BR>0040B548&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi&nbsp;&nbsp; &lt;load esi&gt;<BR>0040B549&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx&nbsp;&nbsp; &lt;load ebx&gt;<BR>0040B54A&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,50h &lt;问题8:为什么要add 50h而不是直接pop ebp&gt;<BR>0040B54D&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp,esp &lt;问题9:为什么要cmp然后在__cheksp,有什么用&gt;<BR>0040B54F&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__chkesp (0040b4b0)<BR>0040B554&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,ebp &lt;load esp&gt;<BR>0040B556&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp&nbsp;&nbsp;&lt;load ebp&gt;<BR>0040B557&nbsp;&nbsp; ret<BR>--- No source file&nbsp;&nbsp;------<BR><BR><BR>里面f()具体内容我没贴上来,不知道我的分析有什么不对的地方,我的麻烦大家了,回答了我还会专门再给200分的!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:^_^ 回复日期:2002-10-19 20:30:36
<br>内容:我自己的理解,不是正确答案哦^_^<BR><BR><BR>0040B4F1&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp,esp&nbsp;&nbsp;&nbsp;&nbsp; 〈设定新的基地址 问题1:为什么用sp??&gt;<BR>用ebp保存原堆栈指针<BR><BR>0040B50F&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,4 &lt;问题5:为什么要add 4??因为如果不malloc就没有这句话&gt;<BR>这是恢复栈指针,由于你<BR>0040B508&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20h&nbsp;&nbsp; &lt;传递malloc的参数&gt;<BR><BR>0040B542&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,4&nbsp;&nbsp;&lt;问题7:为什么又要add 4???&gt;<BR>同上<BR><BR>0040B54A&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,50h &lt;问题8:为什么要add 50h而不是直接pop ebp&gt;<BR>如果ebp发生了变化,pop ebp就不是原堆栈指针了,而且ebp没有入栈<BR><BR>0040B54D&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp,esp &lt;问题9:为什么要cmp然后在__cheksp,有什么用&gt;<BR>在这里就检查你的堆栈恢复情况
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:xiongli 回复日期:2002-10-19 20:42:27
<br>内容:你说的我都想通了,让我们等另外的几个问题的答案好了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2002-10-19 23:33:55
<br>内容:2: where ?<BR>3: 每次copy 4 个字节,要初始化 0x50 == 80 bytes 需要 0x14 == 20 次 copy.<BR>4: 依赖 complier options, 可以不初始化。<BR>6: 为了减少linker的工作量,如果函数地址变化了,要修改 N 次 <BR>&nbsp;&nbsp; __asm call 0x******** 指令 (******** 是地址)<BR>&nbsp;&nbsp; 用Jump Table只需要修改一次即可。<BR><BR>其它的不说了,看 Mr.LikeDrv 的即可.<BR>2002-10-19 23:34:41

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -