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

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

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

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

MIPS

MIPSは、コンピュータの処理速度を表す単語。1MIPSは、1秒間に100万命令実行であることを表します。CPU/MPUなどのプロセッサの性能を反映するため、プロセッサの性能指標としても用いられます。

Q&A

2回答

840閲覧

MIPSのアセンブリ言語で階上計算のプログラムを作成する

gdhdkjd

総合スコア0

アセンブリ言語

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

MIPS

MIPSは、コンピュータの処理速度を表す単語。1MIPSは、1秒間に100万命令実行であることを表します。CPU/MPUなどのプロセッサの性能を反映するため、プロセッサの性能指標としても用いられます。

0グッド

0クリップ

投稿2023/12/19 13:08

編集2023/12/19 13:28

前提

MIPSのアセンブリ言語に関する質問です。
fact関数を用いて、入力された整数の階乗を出力するプログラムを作成したいです。fact関数を作成することはできたのですが、入力を即すプログラムや結果を出力するプログラムがわかりません。main関数の部分を記述していただきたいです。

###試したこと
以下のプログラムをmainとして作成しました。
li $v0, 4 # syscall: print_str
la $a0, Text1 # load address of Text1 to $a0
syscall

li $v0, 5 # syscall: read_int
syscall
move $a0, $v0 # move the input value to $a0

jal fact # call the factorial function

li $v0, 4 # syscall: print_str
la $a0, Text2 # load address of Text2 to $a0
syscall

li $v0, 1 # syscall: print_int
move $a0, $v0 # move the result to $a0
syscall

li $v0, 10 # syscall: exit
syscall

実現したいこと

fact関数を用いて、入力された整数の階上を出力するプログラムを作成したいです。

MIPS

以下が作成したプログラムです。 .data Text1: .asciiz "input number " Text2: .asciiz "Result of factorial is " .text .globl main ####################################################### main: ######################################################## fact: addi $sp, $sp, -8 # adjust stack pointer for 2 items sw $ra, 4($sp) # save the return address sw $a0, 0($sp) # save the argument n bge $a0, 1, L1 # if (n >= 1) goto L1 li $v0, 1 # return 1 j end_fact # jump to the end of fact L1: sub $a0, $a0, 1 # $a0 <= $a0 - 1 jal fact # call fact(n - 1) lw $a0, 0($sp) # restore argument $a0 lw $ra, 4($sp) # restore the return address addi $sp, $sp, 8 # adjust stack pointer mul $v0, $a0, $v0 # n * fact(n - 1) end_fact: jr $ra # return ###調査したこと試したこと 以下のプログラムをmain関数として作成したが、うまく動作しなかった。 li $v0, 4 # syscall: print_str la $a0, Text1 # load address of Text1 to $a0 syscall li $v0, 5 # syscall: read_int syscall move $a0, $v0 # move the input value to $a0 jal fact # call the factorial function li $v0, 4 # syscall: print_str la $a0, Text2 # load address of Text2 to $a0 syscall li $v0, 1 # syscall: print_int move $a0, $v0 # move the result to $a0 syscall li $v0, 10 # syscall: exit syscall

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

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

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

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

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

guest

回答2

0

入出力は環境依存です。課題のために用意された環境を使っているでしょうから、その環境の仕様がわからないと第三者が答えることはできません。講師か他の受講者に聞きましょう。

投稿2023/12/19 15:32

編集2023/12/19 15:43
int32_t

総合スコア21601

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

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

0

階乗のプログラム

.data
Text1: .asciiz "input number "
Text2: .asciiz "Result of factorial is "
.text
.globl main

main:
li $v0, 4 # syscall: print_str
la $a0, Text1 # load address of Text1 to $a0
syscall

li $v0, 5 # syscall: read_int syscall move $a0, $v0 # move the input value to $a0 jal fact # call the factorial function move $t0, $v0 # 下記の命令でせっかくの内容を壊すので li $v0, 4 # syscall: print_str la $a0, Text2 # load address of Text2 to $a0 syscall move $a0, $t0 li $v0, 1 # 私の好みでここ syscallの直前 syscall # syscall: print_int li $v0, 10 # syscall: exit syscall

fact:
addi $sp, $sp, -8 # adjust stack pointer for 2 items
sw $ra, 4($sp) # save the return address
sw $a0, 0($sp) # save the argument n

bgt $a0, 1, L1 # ここ修正 if (n > 1) goto L1 #li $v0, 1 # return 1 せっかくの j end_fact # jump to the end of fact

L1:
sub $a0, $a0, 1 # $a0 <= $a0 - 1
mul $v0, $a0, $v0 # n * fact(n - 1) # ここへ移動
jal fact # call fact(n - 1)
end_fact: # ここへ移動
lw $a0, 0($sp) # restore argument $a0
lw $ra, 4($sp) # restore the return address
addi $sp, $sp, 8 # adjust stack pointer

jr $ra # return

投稿2024/11/03 05:08

ajari

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問