- 第一章 CPU 简介
- 第二章 Hello,world!
- 第三章 函数开始和结束
- 第四章 栈
- Chapter 5 printf() 与参数处理
- Chapter 6 scanf()
- CHAPER7 访问传递参数
- Chapter 8 一个或者多个字的返回值
- Chapter 9 指针
- Chapter 10 条件跳转
- 第 11 章 选择结构 switch()/case/default
- 第 12 章 循环结构
- 第 13 章 strlen()
- Chapter 14 Division by 9
- chapter 15 用 FPU 工作
- Chapter 16 数组
- Chapter 17 位域
- 第 18 章 结构体
- 19 章 联合体
- 第二十章 函数指针
- 第 21 章 在 32 位环境中的 64 位值
- 第二十二章 SIMD
- 23 章 64 位化
- 24 章 使用 x64 下的 SIMD 来处理浮点数
- 25 章 温度转换
- 26 章 C99 的限制
- 27 章 内联函数
- 第 28 章 得到不正确反汇编结果
- 第 29 章 花指令
- 第 30 章 16 位 Windows
- 第 31 章 类
- 三十二 ostream
- 34.2.2 MSVC
- 34.2.3 C++ 11 std::forward_list
- 34.3 std::vector
- 34.4 std::map and std::set
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
7.3 ARM
7.3.1 未优化的 Keil + ARM mode
#!bash
.text:000000A4 00 30 A0 E1 MOV R3, R0
.text:000000A8 93 21 20 E0 MLA R0, R3, R1, R2
.text:000000AC 1E FF 2F E1 BX LR
...
.text:000000B0 main
.text:000000B0 10 40 2D E9 STMFD SP!, {R4,LR}
.text:000000B4 03 20 A0 E3 MOV R2, #3
.text:000000B8 02 10 A0 E3 MOV R1, #2
.text:000000BC 01 00 A0 E3 MOV R0, #1
.text:000000C0 F7 FF FF EB BL f
.text:000000C4 00 40 A0 E1 MOV R4, R0
.text:000000C8 04 10 A0 E1 MOV R1, R4
.text:000000CC 5A 0F 8F E2 ADR R0, aD_0 ; "%d
"
.text:000000D0 E3 18 00 EB BL __2printf
.text:000000D4 00 00 A0 E3 MOV R0, #0
.text:000000D8 10 80 BD E8 LDMFD SP!, {R4,PC}
main() 函数里调用了另外两个函数,3 个值被传递到 f();
正如前面提到的,ARM 通常使用前四个寄存器(R0-R4)传递前四个值。
f() 函数使用了前三个寄存器(R0-R2)作为参数。
MLA (Multiply Accumulate) 指令将 R3 寄存器和 R1 寄存器的值相乘,然后再将乘积与 R2 寄存器的值相加将结果存入 R0,函数返回 R0。
一条指令完成乘法和加法 4,如果不包括 SIMD 新的 FMA 指令 5,通常 x86 下没有这样的指令。
第一条指令 MOV R3,R0,看起来冗余是因为该代码是非优化的。
BX 指令返回到 LR 寄存器存储的地址,处理器根据状态模式从 Thumb 状态转换到 ARM 状态,或者反之。函数 f() 可以被 ARM 代码或者 Thumb 代码调用,如果是 Thumb 代码调用 BX 将返回到调用函数并切换到 Thumb 模式,或者反之。
7.3.2 Optimizing Keil + ARM mode
#!bash
.text:00000098 f
.text:00000098 91 20 20 E0 MLA R0, R1, R0, R2
.text:0000009C 1E FF 2F E1 BX LR
这里 f() 编译时使用完全优化模式(-O3),MOV 指令被优化,现在 MLA 使用所有输入寄存器并将结果置入 R0 寄存器。
7.3.3 Optimizing Keil + thumb mode
#!bash
.text:0000005E 48 43 MULS R0, R1
.text:00000060 80 18 ADDS R0, R0, R2
.text:00000062 70 47 BX LR
Thumb 模式下没有 MLA 指令,编译器做了两次间接处理,MULS 指令使 R0 寄存器的值与 R1 寄存器的值相乘并将结果存入 R0。ADDS 指令将 R0 与 R2 的值相加并将结果存入 R0。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论