R0~R16寄存器作用

R0-R3    

用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。

被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。

R4-R10

被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。

R11- fp(frame pointer)寄存器

即可以用来记录回溯信息,也可以当做局部变量来使用

R12-内部调用暂时寄存器 ip

它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。 在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。

R13 -栈指针 sp

用户模式和系统模式共用一个SP,每种异常模式都有各自专用的R13寄存器(SP)。它们通常指向各模式所对应的专

用堆栈,也就是ARM处理器允许用户程序有六个不同的堆栈空间,ARM处理器中的R13被用作SP。当不使用堆栈时, R13 也可以用做通用数据寄存器.

当程序的运行进入异常模式时,可以将需要保护的寄存器放入R 13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的 正常执行。

R14-链接寄存器 LR

在ARM体系结构中LR的特殊用途有两种:

一是执行子程序调用指令(BL )时,会自动完成将当前的PC的值减去4的结果数据保存到LR寄存器。即将调用指令的下紧邻指令的地址保存到LR。返回时将lr赋给pc即可

二是当异常发生时,会自动完成将当前的PC保存到LR寄存器,返回时将lr-4赋给pc即可,因此在各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行。

 为什么异常发生时,需要 sub lr, lr, #4 ?

是因为arm流水线,也就是执行第1条指令,第2条指令进行译码,将第3条指令从存储器中取出,那么pc当前等于pc+8

所以在异常发生时,此时lr=pc+8,但是pc+4是没有被执行的,所以异常返回时需要返回到(lr-4)地址上,执行已经译码的地址上.

(实例代码地址链接: 使用stmdb和ldmla实现中断 )

R15-程序计数器 PC

PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节程序状态寄存器

R16-CPSR(CurrentProgram Status Register,当前程序状态寄存器)

CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏coder修行路

多进程、协程、事件驱动及select poll epoll

多线程的使用场景 IO操作不占用CPU 计算占用cpu python多线程不适合cpu密集型操作的任务,适合IO操作密集型的任务 多进程 简单的一个多进程例子:...

3149
来自专栏GreenLeaves

十、元数据概述

前面说过C#源文件经过C#编译器生成一个可执行的exe文件,该可执行的PE文件由以下几个部分组成: (1)、PE32(+)头   Windows要求的标准信息 ...

2717
来自专栏有趣的django

12.python进程\协程\异步IO

进程 Python中的多线程无法利用多核优势 , 所以如果我们想要充分地使用多核CPU的资源 , 那么就只能靠多进程了 multiprocessing模块中提供...

3678
来自专栏张善友的专栏

VS 2005 文本编码小技巧

     VS2003使用代码生成器生成的代码加入到工程会很郁闷的,在智能提示中是乱码,在VS2005中有一个选项可以解决这个问题。      今天将一个工程从...

1886
来自专栏从零开始学自动化测试

pytest文档10-命令行传参addoption

命令行参数是根据命令行选项将不同的值传递给测试函数,比如平常在cmd执行”pytest —html=report.html”,这里面的”—html=report...

1583
来自专栏Hongten

python开发_fileinput

1023
来自专栏海天一树

小朋友学Python(27):全局变量的引用和修改

一、引用 例1 a = 1 def func(): if 1 == a: print("a = %d" % a) if __name__...

2737
来自专栏海天一树

小朋友学Python(17):文件

Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。 一、打开和关闭文件 例1 (1)创建名为test...

2705
来自专栏Java技术分享

Ajax请求中给全局变量赋值的解决方案

昨天PP遇到一个问题,ajax修改全局变量后,外面获取不到ajax里赋的值,结果为空 问题代码如下图: ? 输出结果如下图: ? 原因: 先在控制台看看是a...

1977
来自专栏C/C++基础

Linux命令(49)——export命令(builtin)

export命令为Shell内建命令,用于设置或显示环境变量,环境变量包含变量与函数。

891

扫码关注云+社区