免费注册 查看新帖 |

Chinaunix

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

[其他] 这是什么意思 [复制链接]

论坛徽章:
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
11 [报告]
发表于 2012-10-13 16:48 |只看该作者
本帖最后由 starwing83 于 2012-10-13 16:52 编辑

回复 8# zylthinking


    我想了一下第二个问题。我觉得有几点是确定的:

1. 如果gcc确定你的汇编其实啥都没做(相对输入输出来说),那么gcc就会优化掉你的汇编。
2. 如果你指定volatile,那么gcc无论如何都会留下你写的汇编。
3. gcc如何判定你的汇编有没有用,这一点是关键。

从文本意思上来看,如果你的output都是input,并且还都没用,编译器就会觉得这汇编没用,这第一层意思是肯定的(所以hence这里当做以后理解)

然而,如果是这样,文档里面不该把hence写进括号,因为这明显已经是个条件了。那么就有可能是:只要你的output都是input,那么这个汇编就没用。这里hence做所以理解。问题是,为什么output是input这个asm就没用呢?我觉得这里还是会有点上下文,比如说asm默认是”纯“的等等。或者有一些特殊的约定,或者在上下文里面input本身是没用的,那么output都是input显然就会没用。我估计周围有些内容你漏掉了,还是再看一遍会好一些。

继续好奇地问,LZ你看的是什么书呀………………看到回复了,gcc手册……额,说实话我觉得GNU的手册写的都真的……真的……很暧昧……用词不清,除了native englisher估计很难知道啥意思,以前看Emacs Info也有这种感觉。一些东西很明显他用一种”你懂的“口气对你说  = =太猥琐了……

实在不知道就实验一下呗,把example编译一下用gdb跟这没办法的。毕竟我们都不说英语,万一歧义了就完蛋了……比如天杀的hence……用since或者then会死啊………………

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
12 [报告]
发表于 2012-10-13 17:53 |只看该作者
本帖最后由 captivated 于 2012-10-13 20:17 编辑

果然还是觉得太失水准了. 编辑掉编辑掉...

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
13 [报告]
发表于 2012-10-13 18:08 |只看该作者
starwing83 发表于 2012-10-13 16:48
回复 8# zylthinking

一些东西很明显他用一种”你懂的“口气对你说  = =太猥琐了……


同感同感. 我的兴趣目前是gas. 哈, 叔叔我要发掘出GNU许许多多猥琐的地方, 让后将其公诸于世...

论坛徽章:
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
14 [报告]
发表于 2012-10-13 18:19 |只看该作者
回复 12# captivated


    哥哥……讨论asm问题,麻烦先看看前提好么(叫你叔叔好像感觉每次都被你占便宜……)

asm里面有四个域:template,output,input,clobber description。这都是给编译器看的。

template说明具体嵌入的汇编到底是啥。

output说明这段汇编会产生什么输出(改变什么寄存器,改变什么内存变量)。

input说明这段汇编需要什么输入(寄存器或者内存)。

clobber说明这段汇编会破坏掉哪些寄存器(就是说在执行汇编以后,哪些寄存器会被改写)。

gcc是这么处理嵌入汇编的:

1. 四个列表所有的项,从0开始编号,替换掉template里面是%n。
2. 嵌入汇编之前,缓存output的内容。
3. 嵌入汇编之前,准备好input的内容(比如一个指令需要寄存器,但你提供的是memory,那么要先movmemory到那个寄存器)。
4. 嵌入汇编之前,缓存clobber的内容。
5. 嵌入汇编之后,恢复clobber的内容。

这五条是在没有开优化的时候做的,开优化以后,这些行为可能会被优化掉。LZ贴出来的文章就是这些域需要满足什么规则,以及在什么情况下,什么行为会被优化。

理解了这些,一些基本的东西就OK了。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
15 [报告]
发表于 2012-10-13 18:28 |只看该作者
回复 14# starwing83


    哦。

    asm("指令部": 输出部: 输入部: 破坏部);

    “指令部”即template, 输出部即output, 输入部即input, 破坏部即clobber description

    翻译LZ的东西时, 当时我真没敢确定那个clobber description就是嵌入汇编的破坏部...

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
16 [报告]
发表于 2012-10-13 18:33 |只看该作者
晕。那我那个翻译要赶快编辑掉编辑掉... 哈哈,算了。给LZ和starwing83道一声献丑了...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP