回答編集履歴

5

.

2022/06/16 02:02

投稿

int32_t
int32_t

スコア20909

test CHANGED
@@ -1,6 +1,9 @@
1
1
  * `0($sp)` は呼び出し元で使用中の領域です。`-4($sp)` など、関数呼び出し時の `$sp` よりも若いアドレスの領域を使ってください。そして、他の関数を呼ぶ前に `$sp` がスタック使用中の一番若いアドレスを指すように調整する必要があります。なので、`main` でやっているように冒頭で`$sp`の値を必要なだけ減らして、`0($sp)` `4($sp)` などを使うのが常套手段です。
2
2
 
3
- * `$t6` は `strlen` と `strcpy` の呼び出しで破壊される可能性があります。`$ra` はスタックか `$s0`〜`$s7` などに保存しておきましょう。
3
+ * `$t6` は `strlen` と `strcpy` の呼び出しで破壊される可能性があります(*1)。`$ra` はスタックか `$s0`〜`$s7` などに保存しておきましょう(*2)
4
+
5
+ *1: この質問の `strlen` と `strcpy` の実装は `$t6` を使っていませんが、MIPS の決まりとして破壊されるかもしれないレジスタとして扱います。
6
+
4
- (しかし `$s0`〜`$s7` に保存するなら、その元の値をやはりスタックなどに保存しておく必要があるので、けっきょく `$ra` はスタックに保存するのが手っ取り早いです。)
7
+ *2: しかし `$s0`〜`$s7` に保存するなら、その元の値をやはりスタックなどに保存しておく必要があるので、けっきょく `$ra` はスタックに保存するのが手っ取り早いです。
5
8
 
6
9
 

4

文言

2022/06/16 01:56

投稿

int32_t
int32_t

スコア20909

test CHANGED
@@ -1,6 +1,6 @@
1
- * `0($sp)` は呼び出し元で使用中の領域です。`-4($sp)` など、`0($sp)` よりも若いアドレスの領域を使ってください。そして、他の関数を呼ぶ前に `$sp` がスタック使用中の一番若いアドレスを指すように調整する必要があります。
1
+ * `0($sp)` は呼び出し元で使用中の領域です。`-4($sp)` など、関数呼び出し時の `$sp` よりも若いアドレスの領域を使ってください。そして、他の関数を呼ぶ前に `$sp` がスタック使用中の一番若いアドレスを指すように調整する必要があります。なので、`main` でやっているように冒頭で`$sp`の値を必要なだけ減らして、`0($sp)` `4($sp)` などを使うのが常套手段です。
2
2
 
3
3
  * `$t6` は `strlen` と `strcpy` の呼び出しで破壊される可能性があります。`$ra` はスタックか `$s0`〜`$s7` などに保存しておきましょう。
4
- (しかし `$s0`〜`$s7` に保存するなら、その元の値をやはりスタックなどに保存しておく必要があるので、けっきょくスタックです。)
4
+ (しかし `$s0`〜`$s7` に保存するなら、その元の値をやはりスタックなどに保存しておく必要があるので、けっきょく `$ra` はスタックに保存するのが手っ取り早いです。)
5
5
 
6
6
 

3

.

2022/06/16 01:51

投稿

int32_t
int32_t

スコア20909

test CHANGED
@@ -1,4 +1,4 @@
1
- * `0($sp)` は呼び出し元で使用中の領域です。`-4($sp)` など、`0($sp)` よりも若いアドレスの領域を使ってください。
1
+ * `0($sp)` は呼び出し元で使用中の領域です。`-4($sp)` など、`0($sp)` よりも若いアドレスの領域を使ってください。そして、他の関数を呼ぶ前に `$sp` がスタック使用中の一番若いアドレスを指すように調整する必要があります。
2
2
 
3
3
  * `$t6` は `strlen` と `strcpy` の呼び出しで破壊される可能性があります。`$ra` はスタックか `$s0`〜`$s7` などに保存しておきましょう。
4
4
  (しかし `$s0`〜`$s7` に保存するなら、その元の値をやはりスタックなどに保存しておく必要があるので、けっきょくスタックです。)

2

0($sp) について

2022/06/16 01:45

投稿

int32_t
int32_t

スコア20909

test CHANGED
@@ -1,4 +1,6 @@
1
+ * `0($sp)` は呼び出し元で使用中の領域です。`-4($sp)` など、`0($sp)` よりも若いアドレスの領域を使ってください。
2
+
1
- `$t6` は `strlen` と `strcpy` の呼び出しで破壊される可能性があります。`$ra` はスタックか `$s0`〜`$s7` などに保存しておきましょう。
3
+ * `$t6` は `strlen` と `strcpy` の呼び出しで破壊される可能性があります。`$ra` はスタックか `$s0`〜`$s7` などに保存しておきましょう。
2
4
  (しかし `$s0`〜`$s7` に保存するなら、その元の値をやはりスタックなどに保存しておく必要があるので、けっきょくスタックです。)
3
5
 
4
6
 

1

.

2022/06/16 01:42

投稿

int32_t
int32_t

スコア20909

test CHANGED
@@ -1,2 +1,4 @@
1
1
  `$t6` は `strlen` と `strcpy` の呼び出しで破壊される可能性があります。`$ra` はスタックか `$s0`〜`$s7` などに保存しておきましょう。
2
+ (しかし `$s0`〜`$s7` に保存するなら、その元の値をやはりスタックなどに保存しておく必要があるので、けっきょくスタックです。)
2
3
 
4
+