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处理器设计出各种外部设备,用总线连接到一起,就组成了不同结构和性能的单片机。

异常和中断

1.ARM

处理器复位后,处理器硬件将进行如下 *** 作:

(1)

强制进入管理模式

(2)

强制进入到

ARM

状态

(3)

跳转到绝对地址

PC=0x00000000

出执行

(4)

禁止

IRQ

中断和

FIQ

中断。

复位后

CPSR

中最后

4

位状态为

0011,并且进入管理模式,执行 *** 作系统程序,

一般用做对系统的初始化,然后切换到用户模式,开始执行正常的用户程序,切

换到用户模式可以使用如下程序:

MRS

R0,CPSR

读程序状态寄存器

BIC

R0,R0,#03

把末两位清零

MSR

CPSR_c

,R0

把修改后的值加载给状态寄存器,切换结束

ADD

R1,R2,R3

用户程序

2.未定义异常

.

ARM

处理器中有很多没有定义的代码,因为

ARM

使用

32

位代码,包含

2

31

次幂种。所以

ARM

指令集不能用尽所有的代码。

ARM

的未定义异常有两种情况:

(1)

遇到一条无法执行的指令,此指令没有定义

(2)

执行一条协处理器的 *** 作指令,在正常情况下,协处理器应该应答,但是

没有,可能是因为干扰等原因。

但是一般情况下是不希望产生异常的,如果是由于干扰引起的异常,那么在

异常中断处理中有一段专门的程序,让程序返回再重新执行该条指令,以判

断异常是否是由干扰引起。

当然也要注意哪种单片机应该使用哪种合适的指令集版本,因为还是约

有差异的,否则某些编译通过的指令也不能执行。

3.

软件中断异常

软件中断异常是由指令

SWI

引起的,

程序执行这一条指令后,

进入异常中断。

处理器响应中断,硬件执行图如下:

软件中断处理程序完成后,使用下列返回指令返回到原中断处:

MOVS

PC

,

R14

软件中断异常把程序导入管理模式,而子程序调用属于用户模式。

4.

预取指中断异常

。。。

。。

预取指中断异常和未定义指令异常都是由于不正常的指令国产引起,但是也

有区别:

(1)

未定义指令异常是内部异常中断,而他是外部信号引起的异常中断

(2)

他并没有成功地取得一条指令。

他中断返回时,应该执行指令:SUBS

PC

,

R14

,

#4

5.数据中止异常

.

。。。

。。。

6.中断请求(IRQ)异常

.

ARM

处理器中,有一个输入逻辑

nIRQ

称为中断请求信号,这个输入信

号是由

ARM

处理器外围控制模块(片内)控制,当有满足中断条件的事件发生

时,

外围控制模块向

ARM

处理器发错

IRQ

信号,

ARM

处理器进入异常,

使

IRQ

中断是常用的中断,就像

51

系列单片机中定时器中断、串口中断、外部中断等。

CPSR[7]

IRQ

完成中断处理后,

程序应该执行下列指令返回到原中断处:

SUBS

PC

,

R14

,

#4

7.

快速中断(FIQ)请求异常

ARM

处理器中,有一个输入逻辑

nFIQ

称为中断请求信号,这个输入信

号是由

ARM

处理器外围控制模块(片内)控制,当有满足中断条件的事件发生

时,

外围控制模块向

ARM

处理器发错

FIQ

信号,

ARM

处理器进入异常。

使

FIQ

中断可以通过

CPSR[6]来屏蔽。

注意:进入异常会引起处理器模式转换。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存