RSIC-V の説明と概要 (1)

コメント記号: #

add rd, rs1, rs2 # レジスタ操作の場合は rd = rs1 + rs2

add rd, rs1, x0 # rd = rs1 + x0 x0 はゼロを意味します レジスタ読み取り専用は 0 を意味します このステートメントは、rs1 を rd に代入することです    

sub rd, rs1, rs2 # レジスタ減算の場合は rd = rs1 - rs2

addi rd, rs1, 10 # rd = rs1 + 10 レジスタと即値の加算演算

addi rd, rs1, -10 # rd = rs1 - 10 減算にも addi を使用します

メモリ アドレスを格納するには 2 つの方法があります: ビッグ エンディアン (ビッグ エンディアン): 下位バイトを上位バイト アドレスに格納する方法と、
リトル エンディアン (リトル エンディアン): 下位バイトを下位バイトに格納する方法です。risc
-v はリトル エンディアンを使用します。エンディアン

lw rd, 12(rs) #lw はロード ワードを表し、ベース アドレス レジスタとしてロード rs にオフセット 12 を加えた値をロードします。ロード
プロセスはメモリからレジスタへのロードとなります。

sw rs, 40(rd) #sw はストアワードを表します rs レジスタの値を rd のメモリアドレスにオフセット 40 を加えたものに格納します
sw のプロセスはメモリに登録されます

lb #load byte バイト アドレスの 1 バイト データを符号拡張し、対応するレジスタにロードします。
たとえば、1000 0000 の拡張では、最上位ビット 1 を符号ビットとして拡張して 0xffffff80 を形成します。

lbu #load byte unsigned は、すべての埋め込みを 0 で埋めます。

sb #store byte レジスタの最下位バイトの1バイトデータを対応するバイトアドレスに保存します

ジャンプ命令:

beq rs1, rs2, L1 #branch ifqual rs1 が rs2 に等しい場合、L1 にジャンプします

bne 等しくない場合は #branch はジャンプと等しくない

blt #branch if より小さい場合は、ジャンプより小さい

bltu #branch 符号なし未満の場合ジャンプ レジスタを符号なし数値として扱う 

bge #banch if 以上の場合は、ジャンプ以上です

j L1 #jump L1 は L1 に直接ジャンプします

論理演算命令:

および rd、rs1、rs2 #rd = rs1 & rs2

andi rd、rs1、3 #rd = rs1 & 3

sll #shift left 論理論理左シフト 右シフト 0 パディング

slli rd, rs1, 2 #shift left 論理即値 論理即値を左にシフトし、rs1 の論理を 2 ビット左にシフトし、右を 0 で埋めます。

sra #shift right arithmetic 算術右シフト命令は、シフト後の元の数値の最上位ビットを左側に埋めることを意味します。

srai #即時算術右シフト、左側はシフト後の元の数値の最上位ビットで埋められます

srl #logic 右シフトして左側を 0 で埋める

srli # 論理的に即時右シフトし、左側を 0 で埋める

または #logical または

ori #immediate論理OR

xor # 排他的論理和

xori #immediate ロジックの排他的論理和 


risc-v には、mv rd、rs = addi rd、rs、0 li rd、13 = addi rd、x0、13 などの疑似命令もいくつかあります。
これらは、記述の構文を簡素化するために使用されます。

コンパイルによって得られた実行可能ファイルの命令セグメントとデータセグメントは、それぞれメモリ上の命令空間とデータ空間に格納されます。PC レジスタには、次に
実行される命令のアドレスが格納されます。PC 値は継続的に更新され、逐次実行
の場合、PC値は4加算されますが、分岐命令が発生した場合はジャンプ位置に更新する必要があります。

関数を呼び出すには 6 つの基本的な手順があります。

1. 関数呼び出しが発生した場合、関数関数を実行する前に、簡単にアクセスできるように、まずこの呼び出しで使用されるパラメーターを保存します。

2. と呼ばれる関数 function に制御を渡します。

3. 関数の実行中に必要なストレージ要件を満たすために、状況に応じて関数用に一定量のローカル ストレージ スペースを申請します。

4. 関数の操作を実行する

5. 関数の実行完了後、取得した結果データをメインプロセスが取得するために保存すると同時に、関数実行時に使用したレジスタ値を復元し、関数に割り当てられたローカルストレージ領域を解放します。

6. 元のプロセスに制御を移す

 

ゼロは x0 レジスタを表します。
通常、a0 ~ a7 (x10 ~ x17) レジスタは、呼び出された関数にパラメータを渡すために使用されます。A0 および a1 レジスタは、戻り値
ra、つまり、使用される x1 レジスタを渡すためによく使用されます。戻りアドレス値 s0 を保存する 
- s11 に対応する x8 ~ x9 および x18 ~ x27 番号のレジスタは、関数呼び出し中の破損を避けるために、元のプロセスでキー データを保存するための保存レジスタとして使用されます。

jr #関数呼び出しはプログラムセグメント内の複数の位置で発生する可能性があり、各呼び出し関数の戻りアドレスは異なり、随時変化します。関数呼び出しの前に戻りアドレスを記録し、ra レジスタに保存する必要があります
。戻るときは、jr 命令を使用して ra レジスタに戻ります。保存されたアドレスにより、複数の呼び出しの柔軟性が保証されます。

 jal #Jump とリンクは呼び出しサイトを指すアドレスまたはリンクを形成できるため、関数は正しいアドレスを返すことができます。
Jump は PC を呼び出された関数のアドレスにジャンプさせ、リンクによって取得された次の命令のアドレスを返します。アドレスは ra レジスタに保存されます

おすすめ

転載: blog.csdn.net/weixin_43754049/article/details/126819600