mips言語実装f(n)=f(n-1)+2*f(n-2)+3*f(n-3)第2編
3023 ワード
次に上のc++分析、私たちはこのフィボナッチ関数を実現して、まず、私たちはプログラムが私たちと対話する必要があることを知っていて、つまり私たちはプログラムnがどれだけあるかを教えて、c++の中であなたはよく知っているかもしれません.cinあるいはcoutは対話することができて、実はmipsアセンブリ言語の中で、状況も多くありません.SPIMはI/Oデバイスをシミュレートする:メモリマッピングコンソール(console)であり、このコンソールでは文字の読み取りと書き込みが可能であるが、SPIMはシステム呼び出し命令であるsyscallを通じてオペレーティングシステムのようなサービスを提供することができ、サービスを要求するために、プログラムにシステム呼び出しコードをレジスタ$v 0にロードし、パラメータをレジスタ$a 0-$a 3にロードする.システム呼び出しは$v 0に戻ります.次に、簡単な例で説明します.
.textは、以下にコードセグメントを説明する、これに対応する.dataは、プログラムに必要なデータであることを示しています.次は対応するアプリケーションが表示されます.この中でmain関数に入り、まず5を$v 0に取り出し、read_を呼び出します.intサービスでは、この整数を読み出して$v 0レジスタに格納し、1でprint intサービスを呼び出すことができます.
では、この簡単なマットはいくつかの基本的な問題を解決して、私たちは分析を続けます!
手元にちょうど他の人の再帰コードがあります.参考までに貼ってください.
.text
main: li $v0,5
syscall
move $a0,$v0
li $v0,1
syscall
jal $ra
.textは、以下にコードセグメントを説明する、これに対応する.dataは、プログラムに必要なデータであることを示しています.次は対応するアプリケーションが表示されます.この中でmain関数に入り、まず5を$v 0に取り出し、read_を呼び出します.intサービスでは、この整数を読み出して$v 0レジスタに格納し、1でprint intサービスを呼び出すことができます.
では、この簡単なマットはいくつかの基本的な問題を解決して、私たちは分析を続けます!
手元にちょうど他の人の再帰コードがあります.参考までに貼ってください.
.text
main:
subu $sp, $sp, 32 #set up main's stack frame:
sw $ra, 28($sp)
sw $fp, 24($sp)
addu $fp, $sp, 32
##Get n from the user, put into $a0.
li $v0, 5 #load syscall read_int into $v0
syscall #make the syscall
move $a0, $v0 #move the number read into $t0
jal prone #call prone
move $a0, $v0
li $v0, 1 #load syscall print_int into $v0
syscall #make the syscall
la $a0, newline
li $v0, 4
syscall #make the syscall
li $v0, 10 #10 is the exit syscall.
syscall
##prone--(project one)
##Registers used:
## $a0, -initiallly n.
## $t0, -parameter n.
## $t1, -prone(n - 1).
## $t2, -prone(n - 2).
## $t3, -prone(n - 3).
.text
prone:
bgt $a0, 2, prone_recurse
subu $v0, $a0, $zero
jr $ra
prone_recurse: #the recursive case:
subu $sp, $sp, 32 #frame size = 32
sw $ra, 28($sp)
sw $fp, 24($sp)
addu $fp, $sp, 32
move $t0, $a0 #get n from caller.
sw $t0, 20($sp) #preserve n.
sub $a0, $t0, 1 #compute prone(n -1)
jal prone
move $t1, $v0 #t1 = prone(n-1)
lw $t0, 20($sp) #restore $t0
sw $t1, 16($sp) #preserve $t1.
sub $a0, $t0, 2 #compute prone(n -2)
jal prone
move $t2, $v0 #t1 = prone(n-2)
lw $t1, 16($sp) #restore $t1.
lw $t0, 20($sp)
sw $t2, 12($sp) #preserve $t2
sub $a0, $t0, 3 #compute prone(n -3)
jal prone
move $t3, $v0 #t2 = prone(n - 3)
lw $t2, 12($sp) #restore $t2.
lw $t1, 16($sp)
mul $t4, $t3, 3
sll $t5, $t2, 1
add $t4, $t4, $t5
add $v0, $t4, $t1
lw $ra, 28($sp)
lw $fp, 24($sp)
addu $sp, $sp, 32
jr $ra
##data for prone.s:
.data
newline: .asciiz"
"
##end of prone.s
jr $ra