void main(){
int i,j;
for(i=0;i<5;i++){
printf("0");
for(j=0;j<2;j++){
printf("1");
}
}
}
汇编:
main:
.LFB24:
pushl %ebp
movl %esp, %ebp
pushl %ebx
andl $-16, %esp
subl $16, %esp
movl $5, %ebx
.L3:
movl $48, (%esp)
call putchar
movl $49, (%esp)
call putchar
movl $49, (%esp)
call putchar
subl $1, %ebx
jne .L3
movl -4(%ebp), %ebx
leave
ret
main:
.LFB24:
///entry
pushl %ebp ///保存 ebp
movl %esp, %ebp /// 让 esp 的值存入 ebp 这就保存了当前的esp 从而通过 ebp从堆栈,取函数调用参数,就有了根据。
保护寄存器
pushl %ebx //ebx 当作寄存器变量用
andl $-16, %esp //堆栈 16BYTES对齐处理
subl $16, %esp //从对齐后的 第16个字节开始,用
/// for(i=0;ifor(i=5;i != 1;i--){
movl $5, %ebx ///这是i=5; %ebx 是i
.L3: //循环变成跳转语句,这是跳转标号
///printf("0");--->putchar('0');
movl $48, (%esp)
call putchar
///
///for(j=0;j ///printf("1");--->putchar('1'); printf 被优化为 putchar
movl $49, (%esp)
call putchar
movl $49, (%esp)
call putchar
///}
///这句是 j--
subl $1, %ebx
jne .L3 ///这句是 循环 for(i=5;i!=1;i--) -->if i ( != 1) goto l3
movl -4(%ebp), %ebx///存回i 值?这是摘取的一部分代码吧?
leave //== pop ebp 退出函数前,恢复保存的 ebp寄存器
ret
c语言中的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句.
for(表达式 1;表达式 2;表达式 3)语句
它的执行过程如下:
(1)先求表达式 1.
(2)求表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第三步 做若为
假(值为0),则结束循环,转......
答案就在这里:C语言for循环
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。
你用vs编写代码,然后调试,在下方右键跳转到汇编,就看到了
main:
.LFB24:
///entry
pushl %ebp ///保存 ebp
movl %esp, %ebp /// 让 esp 的值存入 ebp 这就保存了当前的esp 从而通过 ebp从堆栈,取函数调用参数,就有了根据。
保护寄存器
pushl %ebx //ebx 当作寄存器变量用
andl $-16, %esp //堆栈 16BYTES对齐处理
subl $16, %esp //从对齐后的 第16个字节开始,用
/// for(i=0;ifor(i=5;i != 1;i--){
movl $5, %ebx ///这是i=5; %ebx 是i
.L3: //循环变成跳转语句,这是跳转标号
///printf("0");--->putchar('0');
movl $48, (%esp)
call putchar
///
///for(j=0;j ///printf("1");--->putchar('1'); printf 被优化为 putchar
movl $49, (%esp)
call putchar
movl $49, (%esp)
call putchar
///}
///这句是 j--
subl $1, %ebx
jne .L3 ///这句是 循环 for(i=5;i!=1;i--) -->if i ( != 1) goto l3
movl -4(%ebp), %ebx///存回i 值?这是摘取的一部分代码吧?
leave //== pop ebp 退出函数前,恢复保存的 ebp寄存器
ret