auipc

auipc

RISC-V アセンブリ 参考

lyszt.netはauipcおよびその他のRISC-V命令をより詳しく扱っています。

エンコーディング形式

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

説明

auipc は add upper immediate to PC の略です。lui と同様に動作し、20 ビットの定数を値の上位部分として取ります。auipc はその値をプログラムカウンタに加算します。プログラムカウンタは現在実行中の命令のアドレスを保持しています(beq のページを参照)。結果は、この命令がメモリ内のどこにあるかを基準に測定されたアドレスになります。

相対アドレスは実際の問題を解決します。プログラムは、メモリ内のどこにロードされるかを常に知っているわけではありません。固定の絶対アドレスでデータを参照するコードは、別の場所にロードされると失敗します。現在の命令を基準にアドレスを計算するコードは、どこに配置されても動作します。この性質は位置独立と呼ばれます。

auipc はそのようなアドレスの粗い部分を提供し、続く命令が細かい 12 ビットの残りを加算します。ラベルのアドレスをロードする la 命令はこのペアから構成され、遠くの関数への呼び出しも同様です。

RISC-V のマニュアルには、auipc の定数を 0 に設定することで現在の pc を取得できると書かれています。auipc に続いて jalr を実行すると、任意の 32 ビット pc 相対アドレスに制御を移すことができ、auipc に続いて 12 ビットオフセット付きのロードまたはストアを実行すると、任意の 32 ビット pc 相対データアドレスにアクセスできます。

la と call は、auipc を手書きしなくて済むように存在しており、シミュレータのトレースや逆アセンブルされたコードに頻繁に現れます。小さなオフセットを持つ命令が auipc に続き、一緒になって 1 つのアドレスを形成するのは、認識するのに役立つパターンです。

例

auipc t0, 1      # t0 = pc + 0x1000