arm7个异常返回值为什么有的pc-4有的pc-8有的pc不减

作者&投稿:丹饶 (若有异议请与网页底部的电邮联系)
ARM9 下一条指令的地址为什么是 PC-4~

有关ARM7/ARM9的实际区别我没有看懂,不过不管如何,在流水线中,当你取到(fetch)一个指令时,此时PC寄存器里面保存的是你取到的指令PC,正在译码的指令是PC-4,正在执行的指令是PC-8。正在执行的指令是不能打断的。

当中断发生或者函数跳转时,系统把PC寄存器的值保存到了LR;当恢复的时候,要执行的指令是LR-4而不是LR,否则就丢失一个指令了。

arm7是三级流水线,当产生异常时, ARM核拷贝CPSR寄存器的内容SPSR_寄存器中,同时设置适当的CPSR 位、改变处理器状态进入ARM 态和处理器模式,从而进入相应的异常模式。在设置中断禁止位禁止相应中断(如果需要)后,ARM核保存返回地址到LR_,同时设置PC为相应的异常向量。当异常返回时, 异常处理需要从SPSR_寄存器中恢复CPSR的值,同时从LR_恢复PC,具体的异常返回指令如下:

Ø 从SWI和Undef异常返回时使用:

MOVS PC, LR;

Ø 从FIQ、IRQ和预取终止返回时使用:

SUBS PC, LR,#4;

Ø 从数据异常返回时使用:

SUBS PC, LR,#8

在使用上述指令异常返回时,如果LR之前被压栈的话使用LDM “∧”, 例如:

LDMFD SP!, {PC}∧

退出异常处理

SWI和未定义指令异常中断是由当前执行的指令自身产生的。当SWI和未定义指令异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令(对于ARM指令来说+8字节;对于Thumb指令来说+4字节的位置)。当SWI和未定义指令异常中断产生时,处理器将值(PC-4)保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令的下一条指令地址。因此返回操作可以通过下面的指令来实现:MOV PC,LR

该指令将寄存器LR中的值复制到程序计数器PC中实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。

在指令预取时,如果目标地址是非法的,该指令将被标记成有问题的指令。这时,流水线上该指令之前的指令继续执行。当执行到该被标记成有问题的指令时,处理器产生指令预取中止异常中断。

当发生指令预取中止异常中断时,程序要返回到该有问题的指令处,重新读取并执行该指令。因此指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处,而不是返回到发生中断的指令的下一条指令。

指令预取中止异常中断是由当前执行的指令自身产生的,当指令预取中止异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令(对于ARM指令来说,它指向当前指令地址加8个字节的w位置;对于Thumb指令来说,它指向当前指令地址加4个字节的位置)。当指令预取中止异常中断产生时,处理器将(PC-4)值保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令的下一条指令。因此返回操作可以通过下面的指令来实现:SUBS PC,LR,#4

该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。

发生数据访问异常中断时,程序要返回到该有问题的指令处,重新访问该数据,因此数据访问异常中断应该返回到产生该数据访问中止异常中断的指令处,而不是当前指令的下一条指令。

数据访问异常中断由当前执行的指令自身产生,当数据访问异常中断发生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置)。此时处理器将值(pc-4)保存到lr_abt中,它指向当前指令后面第2条指令,所以返回操作可以通过下面指令实现:subs pc, lr, #8

该指令将lr中的值减8后传给程序计数器pc中,实现程序返回,同时将SPSR_abt寄存器内容复制到当前程序状态寄存器CPSR中;

通常处理器执行完当前指令后,查询IRQ中断引脚,并查看是否允许IRQ中断,如果某个中断引脚有效,并且系统允许该中断产生,处理器将产生IRQ异常中断,当IRQ异常中断产生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置),当IRQ异常中断产生时,处理器将值(pc-4)保存到IRQ异常模式下的寄存器lr_irq中,它指向当前指令之后的第2条指令,因此返回操作可以通过下面指令实现:subs pc, lr, #4

与IRQ异常中断一样,处理器执行完当前指令后,查询FIQ中断引脚,并查看是否允许FIQ中断,如果中断引脚有效,并且系统允许该中断产生,处理器将产生FIQ异常中断,当FIQ异常中断产生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置),当FIQ异常中断产生时,处理器将值(pc-4)保存到IRQ异常模式下的寄存器lr_fiq中,它指向当前指令之后的第2条指令,因此返回操作可以通过下面指令实现:subs pc, lr, #4

