5
4

More than 5 years have passed since last update.

第一回 x86バイナリ入門

Last updated at Posted at 2015-04-15

PC/AT互換機を使ってるプログラマなら当然、x86バイナリを読めるのでここで書くまでもないわです。でも、もしかしたら忘れてしまった!とかちょっと怪しい!ってプログラマのためにx86バイナリ講座をやってみようかと思います。

まぁ、この記事を読んでる方はqemuをインストールしてるんじゃないかという期待があるので、qemuインストールしておいてね!

今回学ぶバイナリは以下のファイルになっています
http://d-kami.net/bin/color.bin

バイナリエディタで開くと途中からやたらと0が続き0x200付近に0x55 0xAAがあると思います。この位置にこのマジックナンバーがないとqemuで動かなくなるので間違ってもここは編集しないように!実行の仕方は

qemu -fda color.bin

ですよ!このプログラムはブートセクタに格納され、16bitリアルモードで動きます。説明するまでもなかったですね。それで、このファイルの重要な部分は以下の通り。全部解説すると長くなるので、途中でやめて次回を作ることにしました

color.bin
B4 00 B0 03 CD 10 B0 12 CD 10 B4 0C BA 00 00 B0
01 B9 00 00 CD 10 83 C1 01 81 F9 80 02 75 F5 83
C2 01 81 FA E0 01 75 E9 EB FE

当然読めると思うので解説するまでもないですが...
B4 00はAHレジスタに0を代入する命令です!B4が命令で、00が代入される値で、このように直接数値が書かれているのを即値と呼ばれているらしい。他にディスプレイスメントとかあるけど、とりあえず即値!B4はAHに1バイト即値を代入しろ!って命令です。簡単すぎて説明するまでも無かった。この命令を邪道アセンブリ言語で書くと以下の通りになります。Intel記法なので邪道AT&T記法に慣れてる人は注意が必要です。

mov ah, 0x00

B0 03はALレジスタに0x03を代入しろという命令です。さっきの命令と似ていますが、世の中自分に似ている人が5人はいるというように、x86には似た命令が沢山あったりします。今回も邪道なアセンブリ言語で書くと以下の通りになります。

mov al, 0x03

ちなみに、AHレジスタはAXレジスタとかいう16bitレジスタの上位8bit、ALはAXレジスタの下位8bitとなっています。別名的な何かですね。説明してしまってすみません。CD 10が続いています。CDとはBIOS Interrupt Call命令で、BIOSの機能を使える便利な命令ですが、実際にはソフトウェア割り込みとかいう難しい話です。

そんなの無視してBIOS Interrupt Callでの話をします。後ろに続く1バイトがcallされる機能の番号で、この番号とレジスタの値によって、呼ばれる機能が決まります。画面に文字を表示しろ!とかフロッピー(死語)を読み込め!などがあります。今回は0x10の機能を使っています。0x10はグラフィック関係の機能があるようです。そして今回はAHが0x00でALが0x03なのですが!AHが0x00だとVideo Modeの設定というやつで、ALの値にそったビデオモードになるようです。ALが0x03だと半角文字で80x25ぶんの画面にする!って感じらしいです。詳しくはhttp://www.ctyme.com/intr/rb-0069.htm
に載っています。頑張ってよもう!

なんか疲れてきたので、このへんで終わります。次回を楽しみに待っていてください!

5
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4