32位汇编语言学习笔记(10)--分析for循环的汇编代码



for循环和while循环差不多,都是条件判断在先。gcc用类似处理while循环的方式先把for循环转换成包含do-while循环的代码,再转换成汇编代码。

 

示例:

int fib_f(int n)

{

   int i;

   int val = 1;

   int nval = 1;

 

   for (i = 1; i < n; i++) {

         intt = val+nval;

         val= nval;

         nval= t;

    }

 

   return val;

}

 

gcc -O1 -S -m32 fib_for.c

 

fib_f:

       pushl   %ebp

       movl    %esp, %ebp

       pushl   %esi

       pushl   %ebx

       movl    8(%ebp), %esi //esi = n

       movl    $1, %eax // eax = val = 1

       cmpl    $1, %esi //比较n1

       jle     .L4 //如果n小于等于1,那么跳转到L4

       movl    $1, %ecx //ecx = i = 1

       movl    $1, %ebx //ebx = val =1

       movl    $1, %eax //eax = nval = 1

.L5:

       addl    $1, %ecx //++i

       leal    (%eax,%ebx), %edx //t=val+ nval

       movl    %eax, %ebx //val = nval

       cmpl    %esi, %ecx //比较in

       je      .L4 //如果相等,跳转到L4,结束循环

       movl    %edx, %eax //nval = t

       jmp     .L5 //跳转到L5,继续循环。

.L4:

       popl    %ebx

       popl    %esi

       popl    %ebp

       ret

生成的汇编代码,与 while 循环版本的 fib 函数完全相同。

你可能感兴趣的:(32位汇编语言学习笔记(10)--分析for循环的汇编代码)