这个取决于发生异常的位置。首先你要明白的是,pc是即将运行的下一条指令,还有流水线技术
另外,每一种异常发生的时机是不一样的,所以pc恢复的时候计算的方法也就不一样了。
例如:
IRQ异常发生时,PC的值等于当前执行指令加8,也就是中断返回地址加4,所以R14就是保存的这个值。所以PC恢复的时候就需要R14减4

未定义指令异常时,因为这个异常发生在指令译码阶段,所以,此时PC的值就是未定义指令加4(想想流水线),所以,R14刚好就是中断返回地质,所以就不用计算了,直接将R14复职给PC

预取指令异常是在流水线的执行阶段时才进入异常,所以PC的值是当前执行指令地址加8,即中断返回指令加4,所以PC恢复的时候就需要R14减4

数据中止异常,实在导致异常的指令执行后的下一条指令时才发生,所以PC的值是导致异常的指令执行后的下一条指令加8,所以PC恢复的时候就需要R14减8


php_ssh2 连接执行指令有返回值吗 比如 $cmd2="rm -rf \/home\/cs\/php...
看下手册,该函数的使用方法是 ssh2_exec ( resource $session , string $command [, string $pty [, array $env [, int $width = 80 [, int $height = 25 [, int $width_height_type = SSH2_TERM_UNIT_CHARS ]]] ) : resource 如果成功了,返回的是资源类型,失败时候返回的是false...

急急急!我刚在拍拍上买了个NOKIA E5-00 不知道是什么地方的水货?求大虾...
当分配失败时系统函数会返回一个0值,这时返回值“0”已不表示新启用的指针,而是系统向应用程序发出的一个通知,告知出现了错误。作为应用程序,在每一次申请内存后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的“健壮性”。若应用程序没有检查这个错误...

liunx 命令
find $HOME \\(-name a.out -o -name '*.o' \\) -atime +7 -exec rm {} \\; 从$HOME目录开始搜索,删除所有文件名为a.out 或 *.o 且访问时间在7天前的文件 1.25 grep [语法]: grep [选项] 模式 [文件...] [说明]: 在指定的文件中搜索模式,并显示所有包含模式的行,模式是一个正规表达式,在...

"0x04111f"指令引用的"0x004060000"内存。该内存不能为"written"._百度...
系统一直到现在都没有出现内存不能为 Read 的问题,除了部分软件自身的问题外,例如旧版的暴风影音播放完 RM 文件后关闭 MPC 程序出现内存不能为 Read。第二,我除了不玩大型游戏以外,我对系统的什么都操作过了。需要更大的 CPU、内存运算的程序也用过,也没有出现内存不能为 Read 的问题。QQ 游戏大厅、CS1.5 ...

想成为Java工程师有什么要求?
4、04.SpringMVC返回值类型及响应数据类型 提取码:bd9t 5、05.文件上传 提取码:pzy7 6、06.异常处理及拦截器 提取码:7a2y 7、07.SSM整合案例 提取码:lzzd 阶段四:高级框架 小总结: 这个阶段可不止Spring Boot,还有springcloud,springsecurity等等这些框架,就不一一列出来了,资料网上一大堆 学了Spring Boot...

Linux常用命令有哪些
7,uname -a \/\/查看linux内核等的一些信息 8,badblocks -s \/dev\/sda \/\/坏道扫描时显示进度 9,time command \/\/查看命令的运行时间 10,ls -lrt \/\/按时间的倒序排序 11,rsync -P \/\/同步时显示进度 12.history -c \/\/清楚历史命令 13,cd - \/\/返回上次目录 14,tree \/\/显示目录树 15,...

exit是什么的缩写形式
终止正在执行的进程。exit(1)表示异常退出.这个1是返回给操作系统的。exit(x)(x不为0)都表示异常退出 exit(0)表示正常退出 exit()的参数会被传递给一些操作系统,包括UNIX,Linux,和MS DOS,以供其他程序使用。stdlib.h: void exit(int status);参 数 : status \/\/程序退出的返回值....

播放电影文件时CPU占用100
这是影音文件的问题,和系统没有大多关系的。有的时候是这样的。有一些文件和脚本是可以压缩在影音文件中的。CPU百分之百,没事。你看看占用内存的情况

java一般怎么学习呢?
4、04.SpringMVC返回值类型及响应数据类型 提取码:bd9t 5、05.文件上传 提取码:pzy7 6、06.异常处理及拦截器 提取码:7a2y 7、07.SSM整合案例 提取码:lzzd 阶段4 3.Spring Data JPA 1、01.JAP的引入 提取码:o61r 2、02.JPA的入门案例 提取码:ld9u 3、03.主键生成策略 提取码:f8ri 4、04.JPA的...

电脑老是提示内存不能read怎么回事
当分配失败时系统函数会返回一个0值,这时返回值“0”已不表示新启用的光标,而是系统向应用程序发出的一个通知,告知出现了错误。作为应用程序,在每一次申请内存后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的“健壮性”。若应用程序没有检查这个错误,它就会按照“思维...

平乐县19773438001: arm 汇编pc ,lr是什么意思 -
冷飘养胃: lr就是连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时,LR中保存的值等于异常发生时PC的值减4(或者减2),因此在各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行.

平乐县19773438001: 请问对于ARM7指令来说,PC值的更新和取指令是同时进行的吗? -
冷飘养胃: pc寄存器指向的是被取值的指令,而不是指向正在执行的指令,即取指令和更新pc值是同时进行的.发生中断时是先将指令六(即下一条指令的地址)放入中断模式下的r14(lr)寄存器.而pc被强制赋值为0x18,然后跳转到异常向量表中取出指令,一般异常向量表中0x18位置处的代码为ldr pc,_irq._irq为中断处理函数的入口地址.望采纳!

平乐县19773438001: arm异常处理方式与X86有什么不同 -
冷飘养胃: 机制一样:申请中断、相应中断、中断处理、中断返回 由于硬件不一样,细节上有很大区别,比如ARM的中断向量表:ARM:Vectors LDR PC, Reset_Addr ;0x00000000复位 LDR PC, Undef_Addr ;0x00000004未定义异常 LDR PC, SWI_Addr ;...

平乐县19773438001: 如何处理ARM的异常和中断 -
冷飘养胃: 异常是需要中止指令正常执行的任何情形,包括ARM内核产生复位,取指或存储器访问失败,遇到未定义指令,执行了软件中断指令,或者出现了个外部中断等. 异常处理就是处理这些异常情况的方法.大多数异常都对应一个软件的异常处理程序,一个在异常发生时执行的软件程序. 每种异常都导致内核进入一种特定的模式.每个处理器模式都有一组各自的分组寄存器,处理器模式决定了哪些寄存器是活动的以及对cpsr的完全读/写访问. 同时,通过编程改变cpsr,可以进入任何ARM处理器模式.用户和系统模式,不通过异常进入,只能修改cpsr.

平乐县19773438001: 求大大回答,arm汇编里面返回指令为什么能用mov pc ,lr而不能用ldr pc,=lr? -
冷飘养胃: 你在调用函数之前不是把返回地址存在lr中了吗?返回的时候只要再把lr的值赋给PC就行 LDR r0,=name,像这种带等号的是伪指令,而不是ARM指令,LDR 伪指令用于加载立即数或一个地址值到指定寄存器.*如果name是立即数的话:LDR R0,=0X123;//将0X123存入R0 *如果name是个标识符:LDR R0,=NAME;//将NAME的地址存入R0 LR是寄存器,不是标示符

平乐县19773438001: arm下,pc实际指向的是当前指令+8的位置,那mov pc,lr 意思是lr存到当前指令+8的位置,如何实现返回? -
冷飘养胃: mov pc, lr 不是把 LR 存到当前指令 + 8 的位置,而是把 LR 的值复制到 PC,就是修改了 PC 的值,CPU 将从新的 PC 处执行.

平乐县19773438001: 在ARM汇编程序如何实现子程序的返回 -
冷飘养胃: 子程序进入时,返回地址保存在LR寄存器中,返回有两种做法: 1. 将LR直接赋给PC:MOV PC, LR 2. 直接跳转:BX LR

平乐县19773438001: arm嵌入式里,发生异常的指令地址为LR - 2 是什么意识? -
冷飘养胃: 你好!说的再明确点希望对你有所帮助,望采纳.

平乐县19773438001: arm和thumb状态怎样切换
冷飘养胃: 当操作数寄存器的状态位(位[0])为0时,执行BX指令进入ARM状态(处理器进行异常处理情况下,把PC放入异常模式链接寄存器中).从异常向量地址开始执行也可以进入ARM状态.

平乐县19773438001: ARM有几种异常?其异常处理方式和x86有甚么不同? -
冷飘养胃: 最好答案: 架构,这里是值得指令集. 指令集的类型和不同的指令集,组成不同的架构. 类型包括两大类:精简指令集和复杂指令集 不同的指令集:比如精简指令集包括的...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网