ARM子程序嵌套调用怎样防止返回地址覆盖

ARM子程序嵌套调用怎样防止返回地址覆盖,第1张

ARM程序中,子程序的调用返回地址保存在链接寄存器LR(R14)中.子程序程序嵌套调用时,如果调用C语言子程序,编逗带薯译器会自动进行相应返回地址的处理.但是在ARM程序中,还存在一定数量的汇编程序,汇编子程序调用时,有可能会导致子程序返回地址被覆盖.本文对汇编子程序嵌套调用时的相关寄存器行薯压入堆栈进行山者了保存,返回时,又将其推出堆栈.防止了ARM子程序调用时返回地址被覆盖.

(一)在ARM处理器中,子程序调用、异常中断和软件中断有何异同。(从应用场合、寄存器保护、地址的保护与返回和工作模式等方面比较)

ARM中子程序调用是用跳转指铅槐亩令B、BL或BX,跳转到程序计数器PC的指向处,产生程序分支。正常的子程序调用属于用户模式。ARM 处理器中PC是对程序员开放的,所以可以把分支和子程序调用看成同一种 *** 作,因此没有专门的子程序调用指令。当使用BL指令跳转时,处理器自动把下一条指令的地址值拷贝到链接寄存器LR中。在执行跳转指令时,处理器并不保存状态寄存器CPSR。

处理器相应异常中断时,正常的程序流被暂时中止,处理器就进入异常,ARM中所有的异常都会引起中断。异常中断时处理器硬件自动把当前CPSR的状态存储到当前异常模式的特定SPSR中,以免中断处理程序在使用CPSR时改变原来的状态,从而对中断返回造成影响。进入异常中断处理程序时,应该保留中断时槐森的程序地址,以便中断结束时,返回到中断的正常位置,执行下一条指令。异常中断有很多类型,因而不同的异常中断有不同的模式,中断返回时的指令也不同。中断返回时,程序需要一条指令把SPSR中的内容恢复到CPSR中,如MOV PC, LR,执行此指令时,处理器会自动把SPSR中保存的程序状态拷贝到CPSR中。异常中断时,处理器自动把中断处地址保存到相应模式下的LR (R14)中,大多数保存在LR中的地址是:

LR保存的值二PC的值一8,但也有特殊情况。

软件异常中断时一个很灵活的软件功能,和子程序调用不同,软件异常中断吧程序导入管理模式,软件中断是异常中断的一种类型。软件中断是由指令SWI引起的。程序在执行这一指令后,进入异常中断,处理器响应中断,硬件执行过程如下:把下一条指令的地址拷贝给LR把程序状态寄存器CPSR拷贝给SPSR_svc强制进入管理模式强制进入到ARM状态;跳转到绝对地址Pc=0x00000008禁止IRQ中断。软件中断处理程序完成后,使用下列指令返回到原中断处。

(二)与基于51系列单片机的控制系统开发相比,基于ARM处理器的控制系统开发有何异同。(从指令系统、工作模式、寄存器分布和外围器件等方面比较)

(1)指令系统:

①51系列单片机采用8位数据结构,指令--8位,数据--8位,51系列单片机中指令的取指、数据的读写只使用一个地址值;

②ARM处理器采用32位数据结构,指令--32位ARM指令(ARM模式),16位Thumb指令(Thumb模式)数据--32位、16位、8位,ARM处理器中,指令的取值使用四个地址单元(ARM 模式)指令的取值使用两个地址单元(Thumb模式),数据的读写读写使用4、2、1个地址单元。

(2)工作模式

①51系列单片机只有一种模式,所有资源所有情况下都可利用;

②ARM处理器具有多种模式(用户模式、快速中断模式、标准中断模式、管理模式、中止模式、未定义模式、系统模式),只有特权模式可以可以访问和修改某些资源,用户模式不能够访问被保护起来的资源(如不能访问某些程序存储区,不能改写某些存储区),因此用户程序不会对系统造成干扰。

