バイナリをつつく5−もっとレジスタ2008-05-30 Fri 12:37
インドリ「さて、次はmov命令に調べようかな♪add命令に調べようかな♪」
インドリィちゃん「コメント見たわよ。」 インドリ「えっ何?何?」(うわぁ、インドリィちゃん苦手なんだよね。) インドリィちゃん「レジスタが足りないぃ。貴方の頭と同じようにね。」 インドリ「そっそれは中の人が・・・」 インドリィちゃん「言い訳は結構。レジスタが足りないぃ。」 インドリ「わかったよ。レジスタを調べるよ。」 インドリィちゃん消える。 ふぅ〜、目ざとい人は気付いていたと思うけど、16ビットレジスタと8ビットレジスタをCPUオブジェクトのプロパティにしていなかったピヨ。
この一覧を読んだ人は、重なりが気になると思う。 例えば、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が代入されるんだ。 これを頭に入れてプロパティを実装すると下記のようになるピヨ。
このようにしていけばOKだよ。えっEFLAGSレジスタ?それはちょっとまってね。 今回の記事はこれにておしまい。めでたしめでたし。 |
この記事のコメントコメントがリトルエンディアンになってるw
すごい。たぶんコレ見て左半分をリセットしてって普通わからんこちゃんよ。 //左半分を全てリセットしてから足す uint tmp = this.eax & 0xFFFF0000; this.eax = tmp + value; だって見た目は明らかに右半分ですもん。
2008-05-31 Sat 01:08 | URL | ま #-[ 内容変更]
Intelはリトルエンディアンだから(笑)
という冗談はさておき、ちゃんと訂正します。 教えてくれて有難う。
2008-05-31 Sat 03:38 | URL | インドリ #-[ 内容変更]
まさんの指摘が面白かったので、ネタとして保存する方向にしました。
2008-05-31 Sat 03:44 | URL | インドリ #-[ 内容変更]
|
コメントの投稿 |
||
|
||
管理者だけに閲覧 | ||
|
この記事のトラックバック |
| 無差別に技術をついばむ鳥 |
|