理解APCS-- ARM过程调用标准

本文介绍了APCS(ARM Procedure Call Standard)的背景和作用,通过类比办公台使用规则来帮助理解APCS如何规定寄存器和堆栈的使用,以保证过程调用的正确性。文章建议初学者可以通过一个名为《ARM指令与ARM汇编入门》的视频教程来深入理解APCS,并提供了简化的APCS标准代码示例。
摘要由CSDN通过智能技术生成
 

因为需要在QNX Momentics中混合C语言和ARM汇编进行开发,于是初步了解了一下APCS。和大家分享一下我自己的学习过程,然后通过一个形象一点的类比讲述我自己的理解。

 

刚开始的时候我是不知道有APCS这回事,所以第一次从C语言中调用ARM汇编函数的时候返回就出错了。也正因为出错才去网上查找资料,知道了有APCS这回事。

简单来讲,APCS是ARM汇编中调用过程中的一种约定,过程调用方和被调用方讲好了各自该干什么,从而保证各自的代码能正常工作。一个形象的类比就是你和你一个同事轮流使用一个办公台,约好了剪刀用完了放回左上角的笔筒里,这样大家要用剪刀的时候就不用去找。也就是说,如果哪天你的同事被干掉了,这个办公台就你一人用,你的剪刀爱放哪放哪,自己能找着就行(找不着就怨自己喽)。回到实际的ARM汇编编程中,如果你的汇编代码不调用其他人的过程,你的过程也不想被别人调用,你是可以扔掉APCS的。只是,哪能保证不调用人家的过程呢,所以还是老老实实照着APCS做吧。

 

理解了APCS产生的原因后,我就开始学习APCS的具体规定。网上的资料很多,百度一下APCS出来一大堆,不过里面一堆复杂的描述,看了半天也缓不过神来。最后找到一个尚观的视频,叫做《ARM指令与ARM汇编入门》,讲解的非常清晰,终于理解了APCS,视频链接如下:

http://video.sina.com.cn/v/b/49256568-1855531553.html

视频刚开始有主讲老师的自我介绍,不过听不太清,好像是叫“倪老师”,或者是“李老师”。这个“倪老师”是个大牛,对ARM指令非常熟悉,对于APCS也有非常清晰的认识。视频讲解的时候, “倪老师”在Linux环境下使用vi如行云流水般输入着ARM汇编指令,真实令人叹为观止。建议学习ARM汇编的同学们去看看那个视频。

下面将我从视频中学习到的内容结合我自己的理解讲述一下,应该不算是侵权吧,真有侵权的地方也请“倪老师”指出,一定删除相关内容。

 

理解APCS需要一些基本的汇编知识,包括什么是寄存器,什么是堆栈,ARM汇编的基本语法等。我自己是因为很多年前还没毕业的时候使用X86汇编写过一个五子棋程序,所以学习起来还算是可以跟得上。对这些知识不太了解的同学可以先跳过以下内容,等以后掌握一些ARM汇编基础知识后再来看,或者只是初步看一看,留个印象就好。

 

在ARM体系的CPU里有37个寄存器,其中可见的寄存器有15个通用寄存器(叫r0-r14),还有其它的状态寄存器和一个程序计数器(叫r15 或者是pc)。

在汇编里需要使用上面提到的通用寄存器保存各种数据,如果寄存器不够用,还会使用堆栈保存数据。APCS就是规定各个过程如何使用这些寄存器和堆栈,从而保证过程在相互调用的时候可以正常工作。

 

为了形象理解,我们还是拿公用的办公台作比喻,不过这次讨论的不是剪刀的位置,而是办公台的抽屉。

你可以把寄存器想象成办公台的抽屉,现在这个特殊的办公台有一溜抽屉,整整16个,对应我们上面提到的15个通用寄存器和一个PC寄存器。为了和ARM 32位的寄存器严格对应起来,我们想象每个抽屉都只能放4张A4纸(把一个字节想象成一张A4纸)。

另外,办公台旁边还有一个文件架,每格可以放一张A4纸,这就是我们的“堆栈”了。办公台的示意图如下:

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值