-
Notifications
You must be signed in to change notification settings - Fork 0
/
farina_madeline.s
130 lines (99 loc) · 1.71 KB
/
farina_madeline.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
.data
first : .space 256 //first number
second : .space 256 //second number
operator : .space 256
int : .asciz "%d"
string : .asciz "%s"
newline : .asciz "\n"
no_div_by_zero :.asciz "error, divison by zero"
inv_op : .asciz "invalid operator"
.global main
.text
main:
//scans in the inputs
ldr x0, = int
ldr x1, = first
bl scanf
ldr x0, = int
ldr x1, = second
bl scanf
ldr x0, = string
ldr x1, = operator
bl scanf
bl switch
//prints result
mov x1, x21
ldr x0, = int
bl printf
//flushes
ldr x0, = newline
bl printf
exit:
mov x0, #0
mov x8, #93
svc #0
switch:
ldr x23, = operator
ldr x23, [x23, 0]
//if operator is a +, goes to add function
sub x24, x23, #43
cbz x24, ADD
sub x25, x23, #45
cbz x25, SUB
sub x26, x23, #42
cbz x26, MUL
sub x27, x23, #47
cbz x27, ifzero
//else if +,-,*,/ not used, print error
b.gt invalid_operator
br x30
ADD:
ldr x19, = first
ldr x19, [x19, 0]
ldr x20, = second
ldr x20, [x20, 0]
add x21, x20, x19
br x30
SUB:
ldr x19, = first
ldr x19, [x19, 0]
ldr x20, = second
ldr x20, [x20, 0]
sub x21, x19, x20
br x30
MUL:
ldr x19, = first
ldr x19, [x19, 0]
ldr x20, = second
ldr x20, [x20, 0]
mul x21, x20, x19
br x30
ifzero:
ldr x20, = second
ldr x20, [x20, 0]
//if second num is a 0, print error
cbnz x20, DIV
bl bad_div
br x30
DIV:
ldr x19, = first
ldr x19, [x19, 0]
ldr x20, = second
ldr x20, [x20, 0]
//have to use w
sdiv w21, w19, w20
br x30
bad_div:
//prints error if user inputs 0 for second num
ldr x0, = no_div_by_zero
bl printf
ldr x0, = newline
bl printf
b exit
invalid_operator:
//prints error if user inputs invalid operator
ldr x0, = inv_op
bl printf
ldr x0, = newline
bl printf
b exit