ImageVerifierCode 换一换
格式:DOC , 页数:4 ,大小:30KB ,
资源ID:5837879      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-5837879.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(swi软中断.doc)为本站会员(pw17869)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

swi软中断.doc

1、arm 软件中断的方法介绍SWI指令-软件中断实例详解关键字: SWI,指令,软件中断,实例,详解SWI,即 software interrupt软件中断。该指令产生一个 SWI异常。意思就是处理器模式改变为超级用户模式,CPSR 寄存器保存到超级用户模式下的 SPSR寄存器,并且跳转到 SWI向量。其 ARM指令格式如下:SWIcond immed_24Cond域:是可选的条件码 (参见 ARM 汇编指令条件执行详解).immed_24域:范围从 0 到 224-1 的表达式, (即 0-16777215)。用户程序可以使用该常数来进入不同的处理流程。一、方法 1:获取 immed_24操作

2、数。为了能实现根据指令中 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异常处理子程序中执行这两条指令后,im

3、med_24操作数的内容就保存到了 R0寄存器呢?之所以会有这样的疑问,基本都是因为对 LR寄存器的作用没了解清楚。下面介绍一下链接寄存器LR(R14)的作用。寄存器 R14(LR寄存器)有两种特殊功能:在任何一种处理器模式下,该模式对应的 R14寄存器用来保存子程序的返回地址。当执行 BL或 BLX指令进行子程序调用时,子程序的返回地址被放置在R14中。这样,只要把 R14内容拷贝到 PC中,就实现了子程序的返回(具体的子程序返回操作,这里不作详细介绍)。当某异常发生时,相应异常模式下的 R14被设置成异常返回的地址(对于某些异常,可能是一个偏移量,一个较小的常量)。异常返回类似于子程序返回

4、,但有小小的不同(这里不作详细介绍)。所谓的子程序的返回地址,实际就是调用指令的下一条指令的地址,也就是 BL或 BLX指令的下一条指令的地址。所谓的异常的返回的地址,就是异常发生前,CPU执行的最后一条指令的下一条指令的地址。例如:(子程序返回地址示例)指令 指令所在地址ADD R2,R1,R3 ;0x300000BL subC ;0x300004MOV R1,#2 ;0x300008BL指令执行后,R14 中保存的子程序 subC的返回地址是 0x300008。再例如:(异常返回地址示例)指令 指令所在地址ADD R2,R1,R3 ;0x300000SWI 0x98 ;0x300004MO

5、V R1,#2 ;0x300008SWI指令执行后,进入 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操作数的获取操作,这就是说,我们可以不去

6、获取 immed_24操作数的实际内容,也能实现 SWI异常的分支处理。这就需要使用 R0-R4寄存器,其中 R0-R4可任意选择其中一个,一般选择 R0,遵从 ATPCS原则。具体方法就是,在执行 SWI指令之前,给 R0赋予某个数值,然后在 SWI异常处理子程序中根据 R0值实现不同的分支处理。例如:指令 指令所在地址MOV R0,#1 ; #1给 R0SWI 0x98 ; 产生 SWI中断,执行异常处理程序SoftwareInterruptADD R2,R1,R3 ;SWI异常处理子程序如下SoftwareInterruptCMP R0, #6 ; if R0 6LDRLO PC, PC

7、, R0, LSL #2 ; if R0 6,PC = PC + R0*4,else nextMOVS PC, LRSwiFunctionDCD function0 ;0DCD function1 ;1DCD function2 ;2DCD function3 ;3DCD function4 ;4DCD function5 ;5Function0异常处理分支 0代码Function1异常处理分支 1代码function2异常处理分支 2代码function3异常处理分支 3代码function4异常处理分支 4代码function5异常处理分支 5代码在 ARM体系结构中,当正确读取了 PC的

8、值时,该值为当前指令地址值加 8字节,也就是说,对于 ARM指令集来说,读出的 PC值指向当前指令的下两条指令的地址,本例中就是指向 SwiFunction 表头 DCD function0 这个地址,在该地址中保存了异常处理子分支 function0的入口地址。所以,当进入 SWI异常处理子程序 SoftwareInterrupt时,如果 R0=0,执行 LDRLO PC, PC, R0, LSL #2语句后,PC 的内容即为 function0的入口地址,即程序跳转到了function0执行。在本例中,因为 R0=1,所以,实际程序是跳转到了function1执行。R0 左移 2位(LDRLO PC, PC, R0, LSL #2),即 R0*4,是因为 ARM指令是字(4 个字节)对齐的 DCD function0等伪指令也是按 4字节对齐的。在本方法的实现中,实际指令中的 24位立即数(immed_24 域)被忽略了,就是说 immed_24域可以为任意合法的值。如在本例中,不一定使用 SWI 0x98,还可以为 SWI 0x00或者 SWI 0x01等等,程序还是会进入 SWI异常处理子程序 SoftwareInterrupt,然后根据 R0的内容跳转到相应的子分支。

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报