Struct four_results
{
int a;
int b;
int c;
int d;
};
__swi(3) __value_in_regs struct four_results
Many operations (int ,int,int,int);
#include
#include “swi.h”
Unsigned *swi_vec=(unsigned *)0x08;
Unsigned install_Handler(unsigned routine, unsigned *vector)
{
Unsigned vec,old_vec;
Vec=(routine –(unsigned)vector-8)>>2;
If (vec & 0xff000000)
{
print(“Handler greter than 32Mbytes from vector”);
vec=0xea000000 |vec;
Old_vec=*vector;
*vector=vec;
Return(old_vec);
}
Int result1,result2;
Struct fcur_results result3;
Install_Handler ((unsigned) SWI_Handler,swi_vec);
Printf(“result1=mutiply_two (2,4)=%d\n”,
Result1=multiply_two(2,4));
Printf(“result2=mutiply_two (3,6)=%d\n”,
Result2=multiply_two(3,6));
Printf(“add_two(result1,result2 ) =%d\n, add_two(result1,result2));
Printf(‘add_multiply_two(2,4,3,6)=&d\n”,add_multiply_two(2,4,3,6));
Res_3=many_operations(12,4,3,1);
Printf(“res_3.a=&d\n”,res_3.a);
Printf(“res_3.b=&d\n”,res_3.b);
Printf(“res_3.c=&d\n”,res_3.c);
Printf(“res_3.d=&d\n”,res_3.d);
Return 0;
}
;第1 级SWI 异常中断处理程序 SWI_Handler
;SWI_Handler 在前面已有详细介绍
AREA SWI_Area, CODE,PEADONLY
EXPORT SWI_Handler
IMPORT C_SWI_Handler
T_bit EQU 0x2c
SWI_Handler
STMED sp!(r0-r3,r12,lr)
MOV r1,sp
MRS r0,spsr
STMFD sp!,(r0)
TST r0,#T_bit
LDRNEH r0(lr,#-2)
BTCNE r0,r0,#0xff00
LDREQ r0,(lr,#-4)
BICEQ r0,r0,#0xff000000
BL C_SWI_Handler
LDMFD sp!,(r0)
MSR spsr cf,r0
LDMFD sp!,(r0-r3,r12,pc)^
END
Void C_SWI_Handler (int swi_num,int *regs)
{
Switch (swi_num)
{
//对应于SWI 0x0
case 0:
regs[0]=regs[0]*regs[1];
break;
//对应于SWI 0x1
case 1:
regs[0]=regs[0]+ regs[1];
break;
//对应于SWI 0x2
case 2:
regs[0]=(regs[0]*regs[1]) +(regs[2]*regs[3]);
break;
//对应于SWI 0x3
case 3:
{int w,x,y,z;
w=regs[0];
x=regs[1];
y=regs[2];
z=regs[3];
regs[0]=w+x+y+z;
regs[1]=w-x-y-z;
regs[2]=w*x*y*z;
regs[3]=(w+x)*(y-z);
}
Break;
}
}
③ 从应用程序中动态调用 SWI
在有些情况下,直到运行时才能够确定需要调用的 SWI 功能号。这时,有两种
方法处理这种情况。
第 1 种方法是在运行时得到 SWI 功能号,然后构造出相应的 SWI 指令的编码,
把这个指令的编码保存在一个存储器单元中,执行该指令即可。
第 2 种方法使用一个通用的 SWI 异常中断处理程序,将运行时需要调用的 SWI
功能号作为参数传递给该通用的 SWI 异常中断处理程序,通用的 SWI 异常中断
处理程序根据参数值调用相应的 SWI 处理程序完成需要的操作。
在汇编程序中很容易实现第 2 中方法。在执行 SWI 指令之前先将需要调用的 SWI