PowerPCの命令概要
PowerPCの命令はすべて32ビットで表現されます。メモリ中に4バイト単位で命令が置かれ、分岐命令以外では、メモリアドレスの小さいほうから順に実行されます。どんなに複雑なプログラムでも CPU (ここではPowerPC) は4バイト単位の命令を順次実行しているだけです。
下の図はPowerPCのプログラムがメモリに格納された状態と実行の順序、メモリに格納されている命令(機械語)とアセンブリ言語による表現です。
CPUが直接理解できる命令を直接指定してプログラムすることは困難なため、人が分かりやすい表現(ニーモニック)を使った言語(アセンブリ言語)があります。また、アセンブリ言語を命令の内部表現に翻訳するプログラムとしてアセンブラがあります。
PowerPCの命令の詳細を見ていく前にアセンブリ言語の概要と解説に使う用語を紹介します。
命令の内部表現
PowerPC に限らず RISC(Reduced Instruction Set Computer)系のCPUでは、動作の種類と対象とするレジスタ、数値を32ビットに詰め込んでいます。そのため32ビットの数値を直接指定 (即値と呼ぶ) することができません。
次の表はPowerPCの命令の代表的な内部表現形式です。
「opcode」は命令の種類を指定し、「extended opcode」または「ext op」を持つ形式では、さらに細分化された命令を表現します。「tgt/src」はレジスタの指定(5bit)、「immediate」の部分は命令に数値を直接埋め込みます。
命令の内部表現までを覚える必要はありませんが、命令全体を32bitに詰め込んでいることから、直接指定できる数値の範囲が限定されることが分かります。
ニーモニック
ニーモニック(mnemonic) とは「覚え歌、記憶法」といった意味の単語で、 2進数で表したCPUの命令を覚えやすい単語で置き換えることを意味しています。ニーモニックのうち、動作を指定する部分をオペコード、動作の対象となるレジスタや数値をオペランドと呼びます。
オペコード
動作の内容を表す名前です。Cなどの高級な言語の関数名に相当します。 PowerPCでは32ビットで1命令を表しますが、先頭の6ビットをオペコードとして使っています。命令によってはさらに細かい動作を後ろのビットを使って指定するため、1つの内部的なオペコード(6bit)に対して複数のオペコードが存在します。
PowerPCのオペコードは省略した単語を組み合わせて作られています。それらの組合せで非常に多くのニーモニックがあり、慣れが必要です。
ニーモニックの先頭において動作の種類を指定します。
意味 | |
---|---|
add | 加算などの演算 |
cmp | 比較(CoMPare) |
s | シフト(Shift) |
l | メモリ読み出し(Load) |
st | メモリ書き込み格納(STore) |
b | 分岐 (Branch) |
f | 浮動小数点命令(Floating point) |
mf | 特殊レジスタ読み出し(Move From) |
mt | 特殊レジスタ書き込み(Move To) |
cr | 条件レジスタ演算(Condition Register) |
データのサイズ指定が続きます。
意味 | |
---|---|
w | ワード(32ビット) |
h | ハーフワード(16ビット) |
ha | ハーフワード(符号拡張16ビット) |
b | バイト(8ビット) |
ニーモニックの後ろに付けて細かい動作を指定します。組み合わせて使用する場合もあります。
意味 | |
---|---|
i | 直接数値指定(即地) |
l | リンクレジスタ更新 |
c | キャリーフラグ |
x | レジスタインデックス |
u | インデックス更新 |
z | ゼロ拡張 |
s | シフト |
ピリオド | 条件レジスタを更新 |
オペコードの例
addis subfi. mfctr cmpw lwzux stzx blrl
オペランド
命令の対象となるレジスタや値などをオペランドと呼びます。関数の引数に相当します。 PowerPCでは、レジスタを3つまでオペランドとして指定することができます。オペランドの数は命令の種類(オペコード)によって異なり、オペランドのないものからローテイト命令(rlwinmなど)のように5つも指定するものまであります。
次はアセンブリ言語のソースリストの例です。オペコードの後ろにオペランドが続きます。「#」以降はコメントでアセンブラは無視します。
add r3, r4, r5 # r3 = r4 + r5 subi r3, r4, 1 # r3 = r4 - 1 rlwinm r3, r11, 8, 24, 31 # r11の上位8ビットをr3に取り出す。 lwz r3, 4(r4) # r3 = mem[r4+4] stzx r3, r4, r5 # mem[r4+r5] = r3
拡張ニーモニック
PowerPCのアセンブラには、CPUの命令に直接対応した「標準ニーモニック」に加えて、「Extended Mnemonic」または「Simplified Mnemonic」と呼ばれるニーモニックが使われます。「標準ニーモニック」では分かり難いニーモニックに別名を付けたもので、「拡張ニーモニック」と呼ぶことにします。
拡張ニーモニックのうち良く使われると思われるものについて、実際に生成される標準ニーモニックによる形式と対応させて、次のような表(例)で紹介することにします。
拡張ニーモニック | 標準ニーモニック | ニーモニックの意味 |
---|---|---|
subi rD,rA,S16 | addi rD,rA,-S16 | SUBtract Immediate |
nop | ori r0,r0,0 | No OPeration |
mr rD,rS | add rD,r0,rS | Move Register |
rotlw rA,rS,rB | rlwnm rA,rS,rB,0,31 | ROTate Word Left |
slwi rA,rS,n | rlwinm rA,rS,n,0,31-n | Shift Left Word Immediate |