質問編集履歴

1

必要な部分だけにしました。

2021/06/29 12:58

投稿

yomoanyan
yomoanyan

スコア14

test CHANGED
@@ -1 +1 @@
1
- MIPSアセンブリ言語を使ったコンビネーション計算
1
+ MIPSアセンブリ言語の階乗
test CHANGED
@@ -2,11 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- MIPSのアセンブリ言語使ってコンビネーション(nCr)の計算を行うプログラムを作成したいです
5
+ 階乗を計算したい。
6
-
7
- n > rは前提としています。また、オーバーフローもないものとしています。
8
-
9
-
10
6
 
11
7
  申し訳ありませんが、バージョンは分かりません。
12
8
 
@@ -22,123 +18,7 @@
22
18
 
23
19
  ### 作成したコード
24
20
 
25
- ```MIPSアセンブリ言語
26
-
27
- .text
21
+ fact:
28
-
29
- .globl main
30
-
31
-
32
-
33
- main: addi $sp, $sp, -12
34
-
35
- sw $ra, 0($sp) # 戻り先アドレスの退避
36
-
37
- li $v0, 5
38
-
39
- syscall
40
-
41
- move $a0, $v0 # a0 = n
42
-
43
- sw $a0, 4($sp) # a0を退避 必要か微妙
44
-
45
- li $v0, 5
46
-
47
- syscall
48
-
49
- move $a1, $v0 # a1 = r
50
-
51
- sw $a1, 8($sp) # a1を退避 必要か微妙
52
-
53
- lw $a0, 4($sp)   # combiへ渡す引数a0を持ってくる
54
-
55
- lw $a1, 8($sp) # combiへ渡す引数a1を持ってくる
56
-
57
- jal combi
58
-
59
- move $a0, $v0 # 返ってきた結果をa0に渡す
60
-
61
- li $v0, 1 # print_int
62
-
63
- syscall
64
-
65
- lw $a1, 8($sp)
66
-
67
- lw $a0, 4($sp)
68
-
69
- lw $ra, 0($sp)
70
-
71
- addi $sp, $sp, 12 # スタックに確保した領域の開放
72
-
73
- jr $ra
74
-
75
-
76
-
77
-
78
-
79
- combi: addi $sp, $sp, -12
80
-
81
- sw $ra, 0($sp) # 戻り先アドレスの退避
82
-
83
- sw $a0, 4($sp) # a0の退避
84
-
85
- sw $a1, 8($sp) # a1の退避
86
-
87
- move $s0, $zero
88
-
89
- move $s1, $zero
90
-
91
- lw $a0, 4($sp) # a0の復元
92
-
93
- jal fact # 引数a0(=n)
94
-
95
- move $s0, $v0 # s0 = n!
96
-
97
- lw $a0, 8($sp) # a1を復元し、それをa0に入れる
98
-
99
- jal fact # 引数a1(=r)
100
-
101
- move $s1, $v0 # s1 = r!
102
-
103
- lw $a0, 4($sp) # a0の復元
104
-
105
- lw $a1, 8($sp) # a1の復元
106
-
107
- sub $a0, $a0, $a1 # a0 = a0 - a1(= n - r)
108
-
109
- jal fact # 引数a0(=a0-a1)
110
-
111
- move $s2, $v0 # s2 = (n-r)!
112
-
113
- mult $s1, $s2 # s1 * s2 (=r! * (n-r)!)
114
-
115
- mflo $s3 # s3 = Lo
116
-
117
- div $s0, $s3 # s0/s3 (=n!/(r!*(n-r)!))
118
-
119
- mflo $v0 # v0 = Lo
120
-
121
- lw $t1, 8($sp)
122
-
123
- lw $t0, 4($sp)
124
-
125
- lw $ra, 0($sp)
126
-
127
- addi $sp, $sp, 12 # スタックに確保した領域の開放
128
-
129
- jr $ra
130
-
131
-
132
-
133
-
134
-
135
- fact: addi $sp, $sp, -12
136
-
137
- sw $ra, 0($sp) # 戻り先アドレスの退避
138
-
139
- sw $s0, 4($sp) # s0の退避
140
-
141
- sw $s1, 8($sp) # s1の退避
142
22
 
143
23
  move $s1, $zero # s1を初期化
144
24
 
@@ -156,57 +36,11 @@
156
36
 
157
37
  bgt $a0, $s0, Loop # s0 > s0 ならばLoop
158
38
 
159
-
160
-
161
- lw $s1, 8($sp)
162
-
163
- lw $s0, 4($sp)
164
-
165
- lw $ra, 0($sp) # 戻り先アドレスの復元
166
-
167
- addi $sp, $sp, 12 # スタックに確保した領域の開放
168
-
169
- move $v0, $s1
170
-
171
- jr $ra
172
-
173
-
174
-
175
- ```
176
-
177
- ### 発生している問題・エラーメッセージ
178
-
179
- 以下のように0しか返ってきません。
180
-
181
- ```
182
-
183
- (spim) run
184
-
185
- 5
186
-
187
- 3
188
-
189
- 0(spim)
190
-
191
- 6
192
-
193
- 2
194
-
195
- 0(spim)
196
-
197
39
  ```
198
40
 
199
41
 
200
42
 
201
- ### お聞きしたいこと
202
-
203
-
204
-
205
- - 上記のコードの問題点はどこか
43
+ どこが間違っているのでしょう
206
-
207
- - 引数の渡し方がいまいちよくわからないので教えて欲しい(上のコードの渡し方は正しいのか)
208
-
209
- - lwはswで退避させた値を退避させた場所から、何度も持ってくることができるのか(できると思って上記のコードは書いています)
210
44
 
211
45
 
212
46