@7shi
ARM64
- 64bit ARMは最後発のISA
- ISAはややこしいので以後ARM64とする
- 実用性と美しさを兼ね備えているらしい
計画
- 逆アセンブラは入手可能 binutilsを--target=aarch64-elfでビルド
- ARM64の命令は4バイト固定長(43億通り)
調査
- 00000000-FFFFFFFFのバイナリを作って逆アセンブル
- 逆アセンブル結果は200GB
- バイナリ16GB
- Athlonなので遅い
データを削る
- 逆アセ結果からデータを削る
- 約7割が未定義なので削る
- 未定義データを削ると35GBに縮小
パターン抽出
- ニーモニックごとにパターンを抽出
- ニーモニック単位のビット部はなさそう
- 逆アセンブラを作るのは難しそう
パターン抽出
(分岐)
分岐はARM32で最上位にあった条件ビットと同じパターンが最下位にある
b.eq b.ne b.cs b.cc b.le b.al b.nv
(オペランド)
(スクリプトはF#で)
適当に書いたらあまり高速化しなかった
組み合わせ爆発!
31番レジスタあたりにアタリをつけてみる
31番レジスタは状況に応じて別物になる アドレッシングでは必ず[sp] spは以下の10命令にしか現れない
add adds and cmn cmp eor mov orr sub subs
PowerPCにも似た仕様がある
31番レジスタ
ゼロレジスタがデフォルトで、一部の命令に限ってspが出てくる
どこかに判別ビットがあるはずだが、統一ルールみたいなのはない
付加的な操作
ARMの伝統で一部の命令はオペランドに対してシフトや拡張の操作ができる
これと31番レジスタとの合わせ技が組み合わせ爆発の原因
課題
- 逆アセンブラは作れず…
- パターン分類が不十分
- 31番レジスタをxのパターンに統合
- オペランドがどのビットに格納されているのか特定
- 単にビットを詰め込んだだけではなく、回路が作りやすいような何らかの工夫