使用SWI指令完成两个数的相加和相乘

在操作过程中,pc=0开始执行,但在实际操作过程中,是pc+p15实际地址是从0x40000000开始

AREA topswi, CODE, READONLY

entry

ldr 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,=0x10000000 
LDR 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_Handler

  STMFD sp!,{r7-r12,lr}

第二次入栈,lr中存放的是LDMFD sp!, {r1-r12,pc};

  teq r0,#1
  beq 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};

此时已经执行完加法操作,要去执行乘法操作

final
NOP
END

猜你喜欢

转载自blog.csdn.net/chengchaonan/article/details/80731878