SENAN

4人の仲間が交代で書く雑記

アセンブラ/バイナリ入門 ゼロから学ぶCPUの仕組み

   

タイトルがどこかにありそうな本みたいになっていますが、ああいう本のように体系立ててまとまってません。

「ギター弾けるようになりたい」というのと同じノリで「バイナリ解析できるようになりたい!」と前々から思っていたのですが、どこから勉強すればいいかわからず放置していました。
そんな時、以下の記事を発見し面白かったので、自分も挑戦してみることにしました。
JavaScriptでx86エミュレータを書く

というわけでJavaScriptでアセンブラとCPUエミュレータを作るのを最終目標に、バイナリやアセンブリ言語の基本を勉強してみたいと思います。

どんな知識が必要か?

知ってる範囲で考えて、CPUエミュレータを作るにはきっと以下のような知識がいるんじゃないかなーと。
(一応、高専でCPUのことは勉強したような気がするので、ある程度おおざっぱな動きは分かります)

  • CPUの作りと動き : メモリと色々なレジスタがあるはず
  • CPUの命令セット : x86とかIA-64とかで命令セット違うはず
  • アセンブラ : アセンブリ言語を機械語に変換する
  • アセンブリ言語 : CPUによって違う?なんとなく見覚えある

CPUアーキテクチャの種類

まずは、CPUアーキテクチャを何にするか決めないと命令セット等が全然違うはずなので、エミュレータなんて作れません。
例えばCPUアーキテクチャとは以下のようなもの。

  • x86 (IA-32)
  • IA-64
  • ARM

どれもしっかりしたCPUなので、片手間で作るには規模が大きくなりそう。。。
と思って他を探してたらこんなのを見つけました。

COMET2 : https://ja.wikipedia.org/wiki/CASL

CASL(キャスル)とは、情報処理技術者試験におけるプログラミング能力試験のために仕様策定されたアセンブリ言語である。

COMET2はIPAが学習用に作った、実際には存在しないCPUの設計です。 (COMETがCPUの名前で、CASLがCOMET用のアセンブリ言語の名前です。)
学習用に設計されてだけあって、構成がシンプルだし命令も少なくてちょうどよさそう!
さっそく、COMETをベースに一般的なCPUの基本を勉強していきます。

ここから先は色々と調べながらまとめているので、間違っていたらすみません。。

COMET2の構成

COMET/CASLの仕様はIPAサイト内の「試験で使用する情報技術に関する用語・プログラム言語など」という資料内に記載されています。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_hanni_skill.html#yougo

基本的なCPUの構成は以下のようになっています。

  • 実行制御部 – 全体を制御している部分
  • デコーダー – 命令を解釈し、演算器に必要な情報を渡す
  • 演算器 – 演算を行う
  • レジスタ – データ保存領域。保存するデータの種類によって複数存在する

COMETの場合、レジスタは以下のレジスタを持っています。

  • プログラムレジスタ(PR)
  • 汎用レジスタ(GR0~GR7)
  • フラグレジスタ(FR)
  • スタックポインター(SP)

また、CPU以外のハードとしてメモリが存在します。COMETⅡの場合16ビットのデータを0~65535番地まで格納できる。

標準入力と標準出力もあるっぽいが、詳しく書かれていないので不明。
(メモリマップドI/Oなどの仕組みは知ってるけど、x86とかはどうやってるんだろう?)

…つづく

 - その他