IAR编译器生成Cortex M3汇编代码的相关问题
2016-05-20 11:11
579 查看
IAR如何查看C源代码生成的汇编指令:options->C/C++ Compiler ->List->Output list file & Output assembler file,生成的文件在工程目录List文件夹下。
IAR生成的汇编文件中前几行就说明了 Cpu mode = thumb,但是Cortex M3的指令集是thumb-2指令集,thumb指令集是16位指令集,而thumb-2是16、32位混合指令集。那么就有一个疑问,IAR生成的汇编代码到底是thumb还是thumb-2的,如果是thumb的,那么Cortex M3引入的高效的thumb-2指令岂不是白费了。上述的思考是建立在对知识没有彻底了解之前,或许有漏洞,主要还是引出下面的实验结果。
实验主要为解疑:
0xF081 0x0168 EOR R1,R1,#0x68 这句到底是一个32位指令,还是两个16位指令,前两个16进制数是机器码,要是合着一起用32位写也就没歧义了。
测试用的源代码:
下面是生成的汇编代码:
从汇编可以看出来,加法只需一个16位指令,异或需要32位指令(两个16位)。其他的指令都是类似或者一样的。加法的循环需要循环执行的指令有8条,时间就是8T。如果异或需要两个周期那么其循环的指令时间是14T,如果异或需要一个周期,循环指令就是11T。
下面是逻辑分析仪的截图
分别是2.71s和3.75s。那么可以确定虽然写了两个16位机器码,但是写在一行就是一个32位ARM指令。
IAR生成的汇编文件中前几行就说明了 Cpu mode = thumb,但是Cortex M3的指令集是thumb-2指令集,thumb指令集是16位指令集,而thumb-2是16、32位混合指令集。那么就有一个疑问,IAR生成的汇编代码到底是thumb还是thumb-2的,如果是thumb的,那么Cortex M3引入的高效的thumb-2指令岂不是白费了。上述的思考是建立在对知识没有彻底了解之前,或许有漏洞,主要还是引出下面的实验结果。
实验主要为解疑:
0xF081 0x0168 EOR R1,R1,#0x68 这句到底是一个32位指令,还是两个16位指令,前两个16进制数是机器码,要是合着一起用32位写也就没歧义了。
测试用的源代码:
下面是生成的汇编代码:
从汇编可以看出来,加法只需一个16位指令,异或需要32位指令(两个16位)。其他的指令都是类似或者一样的。加法的循环需要循环执行的指令有8条,时间就是8T。如果异或需要两个周期那么其循环的指令时间是14T,如果异或需要一个周期,循环指令就是11T。
下面是逻辑分析仪的截图
分别是2.71s和3.75s。那么可以确定虽然写了两个16位机器码,但是写在一行就是一个32位ARM指令。
相关文章推荐
- springmvc web.xml 配置默认的controller访问问题
- VS中使用CXTPDockingPane出现的编译错误 error C2059: syntax error : 'constant' 解决
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异
- C++默认参数注意事项
- C++第六次实验
- C++第6次实验
- JAVA
- HDU 1080-Super Jumping! Jumping! Jumping!(LIS最长上升子序列-最大递增子段和)
- Python查询本地外网IP实例
- maven+spring+mybatis配置3步走
- struts2
- 使用aspnet_regiis.exe重新注册.NET Framework
- C++第六次上机作业
- Spring
- spring三种实例化bean的方式
- JAVA基础部分(三)
- 520 | 用c语言程序撩妹
- Java设计模式之工厂方法设计模式
- C++第7次上机作业
- ASP.NET对象