2017-04-02 18 views
3

私は私の課題に取り組んでおり、いくつか質問があります。MIPSアセンブリの質問

  1. 引数/戻り値レジスタをスタックにプッシュする必要がありますか?答えが「はい」の場合はどこで行うのですか?呼び出し元または呼び出し先の手順で?

  2. 私は自分の指示を最適化しようとしています。私は

    slt $t0, $a0, a1 #check if a<b 
    beq $t0,$zero, ELSE  #if $a>b, $t0 = 0, go to else 
    addi $v0, $zero,1  #a<b, return 1 
    j exit    #end if, jump to exit 
    ELSE: addi $v1, $zero, 0 #a>b, return 0 
    exit: jr $ra   #return to address 
    

    から

    slt $v0, $a0, a1 #if a<b, $v0 =1 and if a>b, $v0 = 0 
    jr $ra    #return to address 
    
+0

1)呼び出し規約によって異なります。 2)あなたの最適化で '$ v1'はどうなりましたか? – Michael

+0

私は$ v1を使用しませんでした – Lalita

答えて

1

MIPS保存とnonpreservedのカテゴリにレジスタを分割に変更することができるのだろうか。保存されたレジスタには$s0 – $s7が含まれます(したがって、名前が保存されます)。非予約レジスタには$t0 – $t9が含まれます(したがって、名前は一時的です)。ファンクションは、使用したい保存済みレジスタのいずれかを保存して復元する必要がありますが、保存されていないレジスタは自由に変更できます。

被呼者は、使用することを希望する保存済みの レジスタを保存して復元する必要があります。呼び出し先は、予約されていない レジスタのいずれかを変更することがあります。したがって、呼び出し元が非予約レジスタにアクティブなデータを保持している場合は、 呼び出し元は関数呼び出しを行う前にその非予約レジスタを保存してから、後で復元する必要があります。これらの理由から

は、 レジスタはまた呼び出し先保存と呼ばれ、nonpreservedレジスタは を呼び出し側は、保存と呼ばれている保存しました。