免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ethantsien
打印 上一主题 下一主题

[C] 一道题 --- 学C就要关注更底层的东西 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2012-10-15 13:34 |只看该作者
现在的CPU都支持条件传送指令,具体说是686以后的都支持,VS有点保守

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
22 [报告]
发表于 2012-10-15 13:46 |只看该作者
ethantsien 发表于 2012-10-15 13:30
那就是编译器没优化代码,如果优化的话,会用到cmove,不优化的话就用cmp je


已经建议你自己去实验了, 我倒是想看看你怎么编译出这个所谓 bug 出来。

论坛徽章:
0
23 [报告]
发表于 2012-10-15 14:17 |只看该作者
本帖最后由 ethantsien 于 2012-10-15 14:19 编辑

回复 22# zylthinking

  1.         .cfi_startproc
  2.         pushq   %rbp
  3.         .cfi_def_cfa_offset 16
  4.         .cfi_offset 6, -16
  5.         movq    %rsp, %rbp
  6.         .cfi_def_cfa_register 6
  7.         movq    %rdi, -8(%rbp)
  8.         movq    -8(%rbp), %rax
  9.         movl     $0, %eax
  10.         testq    %rax, %rax
  11.         cmovne   (%rax), %eax
  12.         leave
  13.         .cfi_def_cfa 7, 8
复制代码
可以看到,无论testq的测试真假,使用数据条件指令cmovne,都会对p间接引用,错误就发生了

使用的是x86_64的指令集,gcc 4.4.6

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
24 [报告]
发表于 2012-10-15 14:21 |只看该作者
ethantsien 发表于 2012-10-15 14:17
回复 22# zylthinking 可以看到,无论testq的测试真假,使用数据条件指令cmovne,都会对p间接引用,错误就发 ...


cmovne 是什么意思?

论坛徽章:
0
25 [报告]
发表于 2012-10-15 14:24 |只看该作者
zylthinking 发表于 2012-10-15 14:21
cmovne 是什么意思?


条件传送指令

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
26 [报告]
发表于 2012-10-15 14:27 |只看该作者
不和你打哑谜了, ne 意思是 not equal, 整体意思是, testq 结果如果两者不等, 则执行 mov , 否则不执行 (%rax)  明白了???
就算不明白, 有看汇编的功夫, 难道就不晓得自己把程序跑一遍, 看看到底会不会 段错误????

论坛徽章:
0
27 [报告]
发表于 2012-10-15 14:29 |只看该作者
zylthinking 发表于 2012-10-15 14:27
不和你打哑谜了, ne 意思是 not equal, 整体意思是, testq 结果如果两者不等, 则执行 mov , 否则不执行  ...


一个汇编指令里,无论这个传送是否完成,引用还是引用了

论坛徽章:
0
28 [报告]
发表于 2012-10-15 14:31 |只看该作者
zylthinking 发表于 2012-10-15 14:27
不和你打哑谜了, ne 意思是 not equal, 整体意思是, testq 结果如果两者不等, 则执行 mov , 否则不执行  ...


你以为我没跑程序?你这不是在说自己吗?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
29 [报告]
发表于 2012-10-15 14:32 |只看该作者
ethantsien 发表于 2012-10-15 14:29
一个汇编指令里,无论这个传送是否完成,引用还是引用了


死鸭子嘴硬是吧? 引用了会不会段错误, 如果段错误, 那你自己测试一下看看事实上会不会?
如果硬说不会段错误, 那它娘的你说什么bug

论坛徽章:
0
30 [报告]
发表于 2012-10-15 14:32 |只看该作者
zylthinking 发表于 2012-10-15 14:32
死鸭子嘴硬是吧? 引用了会不会段错误, 如果段错误, 那你自己测试一下看看事实上会不会?
如果硬说不 ...


一定要编译时出错才叫BUG吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP