-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patharm_callout.S
92 lines (76 loc) · 2.04 KB
/
arm_callout.S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
.global bCallout
bCallout:
push {sp,lr,pc}
push {r0-r12}
mrs r0, cpsr /* r0 is scratch, temporarily storing cspr */
push {r0}
mov r0, sp /* setting the first arg (*SaveRegs) */
bl handleBCallout
pop {r0}
msr cpsr, r0
pop {r0-r12}
add sp, sp, #4
pop {lr,pc}
.global bccCallout
bccCallout:
push {sp,lr,pc}
push {r0-r12}
mrs r0, cpsr /* r0 is scratch, temporarily storing cspr -- control register */
push {r0}
mov r0, sp /* setting the first arg (*SaveRegs) */
bl handleBccCallout
pop {r0}
msr cpsr, r0
pop {r0-r12}
add sp, sp, #4
pop {lr,pc}
.global blCallout
blCallout:
push {sp,lr,pc}
push {r0-r12}
mrs r0, cpsr /* r0 is scratch, temporarily storing cspr */
push {r0}
mov r0, sp /* setting the first arg (*SaveRegs) */
bl handleBlCallout
pop {r0}
msr cpsr, r0
pop {r0-r12}
add sp, sp, #4
pop {lr,pc}
.global bxCallout
bxCallout:
push {sp,lr,pc} /* sp, pc not needed, just for data structure compliance */
push {r0-r12}
mrs r0, cpsr /* r0 is scratch, temporarily storing cspr */
push {r0}
mov r0, sp /* setting the first arg (*SaveRegs) */
bl handleBxCallout
pop {r0}
msr cpsr, r0
pop {r0-r12}
add sp, sp, #4 /* removing $sp from stack */
pop {lr}
add sp, sp, #4 /* removing $pc from stack */
bx lr
@
@ For part3-5.
@
.global condCallout
condCallout:
push {sp,lr,pc}
push {r0-r12}
mrs r0, cpsr /* r0 is scratch, temporarily storing cspr -- control register */
push {r0}
mov r0, sp /* setting the first arg (*SaveRegs) */
bl handleCondCallout
pop {r0}
msr cpsr, r0
pop {r0-r12}
add sp, sp, #4
pop {lr,pc}
@
@ For an extra credit assignment
@
.global popCallout
popCallout:
/* IMPLEMENT */