ARM的中断处理和SWI参数问题

scuahui   2010-3-2 04:17 楼主
我现在知道的在ARM里软件中断(SWI call)是用来将模式转换成超级用户模式的(SVC mode)
然后用这两句话可以将SWI的参数储存在R0里面

LDR R0,[LR,#-4]
BIC R0,R0, #0xFF000000

因为刚刚学习ARM, 现在我不理解的是这个SWI的参数到底可以用来干什么。看到有资料说是用这个值可以找到下一段要执行程序的地址,我不知道如何运用。比如说我现在有个很简单的程序如下

MOV R0, #12
ADD R0,R0,#2

然后我现在希望可以通过一个中断处理程序在超级用户模式(SVC)下求R0的值或者说运行上面两行代码,要用到SWI call,应该怎么做? 希望高手能指点下,谢谢!

回复评论 (3)

帮顶下。

MARK。
点赞  2010-3-2 08:49
在ARM7和ARM9中,SWI函数是运行在Supervisor模式下的, 能接受参数,并返回值,跟普通函数使用起来一样。编译器隐藏了SWI函数和普通函数的区别, 调用SWI函数实际是调用一个SWI指令,执行到SWI指令时,ARM被改到Supervisor模式运行,并阻塞IRQ请求(注意:并没有阻止FIQ请求)。当ARM离开Supervisor模式, 中断重新打开。从Supervisor模式返回,是用MOVS指令实现的,(MOVS pc, lr) 它改变PC, 也恢复原来的CPSR。
参考:[url=http://zhiwei.li/text/2009/07/arm%E7%9A%84%E8%BD%AF%E4%BB%B6%E4%B8%AD%E6%96%ADswi%E5%92%8C%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8system-call/][/url]
点赞  2010-3-2 10:05
那如果把程序

MOV R0, #12
ADD R0,R0,#2

通过一个中断处理程序在超级用户模式(SVC)下求出R0的值或者说运行上面两行代码,具体代码应该怎么写?
点赞  2010-3-2 19:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复