CS:app 读书笔记----循环体的机器级表示及优化

  1.  1 int fib_w(int n)
  2.  2 {
  3.  3     int i = 1;
  4.  4     int val = 1;
  5.  5     int nval = 1;
  6.  6 
  7.  7     while (i<n) {
  8.  8         int t = val+nval;
  9.  9         val = nval;
  10. 10         nval = t;
  11. 11     }
  12. 12     
  13. 13     return val;
  14. 14 } 
  15. 15 
 一段写好的C程序,会经过预处理,编译,链接,生成目标代码,生成可执行代码等几个步骤.其中文本源程序经历预处理到达汇编代码的过程中,编译器会对我们的代码进行相应的优化和调整.有时候,通过阅读(编译器生成的)汇编代码,可以学到很多东西.
在这里,所使用的编译平台是IA32下的GCC(version 3.2),我自己做实验的时候机器平台是(Windows XP Mingw-gcc 4.3.2)
首先来一段很简单的C程序:
这段代码 描述的是 计算第N项fibonacci(菲波那西数列)的值.
    有关fibonacci的介绍:
     这个数列是意大利中世纪数学家斐波那契在<算盘全书>中提出的,这个级数的通项公式,除了具有a(n+2)=an+a(n      +1)/的性质外,还可以证明     通项公式为:an=1/√[(1+√5/2) n-(1-√5/2) n](n=1,2,3.....) 这个通项公式中虽然    所有的an都是正整数,可是它们却是由一些无理数表示         出来的。

运行GCC
gcc  - O2 fib_w.c  - S

生成GUN汇编代码(GAS)
 1  movl  8 (%ebp), %eax
 2  movl $ 1 ,%ebx
 3  movl $ 1 ,%ecx
 4  cmpl %eax,%ebx
 5  jge   .L9
 6  leal - 1 (%eax),%edx
 7  . L10:
 8  leal (%ecx,%ebx),%eax
 9  movl %ecx,%ebx
10  movl %eax,%eax
11  decl %edx
12  jnz   .L10
13  . L9:
14 
15  ---------------------------------------------------------
16  省略栈创建代码
上述代码 转换成某种扩展的C之后,是这样的
 1 int  fib_w_goto( int  n)
 2 {
 3    int val=1;
 4    int nval=1;
 5    int nmi ,it;
 6
 7    if (val >= n) 
 8        goto done;
 9    nmi = n-1;
10    
11    loop:
12        t = val+nval;
13        val = nval;
14        nval = t;
15        nmi--;
16        if(nmi)
17             goto loop;
18 
19    done:
20        return val;
21}

这里用了不推荐使用的goto语句是为了清晰的表明gcc汇编代码的处理过程.我们可以发现对于
while ( bool {
    statement;
}

这样的循环结构,gun汇编器将其转换成了do-while结构,同时为了避免可能的do循环体首次执行,添加了相应的if判断。
而且我们发现这里,并没有出现我们一开始设置的变量i, 而是出现了一个nmi的新变量,她的指等于n-i;这使得编译器只使用
三个寄存器作为循环变量,而不是原来的四个寄存器;其次,
他把初始判定(i<n)优化成了(val<n),这样i就彻底消失了,这在编译器中是很常见的。最后,为了循环的连续执行,要保证i<=n,这样编译器就假设nmi是非负的了.因此只需要将nmi!=0。这样就在汇编中又少了一条指令.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值