mips言語実装f(n)=f(n-1)+2*f(n-2)+3*f(n-3)第2編


次に上のc++分析、私たちはこのフィボナッチ関数を実現して、まず、私たちはプログラムが私たちと対話する必要があることを知っていて、つまり私たちはプログラムnがどれだけあるかを教えて、c++の中であなたはよく知っているかもしれません.cinあるいはcoutは対話することができて、実はmipsアセンブリ言語の中で、状況も多くありません.SPIMはI/Oデバイスをシミュレートする:メモリマッピングコンソール(console)であり、このコンソールでは文字の読み取りと書き込みが可能であるが、SPIMはシステム呼び出し命令であるsyscallを通じてオペレーティングシステムのようなサービスを提供することができ、サービスを要求するために、プログラムにシステム呼び出しコードをレジスタ$v 0にロードし、パラメータをレジスタ$a 0-$a 3にロードする.システム呼び出しは$v 0に戻ります.次に、簡単な例で説明します.
    .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