addi
lyszt.netはaddiおよびその他のRISC-V命令をより詳しく扱っています。
エンコーディング形式
説明
addi はレジスタに定数を加算します。名前は add immediate を意味します。イミディエイトとは、レジスタから読み取るのではなく、命令自体に書き込まれた定数値です。プログラムを書くときに一方の数値が固定されている場合、たとえばカウンタに 1 を加算する場合に使用します。
addi の形式を以下に示します。ソースレジスタ rs1 の値を読み取り、定数 imm を加算し、結果をデスティネーションレジスタ rd に書き込みます。
addi rd, rs1, imm
次の行は t0 を読み取り、1 を加算し、結果を書き戻すので、t0 = t0 + 1 となります。
addi t0, t0, 1
定数は 12 ビットを占め、符号付きであるため、範囲は -2048 から 2047 です。アセンブラはそれより大きな値を拒否します。より大きな定数には、まず li でレジスタにロードします。負の定数は addi に減算も行わせるため、RISC-V に別個の subtract-immediate 命令がないのです。次の行はカウントダウンします。
addi t0, t0, -1
RISC-V マニュアルはこの定数を符号拡張された 12 ビットイミディエイトと呼びます。算術オーバーフローは無視されると記載されているため、結果は下位 XLEN ビットのみを保持します。ここで XLEN はレジスタ幅(ビット単位)で、ここでは 32 です。定数の符号がわかっている場合、加算後の 1 つの分岐で符号付きオーバーフローをチェックします。以下の 2 行は、正の定数を加算する一般的なケースを処理します。
addi t0, t1, +imm blt t0, t1, overflow
プログラムは addi をカウンタ、ポインタを次の項目に移動するため、およびスタック上に領域を確保するために使用します。例では、カウンタを進めるために 1 を加算し、作業メモリを 16 バイト確保するために -16 を加算します。これは、作業スペースを必要とする関数が通常どのように始まるかです。
例
addi t0, t0, 1 # t0++ addi sp, sp, -16 # reserve 16 bytes of stack
電子
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4.1, Integer Register-Immediate Instructions, pages 28 to 29.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4, Integer Computational Instructions, page 27.
