無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

バイナリをつつく2-CPUの解剖

ふー、ピピヨ、僕インドリ復活したよ♪ 今回はCPUオブジェクトについて考えるよ。
オブジェクトを作るには、対象をじっくり見つめる必要がある。 じーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
その観察の結果、IntelCPUはレジスタが重要だと感じた。
だから、レジスタを【32ビットIntelCPUの主なレジスタの一覧】にまとめてみたピヨ。
よかったら見てね。
名前を見やすくするために、フルネーム列はextendを書いていないので注意してね。
これらのレジスタの詳しい説明は必要な時にその都度説明するピヨ。
ちょっといい加減だけど、レジスタはCPUにとって必要不可欠なものなんだ。僕を信じて!。
だからレジスタをプロパティにすることに決定。
えーとデータ型は、セグメントレジスタは16ビットだからUInt16、それ以外のレジスタは32ビットだからUInt32にするピヨ。
※実はこのレジスタは一部で、デバッグ用とか、OS用とか色々あるんだけど、ここではあまり関係がないから、次の機会があれば書くよ。
 分類                                                                                                            
32ビットIntelCPUの主なレジスタの一覧
略称フルネームレジスタの主な役割
汎用
EAXaccumulator registerデータの一時記憶や各種演算をする。
EBXbase address registerメモリ基底ポインタを保存する。
ECXcount register繰り返し処理命令のカウンタの保存場所などに使用。
EDXdata registerデータの一時記憶として利用する。
セグメント
CScode segment命令コードがあるセグメントアドレスを保存する
DSdata segmentデータのあるセグメントアドレスを保存する
ESextra segment他のレジスタの補助として使用。
SCstack segmenスタックセグメントアドレスを保持するのに使用。
特殊
EBPbase pointerスタックセグメントで使うベースポインタ。 プロシージャの中で、パラメータとローカル変数にアクセスする時によく使用。
EDPdestination indexメモリを指すポインタ。主に転送先アドレスに使用。
EIPinstruction pointerメモリを指すポインタ。主に転送元アドレスに使用。
ESPinstruction pointer次に実行する命令のオフセットアドレスを保存。


やった出来たぞ!!!!!!!!きゃっほー。ハーレルヤ!ハーレルヤ
バサバサバサバサバサバサバサバササバうめー乾杯!・・・・
バサバサバサバサバサバサバサごっくんバサバサバサバサバサうぃ。


あれなんか忘れている気がする????
僕って鳥頭なんだよね。
そうだ!よく考えてみればオブジェクトってプロパティだけじゃ自分で何も出来ないんだよね。
オブジェクトに何かをさせるにはメソッドが必要だよね。
だから次はCPUがどう動いているのかを調べてみた。
CPUがマシンコード(機械語)を実行する手順は次の通りなんだ。
1、マシン語で書かれた命令を読み込む。ごっくん。
2、命令の意味を解析する。データから推理をするんだね。
3、ついに命令を実行。犯人はお前だー。
ということは・・・CPUオブジェクトに必要なメソッドは・・・
1、void ReadCommand(Byte[] code) = バイナリデータを読み込んでbyte配列などにプールする。 後でファイル読み込みとかバリエーションをつけよう。
2、void AnalyzeCommand() = 蓄えられたバイナリを解析し、コマンドオブジェクト構造体(仮名称)配列にプールする。
3、void ExecuteCommand() = 蓄えられたコマンドオブジェクト構造体を実行する。
まだまだ、考えが足りないと思うけど、楽しむためのものだからこれぐらいにしておこーと。
他に必要なことがあったら付け加えたらいいのさ。
※これは点綴的なコーディング先行型開発です。実際の開発では真似をしないで下さい。
よし、決まったら表にしてまとめるぞ!
 分類                              
現時点のCPUオブジェクトのいい加減仕様
データ型名称
プロパティ
UInt32EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP、EIP
UInt16CS、DS、ES、SS
メソッド
Byte[]ReadCommand
voidAnalyzeCommand
voidExecuteCommand/th>
別窓 | バイナリ | コメント:4 | トラックバック:1 | ∧top | under∨
<<バイナリをつつく3ー電波を理解する | 無差別に技術をついばむ鳥 | バイナリをつつく1-バイナリを考える>>

この記事のコメント

EAX 〜 EDX まで
下位 16 ビット の AX
下位 16 ビットの上位下位8ビットの AH,AL があるでやんすよ。
A のところを、B,C,D に置き換えればよろし。上位 16 ビット分に割り当てられたレジスタは無いでっせ。

で、スタックポインタは、SS
で汎用として利用可能なセグメントレジスタとして FS と GS ってのがありんす。
この2つだけは分解できないっすよ。

あと特殊なレジスタとしては、デバッガ用にデバッグレジスタってのが8本、コントロールレジスタってのが4本、テストレジスタってのが8本。

あと行列演算専用のレジスタとか、FPU用のバンクレジスタがありんすよ。バンク0に8個、バンク1に8個。

てか僕の知識は486で止まっているのでやんしてからに、昨今の石だともっと一杯あるかもしれんすね。

最短命令は1バイト、inc ax とか。
最長命令は15バイト DWORD PTR [定数]
とか。
こんなにレジスタ一杯あるのに1バイトじゃ足りんだろが、ボケ!ってなるのでありんすが、そこが味噌。4ビットのCPUから資産を活かすべく設計が積み重ねられてきたので命令プレフィックスなる1バイトの特殊なコードがありんす。
66H と 67H だったかなぁ、忘れちゃったけど、32 BIT モードで動いている時にこのプレフィックスが付くと 16 ビット命令だって解釈されんすよ。

まぁ、こんなとこっす。
もう読まないけど後生大事に取ってある本なんで参考に読みたいならいつでも言ってくんなまし。インテルCPUは奇数番号は実験君だってずーっと前になんかで読んだのですが、Pentium は 586 って名前の割りには息が長いですよね。
2008-05-29 Thu 23:53 | URL | ま #-[ 内容変更]
追記:
FLAGレジスタってのもありんす。
良く使うのは、S,Z,C,O だす。
S Sign フラグ、演算結果最上位ビットが立ったらセット。
Z Zero フラグ、演算結果が0になったらセット。
C Carry フラグ、演算結果で桁繰り上がりがあるときセット。
O Overflow フラグ、演算結果がマイナスになるときセット。

ということで内部表現としては、EAX は Unsigned int でいいかもしれんけど、プログラムのロジックとしては FLAG のセットビットを見てその時はSignedであるときはUnsignedでって分けた方がCPUの動きをシミュレートするには良いかもっすね。

S,C,O で算術演算、
C,O,Z で倫理演算、
みたいにして使うんすよ。


おっと良く読み返してみるとCPUオブジェクト、仮想コンピュータの話だったんですね。

失礼しました。
m(__)m
2008-05-30 Fri 00:16 | URL | ま #-[ 内容変更]
ご意見ありがとう。コメントをいただけると大変嬉しいです。
今回は16AXとか書いていないけど、あと少ししたら実際の命令をシュミレーションするところで登場します。もちろんFLAGSレジスタも出てくるから安心してね。
デバッグレジスタやFPUレジスタの登場予定は今のところ無いのですが、気が変われば書くかもしれません。
また見てね♪
2008-05-30 Fri 01:07 | URL | インドリ #-[ 内容変更]
ごめんブログに慣れていないからEnterキーを誤って押してしまったorz
誤:今回は16AXとか書いていないけど
正:今回は16ビットのAXレジスタとか書いていない無いけど
です。
2008-05-30 Fri 02:21 | URL | インドリ #-[ 内容変更]
∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

ネタ好き未記入さんの Blog オープン …
2008-05-29 Thu 17:16 じゃんぬねっと日誌
∧top | under∨
| 無差別に技術をついばむ鳥 |