bamboo’s blog

Bambooの気まぐれブログ

ARM命令をハンドアセンブルしてみる

はじめに

 アセンブラがまだ発達していなかった頃、人間は機械語への翻訳をすべて手作業で行っていた。今となってはアセンブラやツールがかなり発達しているため、簡単に機械語に翻訳できる。とはいえ、アセンブリの命令と機械語がどのように対応しているかを知っておいて損はない。そこで今回は、命令を機械に頼らず機械語に組み立てるハンドアセンブルの方法を紹介する。今回は例として分岐命令を機械語に変換してみる。

プロセス

f:id:bamboo_cpu:20210107221448p:plain
ARMの分岐命令の構造

 ARMでの分岐命令の構造は上図のようになる。Condには条件コード、Lにはリンク付きにするかどうか、offsetにはプログラムカウンタからの相対アドレスを4で割った値を指定する。今回は試しに無限ループのコードを機械語に変換してみる。無限ループのコードはこうだ。

b #0

 このようにして実行中のアドレスに分岐することで、無限ループを実現できる。ここで注意しなければならないのは、プログラムカウンタ自体は実行中のアドレスの8バイト先を指しているということ。つまり、実行中のアドレスは8バイト手前。offsetにはこれを4で割った-2を指定する。

  1. まずはCondの指定。今回は常時実行にあたるAL(1110)を指定。
  2. 次にLの指定。リンク付きにしないので0
  3. -2を24bitで表わすと0xFFFFFE。この値をoffsetに指定する。


 以上を踏まえると機械語は次のようになる。

f:id:bamboo_cpu:20210107230947p:plain
`b #0` を機械語に変換した結果

 この変換が正しいかどうかは以下のサイトで確認できる。

armconverter.com

まとめ

今回はオプションが少なく機械語へ変換しやすい分岐命令を取り上げたが、ARMにはまだまだたくさんの命令がある。気になる方はARM Architecture Reference Manualをぜひ覗いてみてほしい。(Chapter A3 The ARM Instruction Setを参照)