Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
http://www.keil.com/support/man/docs/armasm/armasm_ch03s03s03.htm<br />
The following coprocessor names and coprocessor register names are<br />
predeclared:<br />
”<br />
p0-p15 (coprocessors 0-15)<br />
c0-c15 (coprocessor registers 0-15).<br />
3.4.2. 什么是 APCS<br />
APCS,ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的<br />
一种机制,定义的例程可以与其他例程交织在一起。最显著的一点是对这些例程来自哪里没有明<br />
确的限制。它们可以编译自 C、 Pascal、也可以是用汇编语言写成的。<br />
APCS 定义了:<br />
对寄存器使用的限制。<br />
使用栈的惯例。<br />
在函数调用之间传递/返回参数。<br />
可以被‗回溯‘的基于栈的结构的格式,用来提供从失败点到程序入口的函数(和给予的<br />
参数)的列表。<br />
3.5. 为何 C 语言(的函数调用)需要堆栈,而汇编语言却不<br />
需要堆栈<br />
之前看了很多关于uboot的分析,其中就有说要为C语言的运行,准备好堆栈。<br />
而自己在Uboot的start.S汇编代码中,关于系统初始化,也看到有堆栈指针初始化这个动作。<br />
但是,从来只是看到有人说系统初始化要初始化堆栈,即正确给堆栈指针sp赋值,但是却从来<br />
没有看到有人解释,为何要初始化堆栈。所以,接下来的内容,就是经过一定的探究,试图来解<br />
释一下,为何要初始化堆栈,即:<br />
为何C语言的函数调用要用到堆栈,而汇编却不需要初始化堆栈。<br />
要明白这个问题,首先要了解堆栈的作用。<br />
关于堆栈的作用,要详细讲解的话,要很长的篇幅,所以此处只是做简略介绍。<br />
总的来说,堆栈的作用就是:保存现场/上下文,传递参数。<br />
3.5.1. 保存现场/上下文<br />
现场,意思就相当于案发现场,总有一些现场的情况,要记录下来的,否则被别人破坏掉之后,<br />
你就无法恢复现场了。而此处说的现场,就是指CPU运行的时候,用到了一些寄存器,比如r0,r1<br />
等等,对于这些寄存器的值,如果你不保存而直接跳转到子函数中去执行,那么很可能就被其破<br />
坏了,因为其函数执行也要用到这些寄存器。<br />
因此,在函数调用之前,应该将这些寄存器等现场,暂时保持起来,等调用函数执行完毕返回后,<br />
再恢复现场。这样CPU就可以正确的继续执行了。<br />
在计算机中,你常可以看到上下文这个词,对应的英文是context。那么: