swi软中断.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
swi软中断

arm?软件中断的方法介绍 ?SWI指令---软件中断实例详解 关键字:? SWI,指令,软件中断,实例,详解 SWI,即software interrupt软件中断。该指令产生一个SWI异常。意思就是处理器模式改变为超级用户模式,CPSR寄存器保存到超级用户模式下的SPSR寄存器,并且跳转到SWI向量。其ARM指令格式如下: SWI{cond} immed_24 Cond域:是可选的条件码 (参见 ARM汇编指令条件执行详解). immed_24域:范围从 0 到 224-1 的表达式, (即0。用户程序可以使用该常数来进入不同的处理流程。 一、方法1:获取immed_24操作数。 为了能实现根据指令中immed_24操作数的不同,跳转到不同的处理程序,所以我们往往需要在SWI异常处理子程序中去获得immed_24操作数的实际内容。获得该操作数内容的方法是在异常处理函数中使用下面指令: LDR???? R0,[LR,#-4] 该指令将链接寄存器LR的内容减去4后所获得的值作为一个地址,然后把该地址的内容装载进R0。此时再使用下面指令,immed_24操作数的内容就保存到了R0: BIC???? R0,R0,#0xFF000000 该指令将R0的高8位清零,并把结果保存到R0,意思就是取R0的低24位。 可能还是有人会问:为什么在SWI异常处理子程序中执行这两条指令后,immed_24操作数的内容就保存到了R0寄存器呢?之所以会有这样的疑问,基本都是因为对LR寄存器的作用没了解清楚。下面介绍一下链接寄存器LR(R14)的作用。 寄存器R14(LR寄存器)有两种特殊功能: ·在任何一种处理器模式下,该模式对应的R14寄存器用来保存子程序的返回地址。当执行BL或BLX指令进行子程序调用时,子程序的返回地址被放置在R14中。这样,只要把R14内容拷贝到PC中,就实现了子程序的返回(具体的子程序返回操作,这里不作详细介绍)。 ·当某异常发生时,相应异常模式下的R14被设置成异常返回的地址(对于某些异常,可能是一个偏移量,一个较小的常量)。异常返回类似于子程序返回,但有小小的不同(这里不作详细介绍)。 所谓的子程序的返回地址,实际就是调用指令的下一条指令的地址,也就是BL或BLX指令的下一条指令的地址。所谓的异常的返回的地址,就是异常发生前,CPU执行的最后一条指令的下一条指令的地址。 例如:(子程序返回地址示例) 指令?????????????????????? 指令所在地址 ADD???? R2,R1,R3???????????? ;0x300000 BL????? subC?????????????????? ;0x300004 MOV???? R1,#2????????????????? ;0x300008 BL指令执行后,R14中保存的子程序subC的返回地址是0x300008。 再例如:(异常返回地址示例) 指令?????????????????????? 指令所在地址 ADD???? R2,R1,R3???????????? ;0x300000 SWI???? 0x98?????????????????? ;0x300004 MOV???? R1,#2????????????????? ;0x300008 SWI指令执行后,进入SWI异常处理程序,此时R14中保存的返回地址为0x300008。 所以,在SWI异常处理子程序中执行 LDR? R0,[LR,#-4]语句,实际就是把产生本次SWI异常的SWI指令的内容(如:SWI?? 0x98)装进R0寄存器。又因为SWI指令的低24位保存了指令的操作数(如:0x98),所以再执行BIC?? R0,R0,#0xFF000000语句,就可以获得immed_24操作数的实际内容。 二、方法2:使用参数寄存器。 ??? 实际上,在SWI异常处理子程序的实现时,还可以绕开immed_24操作数的获取操作,这就是说,我们可以不去获取immed_24操作数的实际内容,也能实现SWI异常的分支处理。这就需要使用R0-R4寄存器,其中R0-R4可任意选择其中一个,一般选择R0,遵从ATPCS原则。 ??? 具体方法就是,在执行SWI指令之前,给R0赋予某个数值,然后在SWI异常处理子程序中根据R0值实现不同的分支处理。例如: 指令?????????????????????? 指令所在地址 MOV???? R0,#1????????????????? ; #1给R0 SWI???? 0x98?????????????????? ; 产生SWI中断,执行异常处理程序SoftwareInterrupt ADD???? R2,R1,R3???????????? ; ? ;SWI异

文档评论(0)

sb9185sb + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档