返回介绍

7.3 ARM

发布于 2025-02-22 14:00:43 字数 1973 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文