(3)寄存器分布

ARM状态时,ARM处理器中一般可使用的通用寄存器是R0-R12,而51系列中共有4组R0-R12ARM中所有寄存器都有累加器功能和间接寻址功能,通用寄存器比51系列强大一些。在51系列中,所有的重要功能指令都要用到累加器A,因此要不停地保护累加器A中数据,在ARM中不会出现这种清况。两者的程序计数器明告的使用极其意义是相同的,程序状态器含义是想近的,51系列中,程序状态一般是由累加器A决定的,因为A参与并保存 *** 作结果;ARM处理器中,则是由参与 *** 作的目标寄存器决定的。51系列中,堆栈指针是SP而在ARM处理器中,堆栈指针是R13。

Thumb状态下的寄存器是ARM状态下寄存器的一个子集,Thumb状态所能访问的寄存器少一些,Thumb状态下的寄存器的定义及其使用和ARM状态时相同的。

(4)外围器件

ARM不是单片机,而只是一个单片机的内核,ARM仅仅是单片机中的中央处理器,它有自己的指令代码集,可以通过执行代码控制外部设备,给ARM处理器设计出各种外部设备,用总线连接到一起,就组成了不同结构和性能的单片机。

各ARM体系结构版本

ARM体系结构从最初开发到现在有了很大的改进,并仍在完善和发展。

为了清楚地表达每个ARM应用实例所使用的指令集,ARM公司定义了6种主要的ARM指令集体系结构版本,以版本号V1~V6表示

ARM版本Ⅰ: V1版架构

该版架构只在原型机ARM1出现过,只有26位的寻址空间,没有用于商业产品。

其基本性能有:

基本的数据处理指令(无乘法);

基于空者派字节、半字和字的Load/Store指令

转移指令,包括子程序调用及链接指令;

供 *** 作系统使用的软件中断指令SWI;

寻址空间:64MB(226)。

ARM版本Ⅱ: V2版架构

该版架构对V1版进行了扩展,例如ARM2和ARM3(V2a)架构。包含了对32位乘法指令和协处理器指令的支持。

版本2a是版本2的变种,ARM3芯片采用了版本2a,是第一片采用片上Cache的ARM处理器。同样为26位寻址空间,现在已经废弃不再使用。

V2版架构与版本V1相比,增加了以下功能:

乘法和乘加指令;

支持协处理器 *** 作指令;

快速中断模式;

SWP/SWPB的最基本存储器与寄存器交换指令

寻址空间:64MB。

ARM版本Ⅲ : V3版架构

ARM作为独立的公司,在1990年设计的第一个微处理器采用的是版本3的ARM6。它作为IP核、独立的处理器、具有片上高速缓存、MMU和写缓冲的集成CPU。

变种版本有3G和3M。版本3G是不与版本2a向前兼容的版本3,版本3M引入了有符号和无符号数乘法和乘加指令,这些指令产生全部64位结果。

V3版架构( 目前已废弃 )对ARM体系结构作了较大的改动:

寻址空间增至32位(4GB);

当前程序状态信息从原来的R15寄存器移到当前程序状态寄存器CPSR中(Current Program Status Register)

增加了程序状态保存寄存器SPSR(Saved Program Status Register);

增加了两种异常模式,使 *** 作系统代码可方便地使用数据访问中止异常、指令预取中止异常和未定义指令异常。;

增加了MRS/MSR指令,以访斗贺问新增的CPSR/SPSR寄存器;

增加了从异常处理返回的指令功能。

ARM版本Ⅳ : V4版架构

V4版架构在V3版上作了进一步扩充,V4版架构是目前应用最广的ARM体嫌旦系结构,ARM7、ARM8、ARM9和StrongARM都采用该架构。

V4不再强制要求与26位地址空间兼容,而且还明确了哪些指令会引起未定义指令异常。

指令集中增加了以下功能:

符号化和非符号化半字及符号化字节的存/取指令;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12377349.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存