アセンブラ
PowerPC

PowerPCアセンブリ チートシート

More than 1 year has passed since last update.

学校の課題でPowerPCアセンブリを書くので、使った命令のニーモニックなどを簡単にまとめていく。チートシートと言いつつ、網羅性は期待してはいけないし、あと説明はかなり適当なのであまり真に受けないでください。やる気があったらもう少し真面目に書くかも。

課題を進め次第、内容も更新していきます(たぶん)。

ちなみに、 http://kivantium.hateblo.jp/entry/2015/12/06/234305 のほぼパクリ記事…… にならないようにしたい。

レジスタ

  • 汎用レジスタ: GPR0 〜 31 の32個。オペランドとしては %r0, %r1, ... と書く。
  • 浮動小数レジスタ: FPR0 〜 31 の32個。オペランドとしては %f0, %f1, ... と書く。
  • Link Register: LR
  • Counter Register: CTR

などなど。

命令

代入命令

  • li: 即値をレジスタに代入する。
  • mr: レジスタの値をレジスタに代入する。
  • mflr, mtlr: LRから(from)レジスタに/LRへ(to)レジスタから代入する。
  • mfctrmtctr: CTR(略)

演算命令

  • addi: レジスタの値と即値を加算し、レジスタに代入する。
  • add: レジスタの値同士を加算し、レジスタに代入する。
  • addc: キャリービットも更新する。
  • adde: レジスタの値(2つ)とキャリービットを加算し、レジスタに代入する。
  • addze: レジスタの値とキャリービットを加算し、レジスタに代入する。
  • mulld: レジスタの値同士を乗算し、結果の下位64bit分をレジスタに代入する。
  • mulhdu: レジスタの値同士を(符号なし)乗算し、結果の上位64bit分をレジスタに代入する。
  • sldi: レジスタの値を即値分左シフトし、レジスタに代入する。
  • or: レジスタの値同士をORし、レジスタに代入する。

浮動小数演算命令

  • fadd: 加算。
  • fmul: 乗算。
  • fmadd: 積和(レジスタ2つの値同士の積と、もう1つのレジスタの値との和)。

比較命令

  • cmpwi: レジスタの値と即値を比較する。
  • cmpw: レジスタの値同士を比較する。

分岐命令

  • b: 無条件にジャンプする。
  • blr: サブルーチンの呼び出し元に戻る。(実際には、LRの値を見ている)
  • beq, bne, blt, ble, bgt, bge: 比較命令の結果に従ってジャンプする。
  • beqlr, bnelr, bltlr, blelr, bgtlr, bgelr: 比較命令の結果に従ってサブルーチンの呼び出し元に戻る。
  • bdnz: CTRをデクリメントし、結果が0でなければジャンプする。

メモリアクセス命令

  • ld: Load doubleword.
  • lfd: 浮動小数点数を扱う場合
  • ldu: Load doubleword with update.
  • std: Store doubleword.
  • stdu: Store doubleword with update.
  • lbzu: レジスタの参照先+オフセットから1バイト分をレジスタに読み込み、レジスタの参照先をオフセット分だけ進める。
  • stbu: レジスタの参照先+オフセットの場所にレジスタの内容を1バイト分書き込み、レジスタの参照先をオフセット分だけ進める。

その他の命令

  • sc: システムコール。

参考文献