-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdivide.asm
135 lines (103 loc) · 1.73 KB
/
divide.asm
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
131
132
133
134
135
.data
randomizer: .word 0x995
.text
main:
li $a0, 10 # X
li $a1, 4 # Y
jal generate_random
move $a0, $v1
li $v0, 1
syscall
li $a0, 10 # X
li $a1, 4 # Y
jal generate_random
move $a0, $v1
li $v0, 1
syscall
li $a0, 10 # X
li $a1, 4 # Y
jal generate_random
move $a0, $v1
li $v0, 1
syscall
li $a0, 10 # X
li $a1, 4 # Y
jal generate_random
move $a0, $v1
li $v0, 1
syscall
j end_Program
generate_random:
addi $sp, $sp, -4
sw $ra, 0($sp)
jal multiply #mul X*Y
li $a0, 0xe9a5
lw $t0, randomizer
add $a0, $a0, $t0
move $a1, $v0
jal multiply
move $a0, $v0
sw $v0, randomizer
li $a1, 4
jal divide # $v0 will have the return value from generate_random
generate_random_exit:
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
multiply:
addi $sp, $sp, -4
sw $ra, 0($sp)
move $t2, $a0
move $t3, $a1
li $t4, 0 # multipler index
multiply_loop:
bge $t4, $t3, multiply_loop_end
addu $t2, $t2, $t3
addi $t4, $t4, 1
j multiply_loop
multiply_loop_end:
move $v0, $t2
multiply_exit:
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
divide:
addi $sp, $sp, -4
sw $ra, 0($sp)
move $t2, $a0
move $t3, $a1
li $t4, 0 # quotient
divide_loop:
blt $t2, $t3, divide_loop_end
# move $a0, $t2
# move $a1, $t3
# jal subtract
sub $t2, $t2, $t3
addi $t4, $t4, 1
j divide_loop
divide_loop_end:
move $v0, $t4
move $v1, $t2
divide_exit:
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
subtract:
addi $sp, $sp, -4
sw $ra, 0($sp)
move $t0, $a0
move $t1, $a1
subtract_loop:
beq $t1, $zero, subtract_loop_end
addi $t0, $t0, -1
addi $t1, $t1, -1
j subtract_loop
subtract_loop_end:
move $v0, $t0
subtract_exit:
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
end_Program:
li $v0, 10
syscall