高水準言語(C, C++といったコンパイル言語やPython, JavaScriptといったインタプリタ言語)にある変数に近いもの。
しかし自分で変数名を宣言することはできず、元々値が入っている場合もあり自由度が低い。
※既に値がある場合、無闇に変更するとエラー(フリーズ)が発生するため注意が必要
レジスタには 汎用レジスタ (General Purpose Registers / GPR)、浮動小数点レジスタ (Floating Point Registers / FPR)、リンクレジスタ (Link Register / LR)、カウントレジスタ (Count Register / CTR)、条件レジスタ (Condition Register / CR)、整数例外レジスタ (Integer Exception Register) の6種類があり、GPRを使用すれば大体のコードは作れる。
特にGPRとFPRはそれぞれ32本ずつあり、指定する際は r0, r1, … r31、f0, f1, … f31 と表す。
※どちらのレジスタであっても32本すべてが自由に使えるというわけではなく、前後で使用されている場合、正確にプログラムの流れを読み解かなければフリーズの原因になる
Mario Kart Wiiの場合、r12とr11は基本的に使用できるが、r1(sp)やr2(rtoc), r13は十割方使用できない。
※しかし前者は例外的に使えない場合があるため注意が必要
またFPRは、浮動小数点を使用するプログラムで用いると、使えるレジスタの数を増やすことができるため、積極的に使うことを推奨する。
※これもGPRと同様に使用できるレジスタの制限があるため、その点についての注意は必要
その他(各レジスタの安全度、LR、CTRなどについて)は、MarioKartWii.com(英語)を参照されたい。
※整数例外レジスタについての詳細はこちらを参照
先にも述べたが、GPRは r0, r1, … r31、FPRは f0, f1, … f31 と表す。これは実際にプログラムを書く場合に使用するが、ここでは少々異なる書き方をするため、それについて先に記載しておく。
ここではレジスタを rD, rS, rA, rB と記述していくが、それらの意味はそれぞれ以下の通りである。
rD: 目的レジスタ (Destination Register)
値を入れる先のレジスタ
rS: ソースレジスタ (Source Register)
アドレスが入っているレジスタ
rA: ソースレジスタ(1) (1st Source Ragister)
値が入っているひとつ目のレジスタ(rSの意味も兼ね備えている)
rB: ソースレジスタ(2) (2nd Source Ragister)
値が入っているふたつ目のレジスタ
またレジスタの他に、OffsetやValue などと記述されている場合もあるが、その場合も以下の通りである。
Offset: rSにプラスまたはマイナスする値
Value: 入れる値や基準となる値
Label: 分岐先の題名
:
ラベル名に使用
+
分岐が高頻度を表す場合に使用
-
分岐が低頻度を表す場合に使用
.
if文やset(定数宣言)時に使用
#
コメントアウトに使用
;
コメントアウトに使用
0x
16進数で記述時に使用
レジスタに値をロードします。
li rD,Value
lis rD,Value
レジスタにソースレジスタから指定した値分移動した場所の値をロードします。空いているビットには 0 が挿入されます。
lwz rD,Offset (rS)
lhz rD,Offset (rS)
lbz rD,Offset (rS)
レジスタにソースレジスタから指定した値分移動した場所の値を上位16ビットロードします。空いている下位16ビットには 0 が挿入されます。
lha rD,Offset (rS)
指定したレジスタからレジスタ31まで、ソースレジスタから指定した値分移動した場所から順に値をロードします。ソースレジスタは、指定レジスタよりも大きいと使用できません。
lmw rD,Offset (rS)
レジスタにソースレジスタから指定したバイトの範囲内にある値を連続するレジスタ内にロードします。ロードする値の長さによって必要な空きレジスタの数か変わります。
lswi rD,rA,Value
レジスタの値を保存します。
stw rD,Offset (rS)
sth rD,Offset (rS)
stb rD,Offset (rS)
指定したレジスタからレジスタ31までの各値を、ソースレジスタから指定した値分移動した場所にそれぞれ保存します。ソースレジスタは、指定レジスタよりも大きいと使用できません。
stmw rD,Offset (rS)
レジスタの値を指定したバイトの範囲分を保存します。
stswi rD,rA, Value
レジスタの値を移動(コピー)します。
mr rD,rA
ソースレジスタの値をリンク/カウントレジスタに保存します。
mtlr rA
mtctr rA
レジスタにリンク/カウントレジスタから値をロードします。
mflr rD
mfctr rD
レジスタに加算した値をロードします。
add rD, rA, rB
addi rD, rA, Value
addis rD, rA, Value
レジスタに減算した値をロードします。
sub rD, rA, rB
subf rD, rB, rA
subi rD, rA, Value
subis rD, rA, Value
レジスタに乗算した値をロードします。
mulhw rD, rA, rB
mullw rD, rA, rB
mulli rD, rA, Value
レジスタに除算した値をロードします。
divw rD, rA, rB
レジスタの値の正負を反転します。正負は2進数で考えます。
not rD,rA
ふたつの値を比較し、両方が正であれば抽出します。比較は2進数で行います。
and rD,rA,rB
andi. rD,rA,Value
andis. rD,rA,Value
ふたつの値を比較し、一方が正であれば抽出します。比較は2進数で行います。
or rD,rA,rB
ori rD,rA,Value
oris rD,rA,Value
レジスタの値を指定したビット数分回転させます。処理は2進数で行います。
rotlwi rD,rA,Value
rotrwi rD,rA,Value
レジスタの値を指定したビット数分ずらします。ずらして空いたビットには 0 が挿入されます。処理は2進数で行います。
slw rD,rA,rB
slwi rD,rA,Value
srw rD,rA,rB
srwi rD,rA,Value
レジスタの値を指定したビット数分クリアします。処理は2進数で行います。
clrlwi rD,rA,Value
clrrwi rD,rA,Value
レジスタの値を比較します。
cmpw rD,rA
cmpwi rD,Value
cmplw rD,rA
cmplwi rD,Value
指定した値の分だけ移動します。ラベルを指定した場合はそのラベルに移動します。
b Value
b Label
bl Value
bl Label
リンク (Branch and Link) で移動した場合に、元の分岐地点に戻ります。
blr
カウントレジスタに格納されているアドレスへ移動します。
bctr
bctrl
直上にあるCompareの比較結果を自動で参照し、条件に当てはまれば指定した分だけ移動します。
ニーモニックの後に+
や-
をつけることで分岐処理の補助を行えます。
beq Value
beq Label
bne Value
bne Label
ble Value
ble Label
bge Value
bge Label
blt Value
blt Label
bgt Value
bgt Label
bnl Value
bnl Label
bng Value
bng Label