收藏 分享(赏)

swi软中断.doc

上传人:pw17869 文档编号:5837879 上传时间:2019-03-19 格式:DOC 页数:4 大小:30KB
下载 相关 举报
swi软中断.doc_第1页
第1页 / 共4页
swi软中断.doc_第2页
第2页 / 共4页
swi软中断.doc_第3页
第3页 / 共4页
swi软中断.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

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营业执照举报