免费注册 查看新帖 |

Chinaunix

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

[C] 标准派,请问 volatile void func() [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2013-01-21 22:47 |只看该作者
咱就想问问研究标准的大神们,有看到过这个东西吗?
没有其他意思。

事情的缘由是这样的,
尝试用两参数调用 SVC

  1. void call_svc  (void *arg0, void *arg1)
  2. {
  3.         register int r0 __asm__ ("r0") = (int)arg0;
  4.         register int r1 __asm__ ("r1") = (int)arg1;
  5.         __asm__ (
  6.                 "        SVC                0x88                                        \n"
  7.                 :
  8.                 : "r"(r0), "r"(r1)
  9.         );
  10. }
复制代码
以上代码不能达到效果,r0, r1没被直观调用,很多时候会被优化掉,r0,r1不会存有两个函数参数的值。
于是我调用svc就不正确了。

防止优化,你懂的,加volatile嘛。
蹊跷的是,需要加在以下两个地方,才能达到目标。
其中一处就是1楼的问题。
加在其他参数如arg0,arg1, r0, r1等,均未能达到目标。

  1. volatile void call_svc  (void *arg0, void *arg1)
  2. {
  3.         register int r0 __asm__ ("r0") = (int)arg0;
  4.         register int r1 __asm__ ("r1") = (int)arg1;
  5.         __asm__ volatile(
  6.                 "        SVC                0x88                                        \n"        // Call SVC
  7.                 :
  8.                 : "r"(r0), "r"(r1)
  9.         );
  10. }
复制代码
(以上为不同优化选项下的测试结果。未经证实)

可能有人会问,为什么不直接写asm呢,就没这些麻烦了。
但是麻烦在后面,加入asm,就需要客户重新配置他的编译环境,设定asm选项;
不加asm,我可以将所有代码打包成一个 .c 文件,用户的项目加入此一个 .c即可。
(sqlite代码提供了类似的方式,两套源文件 --- 一套分立的多个.c代码,一套仅一个.c代码,方便用户集成编译 .c )

pm觉得变态吧,这就是实际问题。
未必最佳办法,解决代价较小的可行思路而已。。。尔等,未变态之前,是不会理解的。


论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
12 [报告]
发表于 2013-01-21 22:51 |只看该作者
回复 11# 群雄逐鹿中原


    防止优化,难道不是asm前面加volatile就行了的么?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2013-01-21 22:56 |只看该作者
回复 12# starwing83
这里不行,r0,r1还是会被gcc优化掉。我尝试加上两句多余的,经验证可以达到目标,但多出两句,看着刺眼。

  1.        __asm__ volatile(
  2.                 "        MOV R0,R0       \n"
  3.                 "        MOV R1,R1       \n"
  4.                 "        SVC                0x88                                        \n"        // Call SVC
  5.                 :
  6.                 : "r"(r0), "r"(r1)
  7.         );
复制代码

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
14 [报告]
发表于 2013-01-21 23:02 |只看该作者
楼主换头像了。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
15 [报告]
发表于 2013-01-21 23:10 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
36
CU大牛徽章
日期:2013-09-18 15:24:20NBA常规赛纪念章
日期:2015-05-04 22:32:03牛市纪念徽章
日期:2015-07-24 12:48:5515-16赛季CBA联赛之辽宁
日期:2016-03-30 09:26:4715-16赛季CBA联赛之北控
日期:2016-03-30 11:26:2315-16赛季CBA联赛之广夏
日期:2016-05-20 15:46:5715-16赛季CBA联赛之吉林
日期:2016-05-24 11:38:0615-16赛季CBA联赛之青岛
日期:2016-05-30 13:41:3215-16赛季CBA联赛之同曦
日期:2016-06-23 16:41:052015年亚洲杯之巴林
日期:2015-02-03 15:05:04CU大牛徽章
日期:2013-09-18 15:24:52CU十二周年纪念徽章
日期:2013-10-24 15:46:53
16 [报告]
发表于 2013-01-22 10:17 |只看该作者
gcc -O0 ... ...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP