从C语言到汇编,从汇编到C语言

本文深入解析C语言中的for循环、do循环和while循环,通过反汇编过程展示其在机器语言层面的实现方式,揭示循环结构在底层的运作原理。
一、循环语句与发汇编后的机器语言
  1、for循环
  下面是一段C语言的代码,我们的目的是来看其反汇编的结果:
  int myfunction(int a,int b)
  {
  int c = a+b;
  int i;
  for(i=0;i<50;i++)
  {
  c = c+i;
  }
  return c;
  }
  前面的反汇编暂时不理它,这里从for的地方开始反汇编,结果如下:
  for(i=0;i<50;i++)
  00412BC7 mov dword ptr [i],0 // i=0; 给循环变量赋初值
  00412BCE jmp myfunction+39h (412BD9h)// 跳到第一次循环处
  > 00412BD0 mov eax,dword ptr [i]
  | 00412BD3 add eax,1 // i++;修改循环变量
  | 00412BD6 mov dword ptr [i],eax
  | 00412BD9 cmp dword ptr [i],32h // 比较 i 与50的关系, 检查循环条件
  | 00412BDD jge myfunction+4Ah (412BEAh) // 当 i>=50 [即 !(i<50) ] 时则跳出循环
  | {
  | c = c+i;
  | 00412BDF mov eax,dword ptr [c] // 变量 c
  | 00412BE2 add eax,dword ptr [i] // 变量 i
  | 00412BE5 mov dword ptr [c],eax // c=c+i;
  | }
  < 00412BE8 jmp myfunction+30h (412BD0h) // 跳回去修改循环变量
  00412BEA mov eax,dword ptr [c]
  }
  可以看到for循环主要用这么几条指令来实现:mov进行初始化。jmp跳过循环变量改变代码。cmp实现条件判断,jge根据条件跳转。
  用jmp回到循环改变代码进行下一次循环。所以for结构有以下的显著特征:
  
  mov <循环变量>,<初始值> ; 给循环变量赋初值
  jmp B ;跳到第一次循环处
  A: (改动循环变量) ;修改循环变量。
  …
  B: cmp <循环变量>,<限制变量> ;检查循环条件
  jgp 跳出循环
  (循环体)
  …
  jmp A ;跳回去修改循环变量
  
  2、do循环
  再看一下do循环,因为 do循环没有修改循环变量的部分,所以比for循环要简单一些。
  do
  {
  c = c+i;
  00411A55 mov eax,dword ptr [c]
  00411A58 add eax,dword ptr [i]
  00411A5B mov dword ptr [c],eax
  } while(c< 100);
  00411A5E cmp dword ptr [c],64h
  00411A62 jl myfunction+35h (411A55h)
  return c;R>  do循环就是一个简单的条件跳转回去。只有两条指令:
  cmp <循环变量>,<限制变量>
  jl <循环开始点>
  
  3、while循环
  while(c<100){
  00411A55 cmp dword ptr [c],64h
  00411A59 jge myfunction+46h (411A66h)
  c = c+i;
  00411A5B mov eax,dword ptr [c]
  00411A5E add eax,dword ptr [i]
  00411A61 mov dword ptr [c],eax
  }
  00411A64 jmp myfunction+35h (411A55h)
  return c;
  很明显,我们会发现while要更复杂一点。因为while除了开始的时候判断循环条件之外,后面还必须有一条无条件跳转回到循环开始的地方,共用三条指令实现:
  A: cmp <循环变量>,<限制变量>
  jge B
  ( 循环体)
  …
  jmp A
  B: (循环结束了)
  
  这样,我们对C语言中的循环结构的分析,就基本弄完了!当然,我们用同样的方法也可以分析出C语言在“分支语句”、以及其它的数据结构中的C代码与机器反汇编代码的关系了!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值