📄 subject_18335.htm
字号:
<p>
序号:18335 发表者:xiongli 发表日期:2002-10-19 20:07:02
<br>主题:c编译到汇编的语句对比问题
<br>内容:请高手给我解释一下几个c语言到汇编原代码中间我觉得迷惑的地方,谢谢。我的解释和问题我写在<>中,而且编号<BR><BR><BR><BR>--- E:\term3\mas.c ----------------------------------------------------------------------------------------------------<BR>1: int ff();<BR>2: int main()<BR>3: {<BR>0040B4F0 push ebp <保存基地址><BR>0040B4F1 mov ebp,esp 〈设定新的基地址 问题1:为什么用sp??><BR>0040B4F3 sub esp,50h <设定stack顶位置,开辟50h个空间><BR>0040B4F6 push ebx <save ebx><BR>0040B4F7 push esi <save esi><BR>0040B4F8 push edi <save edi><BR>0040B4F9 lea edi,[ebp-50h] <保存 rep stos起始空间><BR>0040B4FC mov ecx,14h <设定rep stos执行数目 问题3:为什么是14h><BR>0040B501 mov eax,0CCCCCCCCh <设定rep stos放进去的内容><BR>0040B506 rep stos dword ptr [edi] <问题4:为什么要放具体的数进去?><BR>4: char *f;<BR>5: int x,y,z;<BR>6: f=(char*)malloc(32*sizeof(char));<BR>0040B508 push 20h <传递malloc的参数><BR>0040B50A call malloc (004026d0) <调用malloc><BR>0040B50F add esp,4 <问题5:为什么要add 4??因为如果不malloc就没有这句话><BR>0040B512 mov dword ptr [ebp-4],eax<保存char *f><BR>7: f[20]='a';<BR>0040B515 mov eax,dword ptr [ebp-4] <取出*f><BR>0040B518 mov byte ptr [eax+14h],61h <在f[20]放'a'><BR>8: z=ff();<BR>0040B51C call @ILT+5(_ff) (0040100a)<调用ff() 问题6:为什么要先call一个<BR> jmp语句,然后再jmp到ff()的地址><BR>0040B521 mov dword ptr [ebp-10h],eax <保存ff()返回结果><BR>9: if(z>0)<BR>0040B524 cmp dword ptr [ebp-10h],0 <比较><BR>0040B528 jle main+3Ch (0040b52c) <语句跳转><BR>10: goto test;<BR>0040B52A jmp test (0040b539) <语句跳转><BR>11: x=10;<BR>0040B52C mov dword ptr [ebp-8],0Ah <保存10到x><BR>12: y=x;<BR>0040B533 mov ecx,dword ptr [ebp-8] <保存x到ecx><BR>0040B536 mov dword ptr [ebp-0Ch],ecx <保存ecx到y><BR>13: test:<BR>14: free(f);<BR>0040B539 mov edx,dword ptr [ebp-4] <准备传递free()参数><BR>0040B53C push edx <传递free()参数><BR>0040B53D call free (00403110) <调用free()><BR>0040B542 add esp,4 <问题7:为什么又要add 4???><BR>15: return 0;<BR>0040B545 xor eax,eax <设定返回结果><BR>16: }<BR>0040B547 pop edi <load edi><BR>0040B548 pop esi <load esi><BR>0040B549 pop ebx <load ebx><BR>0040B54A add esp,50h <问题8:为什么要add 50h而不是直接pop ebp><BR>0040B54D cmp ebp,esp <问题9:为什么要cmp然后在__cheksp,有什么用><BR>0040B54F call __chkesp (0040b4b0)<BR>0040B554 mov esp,ebp <load esp><BR>0040B556 pop ebp <load ebp><BR>0040B557 ret<BR>--- No source file ------<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 mov ebp,esp 〈设定新的基地址 问题1:为什么用sp??><BR>用ebp保存原堆栈指针<BR><BR>0040B50F add esp,4 <问题5:为什么要add 4??因为如果不malloc就没有这句话><BR>这是恢复栈指针,由于你<BR>0040B508 push 20h <传递malloc的参数><BR><BR>0040B542 add esp,4 <问题7:为什么又要add 4???><BR>同上<BR><BR>0040B54A add esp,50h <问题8:为什么要add 50h而不是直接pop ebp><BR>如果ebp发生了变化,pop ebp就不是原堆栈指针了,而且ebp没有入栈<BR><BR>0040B54D cmp ebp,esp <问题9:为什么要cmp然后在__cheksp,有什么用><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> __asm call 0x******** 指令 (******** 是地址)<BR> 用Jump Table只需要修改一次即可。<BR><BR>其它的不说了,看 Mr.LikeDrv 的即可.<BR>2002-10-19 23:34:41
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -