MIPS言語を使い始めたばかりですが、MIPSアセンブリ言語の関数(プロシージャ)がどのように機能するのか理解できません。ここにありますが、私は私の問題を指定します:
何が:
jal
jr
$ra
ミップス言語で重要なことを意味します
まず、 this クイックMIPSリファレンスを確認することをお勧めします。それは本当に私を助けました。
次に、jal
、jr
、$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にロードされた値です。 。
お役に立てれば。
1.最初の2つは命令、3番目は一種の特殊レジスター
私たちはしばしばこのような命令を使います...
これは、$ 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)
System V Application Binary Interface、MIPS RISC Processor Supplement をお読みください。これは、関数の呼び出しに使用される規則、特にスタックの管理方法とパラメーターの交換方法について説明します(MIPSにはハードウェアスタックがなく、すべてがソフトウェア規則の問題であり、ABIがこれらの規則を定義しています)。
上記のドキュメントは、MIPS命令の機能に関する基本的な知識があることを前提としているため、各命令の詳細な効果を説明する プログラマ向けMIPS32アーキテクチャ 、特にボリュームII(命令セット)も必要です。しかし、最初に第I巻(紹介)をダウンロードして読んでください。
jal
命令は、 "jumpおよびlinkです"オペコード。 ジャンプターゲットアドレス(呼び出されたプロシージャの最初のオペコードのアドレス)で、現在の命令ポインタをlink register、これはレジスタ31(正確には、レジスタ31に値x+ 8、ここでxはjal
オペコード自体のアドレスです)。