バイナリをつつく12−逆さ星人の考え方2008-06-03 Tue 15:18
バサバサバサバサバサバサバサバサバサバサバサバサインドリ入りまーす。
前回は大まかな流れを説明したから今回は細部を書くよ。 だけど、命令の読み込みについては特に説明する事ないからそれは飛ばして、 【命令の意味解析】を説明するピヨ。 まずCommand構造体を見てみよう。 現時点のCommand構造体
それは、命令には符号を考慮するものと符号を考慮するしないものがあるからなんだ。 だからもし、このプロパティの型をint(Int32)としてしまったら、符合を考慮しない値を格納できなくなってしまう。だからひとまず、 uing型に入れといて命令の実行の際に符号の扱いを決める仕様にしたんだ。 さて、次に意外と思うだろうけど前回の記事の「先ほど取り出した値をCommand構造体に設定します。」ここの部分ピヨ。 何故注意が必要かというと、IntelCPUはリトルエンディアン:little endian(小さなインデアンじゃないよ)でデータを扱うから、 逆に送られてくる数値を元に戻さないといけないからなんだ。 ややこしいと思うから実例を挙げて説明するよ。 「NASMアセンブラが出力したリスティングファイルから抜粋」
何かおかしいことに気付いたかな?B8はmov命令の数値だから残りを関数電卓で算出してみると結果は100048135。????!あれぇーどうなっているのかな?じゃあ今度は127792645を16進表記にすると079DF605 これをピヨーク見てみよう1バイトずつ逆になっているのがわかると思う。 これを読んでいる人の中には何でやねん!と思わず呟いた人もいると思うけど、残念ながら僕にもわからない。多分Intelさんの大人の事情なんだろうね。 それでCPUオブジェクトを実装するのにには数値を逆にするメソッドが必要になる。そこで次のメソッドを実装した。
インドリィちゃん「テストファースト。」インドリ「うああ来たー!」
インドリ「やったー成功したぞ!」インドリィちゃん「トリのくせに・・・かわいくない。ぐっすん。」 インドリ「あわわわ。どうしよう。1回ぐらいテストに失敗したほうがよかったかな?」 まぁ何はともあれ、命令の意味解析で重要な事は書いたから今回の記事はこれで終わるよ。 じゃあねー。 |
この記事のコメント |
コメントの投稿 |
||
|
|
||
| 管理者だけに閲覧 | ||
|
|
||
この記事のトラックバック |
|
| 無差別に技術をついばむ鳥 |
|