免费注册 查看新帖 |

Chinaunix

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

gcc编译 .s文件和.S文件有什么区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-14 11:50 |只看该作者 |倒序浏览
最近在学习gcc,看到有帖子中写到:

--以下为贴子内容
原始程序码的扩展名指出所用编写程序所用的语言,以及相对应的处
理方法:

  .c  C 原始程序         ;  预处理、编译、汇编
  .C  C++ 原始程序        ;  预处理、编译、汇编
  .cc  C++ 原始程序        ;  预处理、编译、汇编
  .cxx C++ 原始程序        ;  预处理、编译、汇编
  .m  Objective-C 原始程序    ;  预处理、编译、汇编
  .i  已经过预处理之 C 原始程序  ;  编译、汇编
  .ii  已经过预处理之 C++ 原始程序 ;  编译、汇编
  .s  组合语言原始程序      ;  汇编
  .S  组合语言原始程序      ;  预处理、汇编
  .h  预处理文件(标头文件)    ;  (不常出现在指令行)


想请教一下,.s类型的文件和.S类型的文件有什么不同,为什么.S类型还要做预编译?

论坛徽章:
0
2 [报告]
发表于 2009-05-14 11:52 |只看该作者
预处理,不是预编译,别造词。
英语:preprocessing

论坛徽章:
0
3 [报告]
发表于 2009-05-14 12:05 |只看该作者

回复 #2 langue 的帖子

呵呵,对,打错了

论坛徽章:
0
4 [报告]
发表于 2009-05-14 12:05 |只看该作者
最显著的区别

.S里可以用#define
.s里不可以

论坛徽章:
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 [报告]
发表于 2009-05-14 12:06 |只看该作者
原帖由 pineblue 于 2009-5-14 11:50 发表
想请教一下,.s类型的文件和.S类型的文件有什么不同,为什么.S类型还要做预编译?

那就是个 GCC 的约定,说是碰到 .S 就先预处理下。这样,需要预处理的汇编源码后缀就可以写成 .S

论坛徽章:
0
6 [报告]
发表于 2009-05-14 13:34 |只看该作者

回复 #5 MMMIX 的帖子

可不可以这样理解:
.S不可能是经过预处理、编译后产生的文件,因为已经做过预处理,它是直接用汇编语言写的程序文件,且需要在汇编是进行预处理;
.s文件可能是应该预处理、编译后产生的文件,也可能是直接用汇编语言写的程序文件且不需要进行预处理?

论坛徽章:
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
7 [报告]
发表于 2009-05-14 14:05 |只看该作者
原帖由 pineblue 于 2009-5-14 13:34 发表
可不可以这样理解:

为什么要这么理解呢?直接记住 GCC 对它们会有哪些操作不是很简单么?你这么绕一大圈干嘛?

论坛徽章:
0
8 [报告]
发表于 2009-05-14 14:39 |只看该作者
原帖由 langue 于 2009-5-14 11:52 发表
预处理,不是预编译,别造词。
英语:preprocessing


想起前天的那个“编译”和“汇编”了

论坛徽章:
0
9 [报告]
发表于 2009-05-14 16:28 |只看该作者
你这里第一列是被编译的文件,第二列是编译工具默认的处理方式。
对.s文件,汇编器(linux下用的是as),只做必要的汇编处理,不会像cpp处理.c文件那样预处理。
.S采用了as的高级功能,比如预处理。

以前的as叫做gas,功能比较弱,没有这样的预处理功能,也不能对实模式代码进行汇编。
所以Linux早期内核代码中的启动部分(实模式代码),是用as86,也就是AT&T编译器编译的。
所以早期内核有使用了两种汇编语言。

论坛徽章:
0
10 [报告]
发表于 2009-05-14 17:14 |只看该作者
原帖由 MMMIX 于 2009-5-14 14:05 发表

为什么要这么理解呢?直接记住 GCC 对它们会有哪些操作不是很简单么?你这么绕一大圈干嘛?


记住是很简单,我是想知道在什么情况下会生成.s文件,什么情况下会生成.S文件,.s文件一般是编译C源文件生成的,当然可以用-o选项设置成.S,但一般应该不会这么做吧,所以我想知道什么情况下文件是.S后缀
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP