热爱学习的呆萌的文青
2015-12-15 01:33
采纳率: 54.8%
浏览 2.9k
已采纳

求大神解释下c语言双重for循环的汇编语句??

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • lm_whales 2015-12-15 04:43
    已采纳

    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

    点赞 评论
  • Robot-C 2015-12-15 01:35

    c语言中的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句.
    for(表达式 1;表达式 2;表达式 3)语句
    它的执行过程如下:
    (1)先求表达式 1.
    (2)求表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第三步 做若为

    假(值为0),则结束循环,转......
    答案就在这里:C语言for循环
    ----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

    点赞 评论
  • bdmh 2015-12-15 01:53

    你用vs编写代码,然后调试,在下方右键跳转到汇编,就看到了

    点赞 评论
  • lm_whales 2015-12-15 04:43

    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

    点赞 评论

相关推荐 更多相似问题