fc2ブログ

バイナリをつつく9ー電波ソムリエ1

今回はいよいよ本格的に命令を調べていくよ。
とはいえ、やっぱり難しい命令は嫌だからHLTの次に簡単そうな命令を探すピヨ。
えっと、これはどうかな?PUSH(Push Word or Doubleword onto the Stack)
うわぁ、正式名長すぎる。
では早速PUSH君をいつものマニュアルのA-61バイトのオペコード・マップ(左側)で調べよう。 この表によると、5行目の0~7列は全てPUSH君に関する事で、プッシュするレジスタが違うだけだ。 さらにオペコード・マップ(右側)を見るとPOPとPUSHが対照的に決まっている。
Intelさん、粋な計らいするねぇー。これは判りやすいピヨ。
そこには、eAXとか変なレジスタが書いてあるけど、これは僕がレジスタを忘れていたのじゃない。 これは、CPUが32ビットならばEAX、16ビットならばAXという意味の記号だよ。
じゃあこれ簡単だから実装してしまおう。
ピヨッとその前に、オペコードの情報が簡単にわかるメソッドがあれば便利だと思わない?
あれば毎回調べなくてもいいしね。
ということで、CPUオブジェクトにstaticメソッドを実装してみた。
実装の抜粋
public static OpeCodeInfo SearchOpeCode( byte value ) {
    OpeCodeInfo info = new OpeCodeInfo( value ); //オペコード・マップの情報
    byte row = ( byte ) ( value & 0x11110000 ); //バイトから行を抽出
    byte col = ( byte ) ( value & 0x00001111 ); //バイトから列を抽出
    //途中省略
    switch ( row ) {
	case 5:
	    switch ( col ) {
                #region Push
		case 0:
		    info.Name= CommandName.PUSH; //命令の名前
		    info.NextType = NextInfoType.VaryRegister; //レジスタ未決定
		    info.OneReg = Register.eAX; //EAXまたはAXであることを示す
		    break;
		    //途中省略
	    #region Pop
	        case 8:
	            info.Name = CommandName.POP; //命令の名前
	            info.NextType = NextInfoType.VaryRegister; //レジスタ未決定
	            info.OneReg = Register.eAX; //EAXまたはAXであることを示す
	            break;
     //途中省略
}

このコードを読んだみんなはOpeCodeInfo構造体NextTypeプロパティが気になると思う。
このプロパティを設定したわけは、次に必要な情報が色々あるからなんだ。
実例としてADD命令を考えてみよう。
この命令は、ADD EAXレジスタ 32ビットの即値  という場合もあるし 
ADD 任意の16ビットレジスタ 8ビットの即値 などピね。   
他にもいろいろな場合がある。1と0だけで判断しているからいっぱい必要になるんだね。
これら様々なバリエーションの構造体を定義していれば面倒くさいし、クラスにして関数の戻り値の型を抽象型にしても、キャストばかり必要となってしまう。
だから僕は、OpeCodeInfo構造体に次にどんな種類の情報が必要なのか定義することにしたんだ。 じゃあ、早速PUSHとPOPの動作を実装してみよう!っといいたいところだけど、先ほどのADD命令のような命令フォーマットの場合どうするかを先に考えておきたいと思う。
今晩はこれにておしまい。次回まで少し待ってね。
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

バイナリをつつく8-狙いを定める

よし、レジストのテストも終わったし、ようやく本格的な命令を調べるピヨ。
でも闇雲にしても仕方がないので、獲物を探すぞ。
いでよ!IA-32 インテル® アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル、中巻 A: 命令セット・リファレンス

ペラ       ペラ         ペラ       ペラ     ペラ         ペラ        ペラ      ペラ     パリッ ボリボリボリボリボリボリボリボリボリボリ          ごっくん           ボリボリボリボリボリボリボリボリボリボリ                      ごっくん           ジーーーーーーーーーーーーーー    ピムピム    ピムピム    ピムピム    ピムピム    ピムピム


ひとまずほしい命令の種類は・・・
  • データの移動
  • 算術演算
  • 論理演算
  • 条件分岐
  • スタック操作
  • ビット操作
  • フラグ操作
  • ジャンプ
  • ループ
  • サブルーチン
  • その他必要に応じて
だピヨ。
命令を今から調べると話しの区切りが悪いので、短いけども今回の記事は終わるよ。

テーマ : プログラミング
ジャンル : コンピュータ

バイナリをつつく7-テストと時間は効率的に

インドリィちゃん「本気を出すわよ。」
インドリ「何?何?何?何?何?何?何?何?何?何?何?何?」(ドキドキ)
インドリィちゃん「フルテスト実施」
インドリ「ピィ~」
/// 
/// 16ビットのレジスタを全てテストする。
///
[TestMethod( )]
public void RegisterTo16BitTest( ) {
    //テスト用変数を準備
    ushort val;
    ControlProcessingUnit target = new ControlProcessingUnit( );
    Random dom = new Random( ( int ) DateTime.Now.Ticks );
    Type type = target.GetType();
    //リフレクション用変数を準備
    string[ ] names = new string[ ] { "AX", "BX", "CX", "DX", 
	"SI", "DI", "BP", "SP", "IP"};
    BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | 
            BindingFlags.SetProperty | BindingFlags.GetProperty | 
            BindingFlags.DeclaredOnly | BindingFlags.Instance;
    foreach ( string name in names ) {
        //テストするレジスタ用プロパティを取得
        PropertyInfo reg32 = type.GetProperty( "E" + name, flags);
        Assert.IsNotNull( reg32, "E" + name + "レジスタが足りないぃ~。");
        PropertyInfo reg16 = type.GetProperty(name, flags);
        //値の取得&設定テスト
        Assert.IsNotNull( reg16, name + "レジスタが足りないぃ~。" );
        for ( int i = 0; i < 100; i++ ) {
            //共有フィールドを汚しておく
            reg32.SetValue(target, 
                (uint)dom.Next(int.MinValue, int.MaxValue), null);
            //16ビットレジスタのテスト
            val = ( ushort ) dom.Next( ushort.MinValue, ushort.MaxValue );
            reg16.SetValue( target, val, null );
            Assert.AreEqual( val, reg16.GetValue(target, null),
               name + "に「" + val.ToString( ) + 
               "」を入れたら引っかかった。by ドリィ" );
        }
        //上下限チェック
        val = ushort.MinValue;
        reg16.SetValue( target, val, null );
        Assert.AreEqual( val, reg16.GetValue( target, null ), 
		name + "の上限チェック失敗。by ドリィ" );
        val = ushort.MaxValue;
        reg16.SetValue( target, val, null );
        Assert.AreEqual( val, reg16.GetValue( target, null ), 
		name + "の下限チェック失敗。by ドリィ" );
    }
}

インドリ「うわぁー何回もレジスタが足りないとか、間違っているとかいわれた。」
インドリィちゃん「わかればいいのよ。」
インドリ「これ何!何でひとつのテストで複数のチェックが出来るの?」
インドリィちゃん「リフレクション。内容を説明する。」
インドリ「インドリィちゃん嬉しそう。エラーが出たの」(途中でさえぎられる)
インドリィちゃん「似たようなプロパティがいっぱいあればトリは忘れる。」
インドリ「うっ言い返せない。」
インドリィちゃん「面倒だからコピーの誘惑も出る。だけど、そういう時は過ちを犯しやすい。」
インドリ「コピーしたのバレてる!」
インドリィちゃん「多くのバグは先入観が原因。先入観がないようにテストはプログラムに任せろ。」
インドリ「おみそれしました。」
インドリィちゃん嬉しそうに消える。
みんなテストはなるべくプログラムでやるようにしよう。
そうすれば思いがけない間違いを発見してくれるよ。
それにテストプログラムは長くなりがちだから、リフレクションなどを使って短くする工夫も大事だよ。
テストプログラムが長くなりすぎると生産性が逆に落ちるピヨ。
これでテストはバッチリなはず、みんなもCPUオブジェクトを作ってみよう。
次からはさらに本格的なマシンコードを解説するから、実際にプログラムするとよいよ。
じゃぁ近いうちにまた合いましょう。
じゃあ僕と一緒にバイナリに向かって飛ぼうー。
あれっ?誰もついてこない~。 バサ バサ バサ バサ バサ バサ バサ バサ バサ バサ バサ バサ バサ バサ

テーマ : プログラミング
ジャンル : コンピュータ

ネタつつきー10年は泥のように働け

最近@ITの記事で興味深いネタがあったピヨ。
URLはこちらネタ元 えっボク?ボクは怖いから遠くから見ていたw
大方の予想通りネット内で激論がバサバサと飛び交ったピヨ。
その中で一際異彩を放っていたのがNyaRuRuさんです。
賛成するのでもなく、反対するのでもなく、その面白ネタから発生する事象を観察している姿にハッカー魂を感じました。とてもクールです。
その姿勢から情報の切り口にも色々あるんだなと情報の深さを改めて感じた。
ニュースももちろん面白いけど、その情報の処理結果に個性が在って面白ピヨね。

テーマ : ITニュース
ジャンル : ニュース

バイナリをつつく6-テストは大事だよ

インドリィちゃん「とり、起きなさい。テスト忘れているわよ。」
インドリ「ええ、今度は何?」
インドリィちゃん「コードをテストしなさい。」
インドリ「あっそうポ!テストファーストだから最初にテストしなくちゃ。」
インドリィちゃん「テスト作ってあげたわ。さあ、引っかかりなさい。」
インドリ「どれどれ・・・」
[TestMethod( )]
public void AXTest( ) {
    ControlProcessingUnit target = new ControlProcessingUnit( ); //CPUオブジェクト
    Random dom = new Random( (int)DateTime.Now.Ticks );
    ushort val;
    //ランダム値による取得&設定テスト
    for ( int i = 0; i < 100; i++ ) {
        target.EAX = ( uint ) dom.Next( int.MinValue, int.MaxValue );
        val = ( ushort ) dom.Next( ushort.MinValue, ushort.MaxValue );
        target.AX = val;
        Assert.AreEqual( val, target.AX, 
            "AXに「" + val.ToString() + "」を入れたら引っかかった。by ドリィ" );
    }
    //上下限チェック
  val = ushort.MaxValue;
    target.AX = val;
    Assert.AreEqual( val, target.AX, "上限チェック失敗。by ドリィ" );
    val = ushort.MinValue;
    target.AX = val;
    Assert.AreEqual( val, target.AX, "下限チェック失敗。by ドリィ" );
}

インドリ「うわぁ、嫌らしいテストプログラム。徹底的にバグを見つけるつもりだ。」
インドリィちゃん「テスト!」
インドリ「成功したよ。」
インドリィちゃん消える。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
びっくりした。インドリィちゃんは怖かったけどテストは大事だよ。
今回は1回で成功したけど、プログラムに間違いはつきもの。
みんなテストは最初につくろうね。

テーマ : プログラミング
ジャンル : コンピュータ

バイナリをつつく5-もっとレジスタ

インドリ「さて、次はmov命令に調べようかな♪add命令に調べようかな♪」
インドリィちゃん「コメント見たわよ。」
インドリ「えっ何?何?」(うわぁ、インドリィちゃん苦手なんだよね。)
インドリィちゃん「レジスタが足りないぃ。貴方の頭と同じようにね。」
インドリ「そっそれは中の人が・・・」
インドリィちゃん「言い訳は結構。レジスタが足りないぃ。」
インドリ「わかったよ。レジスタを調べるよ。」
インドリィちゃん消える。

ふぅ~、目ざとい人は気付いていたと思うけど、16ビットレジスタと8ビットレジスタをCPUオブジェクトのプロパティにしていなかったピヨ。

  • EAX(32~1)、AX(16~1)、AH(16~9)、AL(8~1)
  • EBX(32~1)、BX(16~1)、BH(16~9)、BL(8~1)
  • ECX(32~1)、CX(16~1)、CH(16~9)、CL(8~1)
  • EDX(32~1)、DX(16~1)、DH(16~9)、DL(8~1)
  • ESI(32~1)、SI(16~1)
  • EDI(32~1)、DI(16~1)
  • EBP(32~1)、BP(16~1)
  • ESP(32~1)、SP(16~1)
  • EIP(32~1)、IP(16~1)
※ビット数は右から数えております。
この一覧を読んだ人は、重なりが気になると思う。
例えば、AXとAHの範囲が重なっているけど、これはAXの左半分がAHという意味なんだ。
じゃあ、何でEAXの左半分は指定できないのか?!と疑問や怒りを持つ人がいると思うけど、これは僕にもわからない
多分インテルさんに何らかの事情があったんだと思う。
これもCPUオブジェクトのプロパティにしようと思う。
プロパティにしなくちゃまた怖いインドリィちゃんに怒られるしね。
インドリィちゃん「何か?」
インドリ「何もないよ。」
そっそれはさておき、今までのサンプルを書く必要すらないプロパティとは違って、AXとかはビットを共有しなくちゃならないからちょっと難しいピヨ。
実例を書くと、AXがA8(168)の時、AH=A0(160)、AH=8(8)でなくては駄目なんだ。
こういう時はビットの論理演算を使用すればいいんだ。 先ほどの例で言うと、AXにA8を入れた時AHにA0を入れるには、A8とF0の論理積を求めればいいんだ。
わかりにくいからもっと詳しく書くと・・・

1111 0000 AND 1010 1000 = 1010 0000

になるから、アーラ不思議、AHにA0が代入されるんだ。
これと同じ要領でAH=8にするには・・・

0000 1111 AND 1010 1000 = 0000 1000

になるから、ほらまた出た、ALに8が代入されるんだ。
これを頭に入れてプロパティを実装すると下記のようになるピヨ。
private uint eax; //共通のフィールド
public ushort AX {
    get {
        //余分な右半分の全ビットをOFFにして返す
        ushort val = (ushort)(this.eax & 0x0000FFFF);
        return val;
    }
    set {
        //左半分を全てリセットしてから足す
        uint tmp = this.eax & 0xFFFF0000;
        this.eax = tmp + value;
    }
}
※コメントはItenlだからリトルエンディアン(左右逆)で表示w
このようにしていけばOKだよ。
えっEFLAGSレジスタ?それはちょっとまってね。
今回の記事はこれにておしまい。めでたしめでたし。

テーマ : プログラミング
ジャンル : コンピュータ

バイナリをつつく4-電波ソムリエ0

おっはピョー。今日も元気にCPUオブジェクトの作成を行いマース。
前回はマシンコードの令名フォーマットの概要だけみたから、今回はもっと深く掘り下げていくよ。みんな一緒に0と1の海を泳ごう!夏だ海だバイナリだ!
Intelの命令フォーマットはかなり難しい、こういう場合は一番簡単な命令を探すのがいい。
誰だっていきなり難しいところ勉強するの嫌だよね。
えっと、サーチ中、サーチ中、サーチ中、サチ中、誰それ?、サーチ中・・・
サーチ終了!一番簡単な命令発見したピヨ。それでは簡単コンクール一位を発表します。

HLT(Halt Processor:プロセッサ停止)
「オペコード1つしかないってすごく短いでピヨね。HALさん一位になった感想を訊かせてください。」
HLT「zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz」
「あれ?寝ちゃってるよ。」

この命令は動作がすごく単純。ただCPUが停止するだけなんだ。レジスタも要らない。だけどOS作りには欠かせない重要な命令ピヨ。
じゃあ早速、毎度おなじみIA-32 インテル® アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル、中巻 A: 命令セット・リファレンスを見よう。
バサバサバサ、あったぞ!マニュアル820ページに1 バイトのオペコード・マップがあった。
この表の見方は4ビットずつ左右に分けて、左の4ビットは行、右の4ビットは列ということらしい。これは便利!0回目で文句言ってごめんね。
ピピピ、HLT君発見オペコードF4だって。すごくリゾーナブル。偉い偉い。
次はもう少し難しい命令を見る予定なんだけど、長くなりそうなんで一端ここで記事を終わるよ。じゃあまったねー。
とぅー。ピュー、ガン、ボテ。

テーマ : プログラミング
ジャンル : コンピュータ

バイナリをつつく3ー電波を理解する

前回IntelCPUオブジェクトの大まかな仕様が決まったから早速CPUとお話しするよ。
「ハロー、インテル君」
CPU「B409 BA[0D00] CD21 B44C B000 CD21 48656C6C6F2C20696E 646F726924」
ガーン(@/\@)。何言っているのかわかんないや。宇宙語かな?
駄目だ!会話は不可能だ。
そうだった忘れていた、彼らは0と1しかわからないし0と1で話しをするんだった。
こういう時はやっぱり辞書が必要ピョ。
CPUの辞典はやっぱり、ゴソゴソゴソゴソ 見つかった! じゃーん。
IA-32 インテル® アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル、中巻 A: 命令セット・リファレンス
さっそくP33の「第2章 命令フォーマット」を読むと・・・ピミュピミュ
命令プリフィックス、オペコード・バイト、ModR/Mバイト、SIB ( スケール・インデックス・ベース)、ディスプレースメント、即値データからなるらしい。 ずいぶん多いね、タジタジ、だけどほとんどのフィールドは必ずしも必要でないらしいね。ちょっとピォッとしたよ。
うーん、説明読んでもよくわかんないな・・・
こういう時は使ってみないとわかんないから、取り合えずこれをCommand構造体に決定!
もちろんマニュアルに書いてある命令フォーマットのフィールドはプロパティにしとく。

だけど、困ったな、この各フィールドはサイズが変動するんだよね。
だから実際にコードを書くのは、もう少し命令フォーマットを知ってからにしよう。
えっと、今回は話しが長くなるから今回はここでおしまい。多分今日中に続きを書くよ。
おやすみなさい・・・zzzzzzzzzzzzzzzzzzzzz

テーマ : プログラミング
ジャンル : コンピュータ

バイナリをつつく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

テーマ : プログラミング
ジャンル : コンピュータ

バイナリをつつく1-バイナリを考える

昨日インドリはインテルマニュアルを手に入れた!
さっそく、インドリは薄気味悪く微笑みながらお宝を読みつつ色々な事を考えた。
妹「うぁっ キモ!」
そして呟いた「なんか面白いものを作ろピヨ」
プログラミングの学習は、やはり何か物を作らなければ楽しくない。
通常の開発では予め厳密に仕様を決めて、仕様書などの書類をゴリゴリ書いて、退屈な作業の末、納期の強烈なプレッシャーの中不眠不休でソフトを作らなければならない。
嗚呼、憎きはデスマーチ!
へっぽこマネージャーはどこかへ行け!
この ピー野郎 バーキューンへぇ
おっほん、取り乱して失礼した。苦々しい思い出が脳裏がよぎったものでね。

本題に戻る。
だけど、そんなこと誰でも私生活でしたくないよね?
だからインドリは考えた、楽しみながらテキトーに作ろうと。
※よい子は実際の開発で絶対に真似をしないでね。

テキトーに作るって言っても、だからと言って物事はある程度考えなければならない。
インドリは考えを纏めるためにやりたい事を箇条書きにしてみた。

  • CPUの動きを可視化したい。だからCPUをオブジェクト化する。

  • バイナリをアセンブラに翻訳したい(もちろんその逆も)

  • ひとまず処理効率は気にしない。

  • メモリ管理なんかせず簡単に作りたい。だから開発言語にGC(garbage collection)機能が必要。

  • インドリはおっちょこちょいなので、すぐにバグを作る。
    だからテストを簡単にしたい。やっぱ時代はテストファーストだ。

  • いっそうの事PC全てをオブジェクトで表現しちゃえ!

  • 世界に平和をもたらすソフトを作る。


・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
インドリは空想(妄想)を広げるのが好きだから本当はもっと妄想したんだけど、余り酷いので省略した。
次に考えるべきなのは開発環境だ。インドリは苦慮の一番慣れているVS2005 C#を選んだ。
今回はマシンコードを学習する事が目的であり、何かを学習するために学習するのは避けたのだ。
次に考える事はCPUオブジェクトの構造だが・・・
ぷっしゅー
頭があまりよくないインドリが知恵熱を出したのでひとまず休憩する。
近いうちにまた会いましょう。

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター