アセンブリ言語
機械語の命令を人が読める記号に置き換えた、最も低水準に近い言語。CPUの動きをそのまま書くため習得は難しいが、限界まで速度や容量を絞れる。レトロゲーム解析やROMハックでは、逆アセンブルした先で必ず出会う言語。
年表
概要
CPUが直接実行する機械語(数値の羅列)の命令一つひとつを、人が読める記号(ニーモニック)に置き換えた言語。アセンブラと呼ばれる変換プログラムが機械語へ翻訳する。命令と記号がほぼ1対1に対応するため、書いたとおりにCPUが動く——逆に言えば、CPUの仕組みを知らなければ一行も書けない。
利点と代償
利点は、速度・サイズ・ハードウェア制御のすべてを限界まで絞れること。数KBのメモリと非力なCPUで8bit機のゲームが動いたのは、アセンブリで書かれていたからこそだった。代償は可搬性と生産性。CPUファミリが変われば書き直しで、同じ処理でも高級言語の何倍もの行数がかかる。最適化コンパイラが成熟した現代では、速度のために選ぶ場面はごく限られる。
種類・系譜
「アセンブリ言語」という単一の言語は存在せず、CPUアーキテクチャごとに別の言語がある。ファミコンの6502、スーパーファミコンの65C816、MSXやPC-8801のZ80、PCのx86、スマホのARM——それぞれ命令も記法も違う。同じx86でもIntel記法とAT&T記法という表記の流派があり、アセンブラ(MASM・NASM・GAS等)によっても書き方が分かれる。
実例
スーパーファミコンのCPU・65C816で、画面の明るさを最大にする2命令。右側のコメントが、実際にROMに並ぶ機械語のバイト列。
LDA #$0F ; A9 0F Aレジスタに 0F を読み込む
STA $2100 ; 8D 00 21 $2100(画面表示レジスタ)へ書き込むアドレス $2100 がバイト列では 00 21 と逆順に並ぶ(リトルエンディアン)。逆アセンブルとは、この右側のバイト列から左側を復元する行為。
現在
新規にアセンブリを書く場面はブートローダや組み込みなど僅かになったが、「読む」需要はむしろ現役。コンパイラ出力の確認、脆弱性解析、マルウェア解析、そしてレトロゲームのROM解析——逆アセンブルの先で待っているのは常にこの言語で、GhidraやIDAのような解析ツールの読解対象も結局はアセンブリである。
| 分類 | 低水準言語 |
|---|---|
| 対象 | CPU命令 |
| 代表的なアーキテクチャ | 6502 / 65C816 / Z80 / x86 / ARM |
| 記法の流派 | Intel記法・AT&T記法(x86) |
| 代表的なアセンブラ | MASM / NASM / GAS / ca65 |
関連項目
- 65C816MOS 6502を16ビットに拡張したCPU。1984年に設計が完了し1985年に市場へ出た。8ビットの6502コードとの互換性を保ちながら16ビット処理を可能にし、スーパーファミコンやApple IIGSに採用された。6502の系譜を16ビット時代へ橋渡しした一台。
- MOS 6502MOSテクノロジーが作った安価な8ビットCPU。低価格ゆえにApple IIやコモドール、ファミコンなど数多くの機器に採用され、家庭用コンピュータ普及期の主役の一つになった。シンプルな命令系は解析・自作の入口としても親しまれている。
- GhidraアメリカのNSA(国家安全保障局)が長年自社開発し、2019年にオープンソースとして一般公開したリバースエンジニアリングツール。コンパイル済みの実行ファイルを逆アセンブル・逆コンパイルし、機械語の塊からプログラムの構造を読み解ける。無料でありながら商用のIDAに匹敵する機能を持ち、静的解析の定番として一気に普及した。
- リバースエンジニアリング完成した製品やプログラムを分解・解析して、その仕組みや設計を読み解く行為。ソフトウェアでは逆アセンブルなどで内部の動きを追う。古いソフトやゲームの「痕跡」を読む作業の中核であり、この営みの最大の武器。
- IDA(IDA Pro)ベルギーのHex-Rays社が開発・販売する、商用リバースエンジニアリングの業界標準ツール。実行ファイルを逆アセンブルして解析する分野で長く事実上の定番だった。原型は1991年にIlfak Guilfanovが書いたDOS用ツールで、後に商用の「IDA Pro」へと育った。高機能版は年間数十万〜数百万円と高額だが、機能を絞った無料版「IDA Free」も提供されている。
- エンディアン多バイトのデータをメモリにどの順で並べるかの流儀。リトル/ビッグの違いはバイナリ解析で必ず意識する点。
- コンパイラ人が書いたプログラムを、機械が実行できる形へ翻訳するソフトウェア。グレース・ホッパーらの仕事に源流があり、高水準言語が実用になる前提を作った。普段は意識されないが、あらゆる開発を裏で支える縁の下の力持ち。
- C言語デニス・リッチーがUNIX開発のために作った汎用言語。ハードウェアに近い操作ができつつ移植性も高く、OSや組み込みなど低レイヤの定番として現在も使われ続けている。後の多くの言語の文法の祖でもある。
- デバッガプログラムを1ステップずつ実行しながら、CPUのレジスタやメモリ、アセンブリコードの動きを直接追跡・変更できるツール。本来はバグ取りの道具だが、動的解析やレトロゲームの解析でも中核的に使われる。
- FORTRANIBMが開発した、科学技術計算向けの初期の高水準プログラミング言語。それまで機械語やアセンブリで書いていた数値計算を、数式に近い形で記述できるようにした。最初期の言語ながら数値計算の分野では現在も使われ続けている。
- Lunar Magic『スーパーマリオワールド』のステージ改造に特化した、海外発の定番ツール。ROMの内部データを読み解いてマップやグラフィックを編集でき、長年にわたり世界中のマリオ改造(ハック)文化を支えてきた。特定の一作に深く根を張った、解析ツールの一つの到達点。