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 //比较n和1
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 //比较i和n
je .L4 //如果相等,跳转到L4,结束循环
movl %edx, %eax //nval = t
jmp .L5 //跳转到L5,继续循环。
.L4:
popl %ebx
popl %esi
popl %ebp
ret
生成的汇编代码,与 while 循环版本的 fib 函数完全相同。