web-dev-qa-db-ja.com

MIPSの関数(手順)

MIPS言語を使い始めたばかりですが、MIPSアセンブリ言語の関数(プロシージャ)がどのように機能するのか理解できません。ここにありますが、私は私の問題を指定します:

  1. 何が:

    • jal
    • jr
    • $ra

    ミップス言語で重要なことを意味します

  2. 関数または(手順)を作成したい場合、どのように使用できますか?
16
Sneimeh

まず、 this クイックMIPSリファレンスを確認することをお勧めします。それは本当に私を助けました。

次に、jaljr$raについて説明します。 jal <label>が行うことは、labelラベルにジャンプし、プログラムカウンターを格納することです(これは、現在の命令)$raレジスタ内。これで、labelから元の場所に戻りたい場合は、jr $raを使用するだけです。

次に例を示します。

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

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

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

お役に立てれば。

20
Mihai Scurtu

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

  • jal = jump and link(次の命令のアドレスが$ raに入れられ、ターゲットアドレスにジャンプします)
  • レジスタを指定するjr = jump
  • $ ra =住所を返す

私たちはしばしばこのような命令を使います...

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

これは、$ raに保存されたアドレスへのreturn(jump)を意味します。

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)
10
pohchen

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

上記のドキュメントは、MIPS命令の機能に関する基本的な知識があることを前提としているため、各命令の詳細な効果を説明する プログラマ向けMIPS32アーキテクチャ 、特にボリュームII(命令セット)も必要です。しかし、最初に第I巻(紹介)をダウンロードして読んでください。

jal命令は、 "jumpおよびlinkです"オペコード。 ジャンプターゲットアドレス(呼び出されたプロシージャの最初のオペコードのアドレス)で、現在の命令ポインタをlink register、これはレジスタ31(正確には、レジスタ31に値x+ 8、ここでxjalオペコード自体のアドレスです)。

2
Thomas Pornin