基于ARM编译器版本5的工程迁移与适配到ARM编译器版本6.12 后续1 - 汇编代码处理问题
 2019.12.29    |      嵌入式学习    |     AilsonJack    |     暂无评论    |     802 views
By: Ailson Jack
Date: 2019-12-29
个人博客: http://www.only2fire.com/
<p style="text-indent: 2em;"><span style="color: rgb(255, 0, 0);">为了描述方便,将ARM Compiler 5简称为AC5,将ARM Compiler 6.12简称AC6.12。</span><br/></p><p style="text-indent: 0em;">&nbsp;&nbsp;ARM官方的迁移文档,下载地址:<a class="btn btn-success" href="https://pan.baidu.com/s/1bQUrnbFPfqyHM9X4n2Iwig" target="_blank">点此下载</a>&nbsp;,密钥:<span style="color: rgb(255, 0, 0);">0iaf</span>。<br/></p><p class="artical_littlestyle1">1、armasm编译汇编代码,链接失败的问题</p><p style="text-indent: 2em;">这里新开一篇博文,专门讲讲针对ARM格式的汇编代码,使用AC6.12应该如何处理。下述内容大多来自文档<span style="color: rgb(0, 112, 192);">《migration_and_compatibility_guide_100068_0612_00_en.pdf》</span>文档的 <span style="color: rgb(0, 112, 192);">3.3 Command-line options for preprocessing assembly source code</span>。<br/></p><p style="text-indent: 2em;">我在我自己的工程中遇到过使用AC6.12编译汇编代码成功,但是链接会失败。提示内容大致是:<span style="color: rgb(255, 0, 0);">xxx.scf Error: L6236E: No section matches selector - no section to be FIRST/LAST.</span>对于这个问题,我起初以为是分散加载文件(*.scf)有问题,看了半天的分散加载文件内容,也没发现分散加载文件有问题。于是我转换方向,使用命令去手动编译<span style="color: rgb(0, 112, 192);">startup_LPC55S69_cm33_core0.s</span>,然后再手动链接,发现还是提示<span style="color: rgb(255, 0, 0);">xxx.scf Error: L6236E: No section matches selector - no section to be FIRST/LAST.</span>错误。<br/></p><p style="text-indent: 2em;">于是我再次查阅ARM官方的升级与适配手册<span style="color: rgb(0, 112, 192);">《migration_and_compatibility_guide_100068_0612_00_en.pdf》</span>,发现armasm使用<span style="color: rgb(0, 112, 192);">--cpreproc</span>和<span style="color: rgb(0, 112, 192);">--cpreproc_opts</span>选项编译汇编代码时,输入源代码的后缀名是.S(大写)。然而我的工程的ARM格式的汇编代码文件的后缀名均为小写,导致了armasm处理出错。下面是文档中<span style="color: rgb(0, 112, 192);">3.3 Command-line options for preprocessing assembly source code</span>对<span style="color: rgb(0, 112, 192);">--cpreproc</span>和<span style="color: rgb(0, 112, 192);">--cpreproc_opts</span>的描述:<br/><span style="color: rgb(0, 112, 192);">If you are using armasm to assemble source code that requires the use of the preprocessor, you must use both the --cpreproc and --cpreproc_opts options together. Also:<br/>• As a minimum, you must include the armclang options --target and either -mcpu or -march in --<br/>cpreproc_opts.<br/>• The input assembly source <span style="color: rgb(255, 0, 0);">must</span> have an upper-case extension .S.</span><br/></p><p style="text-indent: 2em;">其中第2点,对汇编源文件后缀名为大写.S作了一个说明吧。<br/></p><p style="text-indent: 2em;">为了处理汇编源文件后缀是小写.s的情况,文档的下面也提供了一个操作的说明吧:<br/><span style="color: rgb(0, 112, 192);">If you have existing source files, which require preprocessing, and that have the lower-case extension .s, then to avoid having to rename the files:<br/>1. Perform the preprocessing step separately using the armclang -x assembler-with-cpp option.<br/>2. Assemble the preprocessed file without using the --cpreproc and --cpreproc_opts options.</span><br/></p><p style="text-indent: 2em;">上面这段英文的内容给出了汇编源代码文件后缀是小写.s,但是又不想修改源代码后缀的方法,首先使用armclang (带编译选项<span style="color: rgb(0, 112, 192);">-x assembler-with-cpp</span>)去预处理*.s汇编代码,生成一个过程*.s文件,接着再使用armasm(不带编译选项<span style="color: rgb(0, 112, 192);">--cpreproc</span>和<span style="color: rgb(0, 112, 192);">--cpreproc_opts</span>)去编译这个过程*.s文件。这里提供一个例子如下:<br/>(1).<span style="color: rgb(0, 112, 192);">armclang --target=arm-arm-none-eabi -mcpu=cortex-m33 -x assembler-with-cpp -E test.s -o test_preproc.s</span><br/>(2).<span style="color: rgb(0, 112, 192);">armasm --cpu=Cortex-M33 --fpu=FPv5-SP test_preproc.s</span><br/></p><p class="artical_littlestyle2">2、总结</p><p style="text-indent: 2em;">ARM Compiler 6.12对于ARM格式的汇编处理,这里总结下吧,分两种情况:<br/>(1).如果ARM格式汇编代码源文件的后缀名是大写的.S,那么直接使用armasm 带编译选项<span style="color: rgb(0, 112, 192);">--cpreproc</span>和<span style="color: rgb(0, 112, 192);">--cpreproc_opts</span>进行编译即可,例如:<br/><span style="color: rgb(0, 112, 192);">armasm --cpu=cortex-m33 --cpreproc --cpreproc_opts=--target=arm-arm-none-eabi,-mcpu=cortex-m33 startup_LPC55S69_cm33_core0.S</span><br/>(2).如果ARM格式汇编代码源文件的后缀名是小写的.s,这里就需要特殊处理了,有两种方法:<br/>a.将ARM格式汇编代码源文件的后缀名改为大写.S,然后按照步骤(1)进行处理即可。<br/>b.首先使用armclang (带编译选项<span style="color: rgb(0, 112, 192);">-x assembler-with-cpp</span>)去预处理*.s汇编代码,生成一个过程*.s文件,接着再使用armasm(不带编译选项<span style="color: rgb(0, 112, 192);">--cpreproc</span>和<span style="color: rgb(0, 112, 192);">--cpreproc_opts</span>)去编译这个过程*.s文件。这里提供一个例子如下:<br/>(1).<span style="color: rgb(0, 112, 192);">armclang --target=arm-arm-none-eabi -mcpu=cortex-m33 -x assembler-with-cpp -E test.s -o test_preproc.s</span><br/>(2).<span style="color: rgb(0, 112, 192);">armasm --cpu=Cortex-M33 --fpu=FPv5-SP test_preproc.s</span><br/></p><p style="text-indent: 2em;">如果觉得文章写的不错,对你有帮助,欢迎点赞,关注博主哟!<br/></p>
欢迎关注博主的公众号呀,精彩内容随时掌握:
热情邀请仔细浏览下博客中的广告,万一有对自己有用或感兴趣的呢。◕ᴗ◕。。
如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^,当然了能够赞赏博主,那就非常感谢啦!
注: 转载请注明出处,谢谢!^_^
暂无评论,要不要来个沙发
发表评论

 
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号