我现在知道的在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,应该怎么做? 希望高手能指点下,谢谢!
在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]
那如果把程序
MOV R0, #12
ADD R0,R0,#2
通过一个中断处理程序在超级用户模式(SVC)下求出R0的值或者说运行上面两行代码,具体代码应该怎么写?