免费注册 查看新帖 |

Chinaunix

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

[C] gdb貌似会影响运行过程中eax的值,为何? [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-10-18 18:58 |只看该作者 |倒序浏览
"printf"的返回值是实际打印的字符的个数,有一个小程序
  1. #include<stdio.h>
  2. int main()
  3. {
  4.   printf("1");
  5.   printf("55555");
  6.   printf("10________");
  7.   printf("13___________");
  8.   printf("18________________");
  9.   printf("28__________________________");
复制代码
它会打印
15555510________13___________18________________28__________________________

然后我用gdb来调试,查看每步之后,printf是不是把返回值放到$eax里面了:
  1. (gdb) b main
  2. Breakpoint 1 at 0x804844c: file testp.c, line 4.
  3. (gdb) r
  4. Starting program: /home/a/cpp/a.out

  5. Breakpoint 1, main () at testp.c:4
  6. 4          printf("1");
  7. (gdb) n               # 我认为将会把"1"放入eax
  8. 5          printf("55555");
  9. (gdb) p $eax          # 和我的预期不一致
  10. $1 = 49
  11. (gdb) n
  12. 6          printf("10________");
  13. (gdb) p $eax          # 符合预期
  14. $2 = 5
  15. (gdb) n
  16. 7          printf("13____________");
  17. (gdb) p $eax          # 符合预期
  18. $3 = 10
复制代码
我认为c语言的abi是规定了函数的返回值放到eax寄存器(x86架构),那么为什么第一次p $eax不符合我的预期,后面才符合预期?
谢谢。

评分

参与人数 1信誉积分 +5 收起 理由
action08 + 5 神马都是浮云

查看全部评分

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2016-10-18 20:45 |只看该作者
回复 1# cdsfiui

你有看过实际的汇编代码是啥么?

论坛徽章:
223
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:10操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
3 [报告]
发表于 2016-10-19 10:48 |只看该作者
调试跟运行可是两回事的哦,

如果你的代码执行效果真是两回事,那么你的代码问题大了

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
4 [报告]
发表于 2016-10-19 11:25 |只看该作者
MMMIX 发表于 2016-10-18 20:45
回复 1# cdsfiui

你有看过实际的汇编代码是啥么?

我用gcc -g my.c这样编译的,没有指定任何优化选项。

这样GCC也会做一些优化吗? 那gcc有没有命令行选项时能彻底禁止优化的?
谢谢

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2016-10-19 21:17 |只看该作者
回复 4# cdsfiui

我用gcc -g my.c这样编译的,没有指定任何优化选项。


其实我是指望你实际去看下的。

这样GCC也会做一些优化吗?


当然会。

那gcc有没有命令行选项时能彻底禁止优化的?


怎么算是彻底禁止优化?哪些对代码的转换算是优化哪些不算?编译器只保证针对正确的代码生成行为正确的代码,不保证对你的代码进行直译。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2016-10-19 21:18 |只看该作者
回复 3# action08

楼主的问题没那么玄乎,就是 gcc 把 printf("1"); 替换成 putchar('1'); 了

论坛徽章:
223
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:10操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
7 [报告]
发表于 2016-10-19 21:23 |只看该作者
现在的编译程序怎么了??


记得以前读的unix/print代码(算是家族函数库),系统底层全是调用putchar
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP