免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5310 | 回复: 24
打印 上一主题 下一主题

汇编终于派上用场了:) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-29 18:42 |只看该作者 |倒序浏览
今天一个同事问: int i=3;
        printf("%d,%d \n",i,i++);
        i=3;
        printf("%d,%d\n",i,++i);
结果是多少?
还真是没又仔细想过,以前语法有些忘记了?怎么办?突然想起n年前的汇编!尘封那么多年,没想到在这里派上用场了:)

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2008-08-29 18:49 |只看该作者
没看懂。

论坛徽章:
0
3 [报告]
发表于 2008-08-29 18:51 |只看该作者
下面是汇编简单分析。有不对之处请指正。      
pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax
        subl    %eax, %esp
        movl    $3, -4(%ebp)  
        subl    $4, %esp  
        movl    -4(%ebp), %eax
        pushl   %eax      //右边i++的i入栈(右边第一个参数先入栈)
        leal    -4(%ebp), %eax
        incl    (%eax)    //执行++
        pushl   -4(%ebp)  //i++入栈 (右边第二个参数入栈)
        pushl   $.LC0     //第三个参数入栈(为字符串)
        call    printf    //实参入栈完毕,开始函数调用 (所以结果为 :4 3)
        
        addl    $16, %esp
        movl    $3, -4(%ebp)
        subl    $4, %esp
        leal    -4(%ebp), %eax  //读出i地址  至eax
        incl    (%eax)          //i++
        pushl   -4(%ebp)        //i 入栈
        pushl   -4(%ebp)        //i 入栈
        pushl   $.LC1           //字符入栈
        call    printf          //所以结果为: 4 4

论坛徽章:
0
4 [报告]
发表于 2008-08-29 18:54 |只看该作者
其实就是函数实参传递方式。以前没有认真考虑过!

论坛徽章:
0
5 [报告]
发表于 2008-08-29 18:54 |只看该作者

回复 #1 pxinyu 的帖子

不同编译器结果不一定相同,既如此,何必费这个劲,当然自己锻炼一下自娱自乐一下是不打紧

论坛徽章:
0
6 [报告]
发表于 2008-08-29 20:54 |只看该作者

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2008-08-29 21:36 |只看该作者
lz应该把C学好了再学汇编

C标准规定函数参数的计算顺序是不确定的.

论坛徽章:
0
8 [报告]
发表于 2008-08-29 21:55 |只看该作者
结果是: 3,3 4,4

论坛徽章:
0
9 [报告]
发表于 2008-08-29 21:56 |只看该作者
原帖由 qliu00 于 2008-8-29 21:55 发表
结果是: 3,3 4,4

so 看来这款实现是从右到左的:wink:

论坛徽章:
0
10 [报告]
发表于 2008-08-29 22:22 |只看该作者
原帖由 pxinyu 于 2008-8-29 18:42 发表
今天一个同事问: int i=3;
        printf("%d,%d \n",i,i++);
        i=3;
        printf("%d,%d\n",i,++i);
结果是多少?
还真是没又仔细想过,以前语法有些忘记了?怎么办?突然想起n年前的汇编!尘 ...


实际项目,是否有人这样使用

还是用最平实的代码为好,有歧义的代码绝对不使用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP