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

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

バイナリをつつく12−逆さ星人の考え方

バサバサバサバサバサバサバサバサバサバサバサバサインドリ入りまーす。
前回は大まかな流れを説明したから今回は細部を書くよ。
だけど、命令の読み込みについては特に説明する事ないからそれは飛ばして、 【命令の意味解析】を説明するピヨ。
まずCommand構造体を見てみよう。

現時点のCommand構造体
  • CommandName列挙体型のNameプロパティ。
  • NextInfoType列挙体型のNextTypeプロパティ。
  • Register列挙体型のDestinationRegisterプロパティ。
  • uing型(UInt32)のSourceValueプロパティ。
みんなが気になるのはSourceValueプロパティの型が何で符号なし32ビット値なのかだと思う。
それは、命令には符号を考慮するもの符号を考慮するしないものがあるからなんだ。 だからもし、このプロパティの型をint(Int32)としてしまったら、符合を考慮しない値を格納できなくなってしまう。だからひとまず、 uing型に入れといて命令の実行の際に符号の扱いを決める仕様にしたんだ。
さて、次に意外と思うだろうけど前回の記事の「先ほど取り出した値をCommand構造体に設定します。」ここの部分ピヨ。 何故注意が必要かというと、IntelCPUはリトルエンディアン:little endian(小さなインデアンじゃないよ)でデータを扱うから、 逆に送られてくる数値を元に戻さないといけないからなんだ。
ややこしいと思うから実例を挙げて説明するよ。

「NASMアセンブラが出力したリスティングファイルから抜粋」
00000000 B805F69D07 mov EAX, 127792645

何かおかしいことに気付いたかな?B8はmov命令の数値だから残りを関数電卓で算出してみると結果は100048135。????!あれぇーどうなっているのかな?じゃあ今度は127792645を16進表記にすると079DF605 これをピヨーク見てみよう1バイトずつ逆になっているのがわかると思う。
これを読んでいる人の中には何でやねん!と思わず呟いた人もいると思うけど、残念ながら僕にもわからない。多分Intelさんの大人の事情なんだろうね。 それでCPUオブジェクトを実装するのにには数値を逆にするメソッドが必要になる。そこで次のメソッドを実装した。

public static uint ConvertBigEndian( byte[ ] values ) {
    if ( values.Length != 4 )
        throw new ArgumentOutOfRangeException( 
            "このメソッドには必ず4バイトの値を渡して下さい。" );
        uint rVal = ( uint ) values[ 0 ];
        rVal += ( uint ) values[ 1 ] << 8;
        rVal += ( uint ) values[ 2 ] << 16;
        rVal += ( uint ) values[ 3 ] << 24;
        return rVal;
}
インドリィちゃん「テストファースト。」
インドリ「うああ来たー!」
public void ConvertBigEndianTest( ) { 
    //32ビットの一番左が0
    uint rightVal = 127792645; //0x07 0x9D 0xF6 0x05
    byte[ ] vals = new byte[ ] { 0x05, 0xF6, 0x9D, 0x07 };
    Assert.AreEqual( rightVal, 
        ControlProcessingUnit.ConvertBigEndian(vals), 
        "32ビット目が【0】の値でミス。 by ドリィ" );

    //32ビットの一番左が1
    rightVal = 3257141518; 
    vals = new byte[ ] { 0x0E, 0x09, 0x24, 0xC2 };
    Assert.AreEqual( rightVal,
        ControlProcessingUnit.ConvertBigEndian( vals ),
        "32ビット目が【1】の値でミス。 by ドリィ" );
}
インドリ「やったー成功したぞ!」
インドリィちゃん「トリのくせに・・・かわいくない。ぐっすん。」

インドリ「あわわわ。どうしよう。1回ぐらいテストに失敗したほうがよかったかな?」
まぁ何はともあれ、命令の意味解析で重要な事は書いたから今回の記事はこれで終わるよ。 じゃあねー。
別窓 | バイナリ | コメント:0 | トラックバック:0 | ∧top | under∨
<<プログラム言語をつつく1−みんなにご挨拶 | 無差別に技術をついばむ鳥 | プログラム言語をつつく0−百花繚乱>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

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

∧top | under∨
| 無差別に技術をついばむ鳥 |