質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

1回答

964閲覧

C言語のmystrcat関数をMIPSのアセンブリ⾔語に翻訳する方法がわからない。

aoba-purines

総合スコア13

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

0クリップ

投稿2022/06/08 17:12

C言語の次のようなmystrcat関数を

void mystrcat(char *s, char *t) { int i = strlen(s); strcpy(s+i, t); }

MIPSのアセンブリ言語に翻訳する(MIPSでmystrcat関数を作る)という課題です。MIPSのmain関数は次のようになっていて、

.data nl: .asciiz "\n" s: .space 20 t: .asciiz " World" .text .globl main main: add $sp, $sp, -36 sw $ra, 0($sp) sw $s0, 4($sp) sw $s1, 8($sp) sw $s2, 12($sp) sw $s3, 16($sp) sw $s4, 20($sp) sw $s5, 24($sp) sw $s6, 28($sp) sw $s7, 32($sp) li $s0, 19 li $s1, 17 li $s2, 13 li $s3, 11 li $s4, 7 li $s5, 5 li $s6, 3 li $s7, 2 la $a0, s li $t0, 'H' sb $t0, 0($a0) li $t0, 'e' sb $t0, 1($a0) li $t0, 'l' sb $t0, 2($a0) li $t0, 'l' sb $t0, 3($a0) li $t0, 'o' sb $t0, 4($a0) sb $zero, 5($a0) la $a1, t jal mystrcat la $a0, s jal print_str # まず「Hello World」<改行> が表示され, la $a0, s sb $zero, 0($a0) la $a1, t jal mystrcat la $a0, s jal print_str # 次に「 World」<改行> が表示されればOK move $t0, $s0 mul $t0, $t0, $s1 mul $t0, $t0, $s2 mul $t0, $t0, $s3 mul $t0, $t0, $s4 mul $t0, $t0, $s5 mul $t0, $t0, $s6 mul $t0, $t0, $s7 sub $a0, $t0, 9699690 jal print_int # 最後に0<改行>が表示されれば恐らく$snの使用法ミスはなし($snの使用法チェックコードの実行結果) lw $ra, 0($sp) lw $s0, 4($sp) lw $s1, 8($sp) lw $s2, 12($sp) lw $s3, 16($sp) lw $s4, 20($sp) lw $s5, 24($sp) lw $s6, 28($sp) lw $s7, 32($sp) add $sp, $sp, 36 jr $ra print_int: li $v0, 1 syscall la $a0, nl li $v0, 4 syscall jr $ra print_str: li $v0, 4 syscall la $a0, nl li $v0, 4 syscall jr $ra strlen: move $v0, $zero strlenloop: lb $t0, 0($a0) beq $t0, $zero, strlenexit add $v0, $v0, 1 add $a0, $a0, 1 j strlenloop strlenexit: jr $ra strcpy: strcpyloop: lb $t0, 0($a1) sb $t0, 0($a0) addi $a1, $a1, 1 addi $a0, $a0, 1 bne $t0, 0, strcpyloop jr $ra
Hello World World 0

と表示されれば成功となります。私はmystrcat関数を以下のように作成したのですが、

mystrcat: jal strlen add $a0, $a0, $v0 jal strcpy jr $ra

走らせても何も起きません。MIPSの学習を始めたばかりであり、プログラムの命令がおかしいのか、レジスタの退避,復元ができていないのかさえもわかりません。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

jal strlen add $a0, $a0, $v0

この実装の strlen$a0 を変更してしまいます。strlen の呼び出し前に $a0 の値をどこかに保存して呼び出し後に復元しましょう。

投稿2022/06/08 23:31

int32_t

総合スコア20884

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aoba-purines

2022/06/09 06:18 編集

mystrcat: sw $a0, 4($sp) jal strlen lw $a0, 4($sp) add $a0, $a0, $v0 jal strcpy jr $ra としても動きません。どうすれば良いでしょうか?$sp以外に退避させる方法があるのでしょうか?
int32_t

2022/06/09 06:36

strlen と strcpy の呼び出しのために $ra も保存復帰する必要がありますね。 あと、いきなり 4($sp) に保存すると使用中のスタックの値を破壊しませんかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問