在操作过程中,pc=0开始执行,但在实际操作过程中,是pc+p15实际地址是从0x40000000开始
AREA topswi, CODE, READONLY
entryldr pc,=start
mov r0,#0xff
b SWI_Handler
B C_SWI_Handler
start
LDR R1,=0x10101010
LDR R2,=0x20202020
LDR R3,=0x1010101
LDR R4,=0x2020202
SWI 1
这是程序发生的第一次swi,会跳转到b swi_handler处,此时还有cpu自动完成的thumb转化为ARM
lr=pc-4,比如swi此时是00,那么pc=08,lr=04,也就是下一条指令,此时代表执行乘法操作
这时需要将所有数据入栈,并且在加法执行完成之后数据出栈,将lr 的值给pc即可跳转到下一步
LDR R1,=0x10000000LDR R2,=0x20000000
SWI 2
在乘法的操作过程中,同样发生跳转保存
MOV R0,#0
MOV R1,#0
MOV R2,#0
SWI 3 ;final
SWI_Handler
ldr sp,=0xff30
STMFD sp!,{r1-r12,lr}
swi1之后将所有的数据入栈
第一次入栈,lr中存放的是LDR R1,=0x10000000
LDR r0,[lr,#-4]
BIC r0,r0,#0xff000000
BL C_SWI_Handler这里发生跳转,同样cpu执行操作lr=pc-4,这一步此时不执行直接执行c_swi_handler指令
LDMFD sp!, {r1-r12,pc};
第二次出栈,pc中装入的是LDR R1,=0x10000000
也就是此时去操作乘法
C_SWI_HandlerSTMFD sp!,{r7-r12,lr}
第二次入栈,lr中存放的是LDMFD sp!, {r1-r12,pc};
teq r0,#1beq add1
teq r0,#2
beq mull
B final
add1
ADDS R3,R1,R3
ADC R4,R2,R4
B EndofSW
mull
UMULL R5,R6,R1,R2
B EndofSW
EndofSW
SUB lr, lr, #4
LDMFD sp!, {r7-r12,pc}^
第一次出栈,pc中装入的是LDMFD sp!, {r1-r12,pc};
此时已经执行完加法操作,要去执行乘法操作
finalNOP
END