c to asm!!!

xiongli 2002-10-19 08:27:15
请高手给我解释一下几个c语言到汇编原代码中间我觉得迷惑的地方,谢谢。我的解释和问题我写在<>中,而且编号



--- E:\term3\mas.c ----------------------------------------------------------------------------------------------------
1: int ff();
2: int main()
3: {
0040B4F0 push ebp <保存基地址>
0040B4F1 mov ebp,esp 〈设定新的基地址 问题1:为什么用esp替换ebp??>
0040B4F3 sub esp,50h <设定stack顶位置,开辟50h个空间>
0040B4F6 push ebx <save ebx>
0040B4F7 push esi <save esi>
0040B4F8 push edi <save edi>
0040B4F9 lea edi,[ebp-50h] <保存 rep stos起始空间>
0040B4FC mov ecx,14h <设定rep stos执行数目 问题3:为什么是14h>
0040B501 mov eax,0CCCCCCCCh <设定rep stos放进去的内容>
0040B506 rep stos dword ptr [edi] <问题4:为什么要放具体的数进去?>
4: char *f;
5: int x,y,z;
6: f=(char*)malloc(32*sizeof(char));
0040B508 push 20h <传递malloc的参数>
0040B50A call malloc (004026d0) <调用malloc>
0040B50F add esp,4 <问题5:为什么要add 4??因为如果不malloc就没有这句话>
0040B512 mov dword ptr [ebp-4],eax<保存char *f>
7: f[20]='a';
0040B515 mov eax,dword ptr [ebp-4] <取出*f>
0040B518 mov byte ptr [eax+14h],61h <在f[20]放'a'>
8: z=ff();
0040B51C call @ILT+5(_ff) (0040100a)<调用ff() 问题6:为什么要先call一个
jmp语句,然后再jmp到ff()的地址>
0040B521 mov dword ptr [ebp-10h],eax <保存ff()返回结果>
9: if(z>0)
0040B524 cmp dword ptr [ebp-10h],0 <比较>
0040B528 jle main+3Ch (0040b52c) <语句跳转>
10: goto test;
0040B52A jmp test (0040b539) <语句跳转>
11: x=10;
0040B52C mov dword ptr [ebp-8],0Ah <保存10到x>
12: y=x;
0040B533 mov ecx,dword ptr [ebp-8] <保存x到ecx>
0040B536 mov dword ptr [ebp-0Ch],ecx <保存ecx到y>
13: test:
14: free(f);
0040B539 mov edx,dword ptr [ebp-4] <准备传递free()参数>
0040B53C push edx <传递free()参数>
0040B53D call free (00403110) <调用free()>
0040B542 add esp,4 <问题7:为什么又要add 4???>
15: return 0;
0040B545 xor eax,eax <设定返回结果>
16: }
0040B547 pop edi <load edi>
0040B548 pop esi <load esi>
0040B549 pop ebx <load ebx>
0040B54A add esp,50h <问题8:为什么要add 50h而不是直接pop ebp>
0040B54D cmp ebp,esp <问题9:为什么要cmp然后在__cheksp,有什么用>
0040B54F call __chkesp (0040b4b0)
0040B554 mov esp,ebp <load esp>
0040B556 pop ebp <load ebp>
0040B557 ret
--- No source file ------


里面f()具体内容我没贴上来,不知道我的分析有什么不对的地方,我的麻烦大家了.
...全文
76 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckc 2002-10-20
  • 打赏
  • 举报
回复
1.sp是栈指针,如果不保存的话就无法返回调用它的程序
因为下面要改变栈指针,所以不能用入栈的方法保存,只能保存在寄存器中
bp这个寄存器是专门在栈段操作在栈区的子程序的临时变量用的,很方便,所以用bp保存sp的内容
2.我问一下问题,你为什么没有问题2?
3.14h是十进制的20,乘4字节每次就是80字节的内存初始化,刚好是50H
4.我也不知道为什么放这个莫名其妙的数,也许编译器的作者叫cc?啊,怎么这么巧,我也叫cc
5.去掉入栈的20h立即数,所以直接调整指针
6.这样也许可以支持函数指针表吧
7。和5相同
8。ebp入栈后栈指针已经改变,所以无法pop
9.也许是chkesp函数需要的。比如如果有栈操作就需要检查ebp,如果没有栈操作就不用检查ebp了

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