18

私は MIPS 言語に不慣れで、MIPS アセンブリ言語の関数 (手順) がどのように機能するかを理解していません。ここにありますが、私の問題を特定します:

  1. とは:

    • jal
    • jr
    • $ra

    mips 言語での意味と重要なこと

  2. 関数または (手順) を作成するときに、どのように使用できますか?
4

4 に答える 4

20

まず、このクイック MIPS リファレンスを確認してください。本当に助かりました。

jal第二に、 、jrおよびを説明し$raます。ラベルにjal <label>ジャンプして、プログラム カウンター(現在の命令のアドレスと考えてください) をレジスターに格納します。さて、元の場所に戻りたいときは、 を使用するだけです。label$ralabeljr $ra

次に例を示します。

.text
main:
li $t0, 1
jal procedure # call procedure
li $v0, 10
syscall

procedure:
li $t0, 3
jr $ra # return

これを SPIM エミュレーターで実行すると、残っている値$t0が 3 であることがわかります。これは、いわゆるプロシージャーでロードされたものです。

お役に立てれば。

于 2010-11-18T11:27:20.033 に答える
10

1.最初の2つは命令で、3番目は一種の特殊レジスタです

  • jal=jump and link (次の命令のアドレスを $ra に入れ、目的のアドレスにジャンプ)
  • jr=ジャンプしてレジスタを指定
  • $ra=返送先住所

このような命令をよく使用します...

  • jr $ra ($ra をプログラム カウンターにコピー)

$ra に保存されているアドレスに戻る(ジャンプする)という意味です。

2.

C の関数 (手順) の例を次に示します。

int main(){
   x=addthem(a,b);
}
int addthem(int a, int b){
   return a+b;
}

関数の MIPS

.text
main:    #assume value a is already in $t0, b in $t1
    add $a0,$0,$t0   # it's the same function as move the value
    add $a1,$0,$t1 
    jal addthem      # call procedure
    add $t3,$0,$v0   # move the return value from $v0 to where we want
    syscall

addthem:
    addi $sp,$sp,-4     # Moving Stack pointer
    sw $t0, 0($sp)      # Store previous value

    add $t0,$a0,$a1     # Procedure Body
    add $v0,$0,$t0      # Result

    lw $t0, 0($sp)      # Load previous value
    addi $sp,$sp,4      # Moving Stack pointer 
    jr $ra              # return (Copy $ra to PC)
于 2011-04-06T08:36:30.940 に答える
2

System V Application Binary Interface, MIPS RISC Processor Supplementを読みたいと思うでしょう。これは、関数の呼び出しに使用される規則、特にスタックがどのように管理され、パラメーターが交換されるかについて説明します (MIPS にはハードウェア スタックはなく、すべてはソフトウェア規則の問題であり、ABI はそれらの規則を定義します)。

上記のドキュメントは、MIPS 命令が何をするかについての基本的な知識を前提としているため、MIPS32 Architecture for Programmers、特に各命令の詳細な効果を説明するボリューム II (命令セット) も必要になります。ただし、最初に第 1 巻 (イントロダクション) をダウンロードしてお読みください。

jal命令は「ジャンプアンドリンクオペコードです。現在の命令ポインターをレジスター 31 であるリンク・レジスターに保存しながら、ターゲット・アドレス (呼び出されたプロシージャーの最初のオペコードのアドレス)にジャンプします (正確には、レジスター 31 に値x +8を保存します)。 、ここでxはオペコード自体のアドレスです)。jal

于 2010-11-18T13:20:28.143 に答える