经过SWI异常中止指令,在用户形式下应用程序能够调用体系形式下的代码,在操作体系中表现为体系调用,
那这个进程又是怎么完成的呢?带着疑问让咱们来学习吧!
在SWI指令中包含一个24位的当即数(中止调用号),该当即数指示了用户要恳求的特定的调用功用,所以在SWI的异常中止中要读取这个中止调用号,然后依据中止号,来调用相应的处理程序。这个进程能够分两个过程:
1.SWI异常中止处理程序
由所以在底层操作所以这个异常中止处理程序得用汇编言语编写,描绘如下:
area top_swi code readonly
export swi_headler
swi_headler
stmfd sp!, {r0-r12, lr} ; 保存r0至r12,lr的寄存器值
ldr r0, [lr, #-4]; 从存储器中取得SWI指令的地点地址
bic r0, r0, #FF000000; 读取24位中止调用号
mov r1, sp
;================================================
bl swi_service_func; 调用功用服务函数,见下面
; 中止调用号经过r0寄存器传入
; 参数经过r1寄存器传入
;================================================
ldmfd sp!, {r0-r12, pc}^ ;康复调用前的r0至r12,脱离中止处理程序
end
2.功用服务程序
编写使用从中止处理函数取得的中止调用号咱们能够写出如下服务函数(为了简略咱们用C言语)
void swi_service_func(unsigned int number, unsigned int *reg)
{
unsigned int reg1, reg2, reg3, reg4;
//获取SWI前传入的参数
reg1 = reg[0];
reg2 = reg[1];
reg3 = reg[2];
reg4 = reg[3];
switch (number) {
case 0:
// do something
break;
case 1:
// do something
break;
.
.
.
case n:
// do something
break;
default:
// do something
}
}
// 更新成果存入r0-r3
reg[0] = updata_reg1;
reg[1] = updata_reg2;
reg[2] = updata_reg3;
reg[3] = updata_reg4;
}
这样一来只需中调用断号不同就能够完成不同的功用调用了,是不是很简略?