私は MIPS 言語に不慣れで、MIPS アセンブリ言語の関数 (手順) がどのように機能するかを理解していません。ここにありますが、私の問題を特定します:
とは:
jal
jr
$ra
mips 言語での意味と重要なこと
- 関数または (手順) を作成するときに、どのように使用できますか?
まず、このクイック 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 であることがわかります。これは、いわゆるプロシージャーでロードされたものです。
お役に立てれば。
1.最初の2つは命令で、3番目は一種の特殊レジスタです
このような命令をよく使用します...
$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)
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