返回介绍

5.3 ARM:3 个参数

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

习惯上,ARM 传递参数的规则(参数调用) 如下:前 4 个参数传递给了 R0-R3 寄存器,其余的参数则在栈中。这和 fastcall 或者 win64 传递参数很相似

5.3.1 Non-optimizing Keil + ARM mode(非优化 keil 编译模式 + ARM 环境)

#!bash
.text:00000014            printf_main1
.text:00000014 10 40 2D E9       STMFD   SP!, {R4,LR}
.text:00000018 03 30 A0 E3       MOV     R3, #3
.text:0000001C 02 20 A0 E3       MOV     R2, #2
.text:00000020 01 10 A0 E3       MOV     R1, #1
.text:00000024 1D 0E 8F E2       ADR     R0, aADBDCD ; "a=%d; b=%d; c=%d
"
.text:00000028 0D 19 00 EB       BL      __2printf
.text:0000002C 10 80 BD E8       LDMFD   SP!, {R4,PC}

所以 前四个参数按照它们的顺序传递给了 R0-R3, printf() 中的格式化字符串指针在 R0 中,然后 1 在 R1,2 在 R2,3 在 R3. 到目前为止没有什么不寻常的。

5.3.2 Optimizing Keil + ARM mode(优化的 keil 编译模式 + ARM 环境)

#!bash
.text:00000014     EXPORT printf_main1
.text:00000014     printf_main1
.text:00000014 03 30 A0 E3     MOV    R3, #3
.text:00000018 02 20 A0 E3     MOV    R2, #2
.text:0000001C 01 10 A0 E3     MOV    R1, #1
.text:00000020 1E 0E 8F E2     ADR    R0, aADBDCD ; "a=%d; b=%d; c=%d
"
.text:00000024 CB 18 00 EA     B     __2printf

表 5.7: Optimizing Keil + ARM mode

这是在针对 ARM optimized (-O3) 版本下的,我们可以 B 作为最后一个指令而不是熟悉的 BL。另外一个不同之处在 optimized 与之前的(compiled without optimization) 对比发现函数 prologue 和 epilogue(储存 R0 和 LR 值的寄存器),B 指令仅仅跳向另一处地址,没有任何关于 LR 寄存器的操作,也就是说它和 x86 中的 jmp 相似,为什么会这样?因为代码就是这样,事实上,这和前面相似,主要有两点原因 1) 不管是栈还是 SP(栈指针),都有被修改。2)printf() 的调用是最后的指令,所以之后便没有了。完成之后,printf() 函数就返回到 LR 储存的地址处。但是指针地址从函数调用的地方转移到了 LR 中!接着就会从 printf() 到那里。结果,我们不需要保存 LR,因为我们没有必要修改 LR。因为除了 printf() 函数外没有其他函数了。另外,除了这个调用外,我们不需要再做别的。这就是为什么这样编译是可行的。

5.3.3 Optimizing Keil + thumb mode

#!bash
.text:0000000C     printf_main1
.text:0000000C 10 B5           PUSH {R4,LR}
.text:0000000E 03 23           MOVS R3, #3
.text:00000010 02 22           MOVS R2, #2
.text:00000012 01 21           MOVS R1, #1
.text:00000014 A4 A0           ADR R0, aADBDCD ; "a=%d; b=%d; c=%d
"
.text:00000016 06 F0 EB F8     BL __2printf
.text:0000001A 10 BD           POP {R4,PC}

表 5.8:Optimizing Keil + thumb mode

和 non-optimized for ARM mode 代码没什么明显的区别

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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