|
|
|
|
移动端

1.6.4 分析编译器生成的代码

《ARM嵌入式系统编程与优化》第1章Linux/ARM嵌入式平台,本章介绍如何使用GCC编译器、汇编器和连接器来编写和执行独立的汇编语言程序,以及如何将一个C语言代码和汇编语言代码合起来,以验证汇编代码子程序的正确性。本节为大家介绍分析编译器生成的代码。

作者:梁元宇 译来源:机械工业出版社|2017-09-26 19:12

【新品产上线啦】51CTO播客,随时随地,碎片化学习

1.6.4 分析编译器生成的代码

为了探索汇编实现如何影响性能因素,需要检查(使用)编译器生成的汇编,并与手写汇编相比较。使用gcc的“-S”开关生成汇编,使用“-O3”开关使编译最大优化,并使用“-marm”开关来产生ARM模式汇编(而不是THUMB模式)。

冒泡排序函数从包含数据数组(data)地址的r0和包含数组大小(n)的r1开始执行。

计算n - 1,如果结果等于0,则退出函数。

计算数组最后的有效地址,它是data + n*4。注意:“ip”是寄存器r12,被定义为“内部调用暂时寄存器”。

设置r4 = data + 4,并初始化i = (r0) = 0。

开始外部循环;复位r3,使其指向数组的开始位置。

开始内循环;加载两个元素到r2和r1。注意:r3开始在4字节时进入数组,所以第一位加载偏移减4字节,并且第二位加载使用后增量后增加r3。

如果需要,比较值并交换(使用存储多重指令)。

比较r3与数组结尾并循环;如果不相等,则重复内循环。

一旦完成内循环,增加计数器,比较计数器与n,如果不相等,则重复外循环。

“.L2”标签是退出点。

内循环仅由6个指令组成,而我们有9个指令,所以必须假设内循环比编译器生成的内循环需要的周期少2/3。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

精通Spring 2.0

本书是关于Spring 2.0的权威教程,是Java/Java EE开发者必备的参考书。本书详尽系统地介绍了Java EE的基础知识、Spring 2.0的各种功能,以...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