首页
社区
课程
招聘
[原创]菜鸟与你分享汇编与c语言转换
发表于: 2013-1-15 08:40 4642

[原创]菜鸟与你分享汇编与c语言转换

2013-1-15 08:40
4642

一直以来都是从看雪这边索取,现在也应该反馈一点。
本人比较菜,高手请绕道。
本人也是刚刚学习汇编不久,对于汇编调用不是很明白但是看了天书夜读大有启发所以想跟新手分享我的心得。这篇是我第一次写的教程不好还请大家见谅。
因为c语言的main本身就是函数,所以我就从函数讲起
int fuction(int a,int b)
像一个函数调用
基本都是汇编都是一样都是:
1保存ebp(这边就是保存返回地址)一般都是跟return(实际上就是pop ebp)联系。
2保存esp(但是这边一般都是复制到ebp);
3到堆栈中腾出一些空间给变量用,栈顶都是用esp表示,栈是低字节序,就是在堆栈存放一个4字节,esp就减去4;出栈,esp加上4。
4保存ebx,esi,edi到堆栈中,等函数调用完后恢复,
5把局部变量全部初始话位0cccccccch,0cch就是机器码int 3中断,表示局部变量不能被执行,如果执行程序必然出错。
6然后做函数想做的事情就是传递参数,以为c语言是_cdecl调用规则就是从右边到左边到堆栈中所以
esp+12就是第二个参数,esp+8就是第一个参数,esp+4为返回地址。
7做完后恢复各个寄存器变量
下面是一个简单示例:
int fuction(int a,int b)
{
    int d=a+b;
    int i=1,c=0;
    while(c<100)
    {
c=c+i;
     }
    switch(c)
   {
case 0:
        d=1;
      case 1:
        d=c;
         break;
      default:
         d=0;
break;
      
     }
return d;

  
}
int fuction(int a,int b)
{
00412D90  push        ebp  
00412D91  mov         ebp,esp
00412D93  sub         esp,0E8h
00412D99  push        ebx  
00412D9A  push        esi  
00412D9B  push        edi  
00412D9C  lea         edi,[ebp-0E8h]
00412DA2  mov         ecx,3Ah
00412DA7  mov         eax,0CCCCCCCCh
00412DAC  rep stos    dword ptr es:[edi]
    int d=a+b;
00412DAE  mov         eax,dword ptr [a] //这边的a就是esp+8为了大家简单理解把它们替换了
00412DB1  add         eax,dword ptr //b就是esp+8
00412DB4  mov         dword ptr [d],eax
    int i=1,c=0;
00412DB7  mov         dword ptr [i],1
00412DBE  mov         dword ptr [c],0
    while(c<100)
00412DC5  cmp         dword ptr [c],64h
00412DC9  jge         fuction+46h (412DD6h)
    {
        c=c+i;
00412DCB  mov         eax,dword ptr [c]
00412DCE  add         eax,dword ptr [i]
00412DD1  mov         dword ptr [c],eax
     }
00412DD4  jmp         fuction+35h (412DC5h)
    switch(c)
00412DD6  mov         eax,dword ptr [c]
00412DD9  mov         dword ptr [ebp-0E8h],eax
00412DDF  cmp         dword ptr [ebp-0E8h],0
00412DE6  je          fuction+63h (412DF3h)
00412DE8  cmp         dword ptr [ebp-0E8h],1
00412DEF  je          fuction+6Ah (412DFAh)
00412DF1  jmp         fuction+72h (412E02h)
   {
          case 0:
        d=1;
00412DF3  mov         dword ptr [d],1
      case 1:
        d=c;
00412DFA  mov         eax,dword ptr [c]
00412DFD  mov         dword ptr [d],eax
         break;
00412E00  jmp         fuction+79h (412E09h)
      default:
         d=0;
00412E02  mov         dword ptr [d],0
                  break;
      
     }
         return d;
00412E09  mov         eax,dword ptr [d]

  
}
00412E0C  pop         edi  
00412E0D  pop         esi  
00412E0E  pop         ebx  
00412E0F  mov         esp,ebp
00412E11  pop         ebp  
00412E12  ret              
是不是看起来头没有那么大呢?
假如还是的话,,,,那我也没有办法了。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (11)
雪    币: 166
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个版块是否只有新手才能进来,高手就不要进来了
2013-1-15 09:26
0
雪    币: 42
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也是菜鸟呀
2013-1-16 01:35
0
雪    币: 42
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
学点东西就顶一个
2013-1-16 03:29
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢楼主。来的太及时了。
2013-1-16 12:14
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
esp+4是返回值?返回值不是在eax中吗?
2013-1-16 12:16
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢了解大概了
2013-1-16 13:06
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
Mark一下
2013-1-16 16:49
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好好学习,天天向上!
2013-1-16 18:48
0
雪    币: 42
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你说的没错那个是返回的地址由于时间问题没有注意看
2013-1-17 01:34
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
每天有进步就好
2013-1-17 07:46
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了。。。。。
2013-1-17 19:26
0
游客
登录 | 注册 方可回帖
返回
//