- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
教你如何学习ARM设计--APCS
APCS 简介
(ARM 过程调用标准) 介绍
寄存器命名
设计关键
一致性
栈
回溯结构
实际参数
函数退出
建立栈回溯结构
APCS 标准
对编码有用的东西
介绍
APCS,ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。最显著的一点是对这些例程来自哪里没有明确的限制。它们可以编译自 C、 Pascal、也可以是用汇编语言写成的。
APCS 定义了:
对寄存器使用的限制。
使用栈的惯例。
在函数调用之间传递/返回参数。
可以被‘回溯’的基于栈的结构的格式,用来提供从失败点到程序入口的函数(和给予的参数)的列表。
APCS 不一个单一的给定标准,而是一系列类似但在特定条件下有所区别的标准。例如,APCS-R (用于 RISC OS)规定在函数进入时设置的标志必须在函数退出时复位。在 32 位标准下,并不是总能知道进入标志的(没有 USR_CPSR),所以你不需要恢复它们。如你所预料的那样,在不同版本间没有相容性。希望恢复标志的代码在它们未被恢复的时候可能会表现失常...
如果你开发一个基于 ARM 的系统,不要求你去实现 APCS。但建议你实现它,因为它不难实现,且可以使你获得各种利益。但是,如果要写用来与编译后的 C 连接的汇编代码,则必须使用 APCS。编译器期望特定的条件,在你的加入(add-in)代码中必须得到满足。一个好例子是 APCS 定义 a1 到 a4 可以被破坏,而 v1 到 v6 必须被保护。现在我确信你正在挠头并自言自语“a 是什么? v 是什么?”。所以首先介绍 APCS-R 寄存器定义...
寄存器命名
APCS 对我们通常称为 R0 到 R14 的寄存器起了不同的名字。使用汇编器预处理器的功能,你可以定义 R0 等名字,但在你修改其他人写的代码的时候,最好还是学习使用 APCS 名字。
寄存器名字 Reg #? APCS?? 意义 R0 a1 工作寄存器 R1 a2 R2 a3 R3 a4 R4 v1 必须保护 R5 v2 R6 v3 R7 v4 R8 v5 R9 v6 R10 sl 栈限制 R11 fp 桢指针 R12 ip R13 sp 栈指针 R14 lr 连接寄存器 R15 pc 程序计数器 ?译注:ip 是指令指针的简写。
这些名字不是由标准的 Acorn 的 objasm(版本 2.00)所定义的,但是 objasm 的后来版本,和其他汇编器(比如 Nick Robert 的 ASM)定义了它们。要定义一个寄存器名字,典型的,你要在程序最开始的地方使用 RN 宏指令(directive):
a1 RN 0
a2 RN 1
a3 RN 2
...等...
r13 RN 13
sp RN 13
r14 RN 14
lr RN r14
pc RN 15
这个例子展示了一些重要的东西:
寄存器可以定义多个名字 - 你可以定义‘r13’和‘sp’二者。
寄存器可以定义自前面定义的寄存器 - ‘lr’定义自叫做‘r14’的寄存器。(对于 objasm 是正确的,其他汇编器可能不是这样)
设计关键
函数调用应当快、小、和易于(由编译器来)优化。
函数应当可以妥善处理多个栈。
函数应当易于写可重入和可重定位的代码;主要通过把可写的数据与代码分离来实现。
但是最重要的是,它应当简单。这样汇编编程者可以非常容易的使用它的设施,而调试者能够非常容易的跟踪程序。
一致性
程序的遵循 APCS 的部分在调用外部函数时被称为“一致”。在程序执行期间的所有时候都遵循 APCS (典型的,由编译器生成的程序)被称为“严格一致”。协议指出,假如你遵守正确的进入和退出参数,你可以在你自己的函数范围内做你需要的任何事情,而仍然保持一致。这在有些时候是必须的,比如在写 SWI 伪装(veneers)的时候使用了许多给实际的 SWI 调用的寄存器。
栈
栈是链接起来的‘桢’的一个列表,通过一个叫做‘回溯结构’的东西来链接它们。这个结构存储在每个桢的高端。按递减地址次序分配栈的每一块。寄存器 sp 总是指向在最当前桢中最低的使用的地址。这符合传统上的满降序栈。在 APCS-R 中,寄存器 sl 持有一个栈限制,你递减 sp 不能低于它。在当前栈指针和当前栈之间,不应该有任何其他 APCS 函数所依赖的东西,在被调用的时候,函数可以为自己设置一个栈
文档评论(0)