#navi_header|Assembler| MBR以降のブートローダ周りのアセンブラプログラミングを楽しむのであれば、Windows/Linuxで動作するx86エミュレータ "Bochs" が便利です。Windows用のインストーラEXEをHPからダウンロード出来ます。 コンパイル時にデバッグ機能を有効化すると、BIOSが立ち上がる段階からステップ実行やレジスタ内容の確認が出来ます。Windows用のインストーラでセットアップするとデバッグ機能が有効化された"bochsdbg.exe"も同時にインストールされるので、わざわざコンパイルする必要もありません。 - bochs: The Open Source IA-32 Emulation Project (Home Page) -- http://bochs.sourceforge.net/ ところが、2010年9月時点での最新版、2.4.5のWindowsバイナリはx86_64をエミュレートするようコンパイルされています("--enable-x86-64"有効)。 x86の16bitや32bitの世界をBochsのデバッグ機能で楽しみたい場合は、"--enable-x86-64"を無効にして("--disable-x86-64")コンパイルする必要があります。 Linux/UNIX環境であればソースを展開して "./configure" で次のオプションを指定すればOKです。 --disable-x86-64 --enable-debugger --enable-disasm 本記事では Windows 環境の場合にBochs-2.4.5で上記オプションでビルドする手順を紹介します。 コンパイラは Visual C++ 2008 Express Edition SP1 を使います。Cygwin/MinGWのgccによるコンパイルは本記事では扱いません。 #more|| ---- #outline|| ---- * ツールの準備 - Visual C++ 2008 Express Edition SP1 : コンパイラ・リンカとして使います。Microsoftのサイトからダウンロード出来ます。 - MSYS + MinGW : "./configure"スクリプトを走らせる為のUNIX環境です。ネット上で検索して適宜インストールして下さい。 "./configure"スクリプトを走らせるのであればCygwin環境でもOKと思われます。とりあえず本記事ではMSYS + MinGW環境で"./configure"を実行します。 * ソースの準備と日本語キーボード用patchの適用 - bochs-2.4.5.tar.gz : Bochsのサイトからダウンロード出来ます。 - がじぇっとぼっくす -- http://ebisa.hp.infoseek.co.jp/bochs/index.shtml --- JP106/109の文字化け修正patchが配布されていますので、ここから2.4.5用のzipを入手します。 1. 本家のtarボールを展開します。 例:c:\work\bochs-2.4.5\ README Makefile.in ... 2. "がじぇっとぼっくす"からダウンロードしたzipを展開し、"patch"フォルダ中のpatchファイルを本家tarを展開した"bochs-2.4.5"と同じディレクトリに置きます。 例:c:\work\ bochs-2.4.5-dbgfix-20100430.diff bochs-2.4.5-jpfix-20100430.diff bochs-2.4.5\ README Makefile.in ... 3. MSYSコンソールを開いて、patchを適用します。 例: $ cd /c/work $ patch --dry-run -p0 -b < bochs-2.4.5-dbgfix-20100430.diff (エラーや気になるメッセージが無ければ "--dry-run" を外す) $ patch -p0 -b < bochs-2.4.5-dbgfix-20100430.diff $ patch --dry-run -p0 -b < bochs-2.4.5-jpfix-20100430.diff (エラーや気になるメッセージが無ければ "--dry-run" を外す) $ patch -p0 -b < bochs-2.4.5-jpfix-20100430.diff * "./configure"とビルド 1. "bochs-2.4.5/.conf.win32-vcpp" の "./configure" オプションを以下のように修正します。 #pre||> use_debugger="enable" use_a20="enable" ./configure --target=pentium-windows \ --enable-cpu-level=6 \ --disable-shared \ --disable-acpi \ --disable-x86-64 \ --disable-vmx \ --disable-smp \ --disable-3dnow \ --disable-monitor-mwait \ --disable-gameport \ --disable-sb16 \ --disable-usb \ --enable-alignment-check \ --enable-all-optimizations \ --enable-pci \ --enable-vbe \ --enable-clgd54xx \ --enable-cdrom \ --enable-ne2000 \ --enable-configurable-msrs \ --$use_a20-a20-pin \ --$use_debugger-x86-debugger \ --$use_debugger-debugger \ --$use_debugger-disasm \ --$use_debugger-debugger-gui \ --enable-iodebug \ --enable-show-ips \ --with-win32 \ --with-rfb \ --with-nogui ||< オプションなどはお好みに応じて調整して下さい。但し次のオプションは必須なので省略しないで下さい。 use_debugger="enable" use_a20="enable" ... --target=pentium-windows # VC++用 --disable-x86-64 # x86_64無効化 --$use_a20-a20-pin # A20pin有効 --$use_debugger-x86-debugger # 以降、デバッグ機能有効 --$use_debugger-debugger --$use_debugger-disasm --$use_debugger-debugger-gui 2. MSYSコンソールで "bochs-2.4.5" のディレクトリにcdし、"sh .conf.win32-vcpp" を実行します。 $ cd /c/work/bochs-2.4.5 $ sh .conf.win32-vcpp 3. "Visual Studio 2008 コマンドプロンプト"を開き "bochs-2.4.5" にcdし、nmakeを実行します。 > cd C:\work\bochs-2.4.5 > nmake NOTICE: "Visual Studio 2008 コマンドプロンプト" でなくとも、vcvars32.batなどで環境変数を調整したコマンドプロンプト上であればOKです。 * インストール ビルドに成功すれば、"bochs-2.4.5"ディレクトリ上に以下のEXEが生成されます。 bochs.exe ... Bochs本体 bxcommit.exe ... flat HDD イメージファイルにredologを書き出すツール bximage.exe ... Bochs用のFD/HDDイメージファイル作成ツール niclist.exe ... NICインターフェイスのリストアップ bochs.exeを実行するには、仮想マシンの設定ファイル "bochsrc" やBIOS/VGABIOSファイルが必要です。 ここでちょっと手抜きをして、Bochsの実行用ディレクトリツリー一式を、本家からコピーしてしまいます。 1. 本家のWindows用インストーラを使ってセットアップします。 2. ビルドしたEXEで本家のEXEを上書きコピーします。 必要に応じて、上書きコピーする前に本家のEXEファイルをバックアップして下さい。 以上でdebug機能有効+x86_32モードでのBochsでアセンブラプログラミングを楽しめるようになります。 なお「USBメモリで持ち運べるようにしたい」等の理由でインストールディレクトリをコピー+本家の方はアンインストールしてしまう場合、BXSHARE環境変数を手動で設定する必要があるので注意して下さい。また、BXSHARE環境変数ではディレクトリセパレータを"/"で表記する必要があります。 ex: > set PATH=C:\work\bin\Bochs-2.4.5;%PATH% > set BXSHARE=C:/work/bin/Bochs-2.4.5 * 動作確認 とりあえずBIOSが起動することを確認してみます。 以下のような".bxrc"ファイルを用意します。 test.bxrc: romimage: file=$BXSHARE/BIOS-bochs-latest vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest megs: 16 floppya: 1_44=foobar, status=inserted boot: floppy "floppya"で指定した"foobar"というイメージファイルは存在しませんので、BIOSブート後にエラーとなります。 とりあえずBochsがデバッグ機能有効で起動することを確認出来ればよいので、このまま"test.bxrc"ファイルを指定してBochsを起動します。 #pre||> > bochs -q -f test.bxrc ======================================================================== Bochs x86 Emulator 2.4.5 Build from CVS snapshot, on April 25, 2010 ======================================================================== 00000000000i[ ] reading configuration from test.bxrc 00000000000i[ ] installing win32 module as the Bochs GUI 00000000000i[ ] Bochs x86 Emulator 2.4.5 00000000000i[ ] Build from CVS snapshot, on April 25, 2010 00000000000i[ ] System configuration 00000000000i[ ] processors: 1 (cores=1, HT threads=1) 00000000000i[ ] A20 line support: yes 00000000000i[ ] CPU configuration 00000000000i[ ] level: 6 (...) 00000000000i[ ] set SIGINT handler to bx_debug_ctrlc_handler Next at t=0 (0) context not implemented because BX_HAVE_MAP=0 [0xfffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b ; ea5be000f0 ||< ここでデバッグ用のコマンドプロンプトが表示され、デバッグコマンドの入力待ちとなります。 試しにレジスタ群を表示させる"r"コマンドを実行してみます。 #pre||> r eax: 0x00000000 0 ecx: 0x00000000 0 edx: 0x00000f00 3840 ebx: 0x00000000 0 esp: 0x00000000 0 ebp: 0x00000000 0 esi: 0x00000000 0 edi: 0x00000000 0 eip: 0x0000fff0 eflags 0x00000002: id vip vif ac vm rf nt IOPL=0 of df if tf sf zf af pf cf ||< EAX, EBX, ... とx86_32でお馴染みのレジスタ群が表示されました。本家バイナリなど"--enable-x86-64"でコンパイルされると、"RAX, RBX, ..."というふうにx86_64で拡張されたレジスタ群が表示されます。 続行するには"c"コマンドを実行します。その他のデバッグコマンドは"help"コマンドで調べることができます。 #pre||> c 00000003305i[BIOS ] $Revision: 1.247 $ $Date: 2010/04/04 19:33:50 $ 00000200000i[WGUI ] dimension update x=720 y=400 fontheight=16 fontwidth=9 bpp=8 00000318042i[KBD ] reset-disable command received 00000444800i[VBIOS] VGABios $Id: vgabios.c,v 1.69 2009/04/07 18:18:20 vruppert Exp $ 00000444871i[CLVGA] VBE known Display Interface b0c0 00000444903i[CLVGA] VBE known Display Interface b0c5 00000447828i[VBIOS] VBE Bios $Id: vbe.c,v 1.62 2009/01/25 15:46:25 vruppert Exp $ 00000760517i[BIOS ] Starting rombios32 00000761014i[BIOS ] Shutdown flag 0 00000761697i[BIOS ] ram_size=0x01000000 00000762175i[BIOS ] ram_end=16MB ... 00013554880i[FDD ] attempt to read/write sector 1 with media not present 00021536598i[FDD ] controller reset in software 00021591573p[BIOS ] >>PANIC<< No bootable device. ||< ここで表示が止まります。 Bochsのウインドウを見てみると、"PANIC"ダイアログが表示されますので、"Kill simulation"を選択して"OK"をクリックして終了します。 #pre||> ======================================================================== Bochs is exiting with the following message: [BIOS ] No bootable device. ======================================================================== 00021591573i[CPU0 ] CPU is in real mode (active) 00021591573i[CPU0 ] CS.d_b = 16 bit 00021591573i[CPU0 ] SS.d_b = 16 bit 00021591573i[CPU0 ] | EAX=0000040a EBX=0000cd04 ECX=00000004 EDX=00000402 00021591573i[CPU0 ] | ESP=0000ffa8 EBP=0000ffac ESI=000e32f8 EDI=0000ffac 00021591573i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf ZF af PF cf 00021591573i[CPU0 ] | SEG selector base limit G D 00021591573i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D 00021591573i[CPU0 ] | CS:f000( 0004| 0| 0) 000f0000 0000ffff 0 0 00021591573i[CPU0 ] | DS:0000( 0005| 0| 0) 00000000 0000ffff 0 0 00021591573i[CPU0 ] | SS:0000( 0005| 0| 0) 00000000 0000ffff 0 0 00021591573i[CPU0 ] | ES:07c0( 0005| 0| 0) 00007c00 0000ffff 0 0 00021591573i[CPU0 ] | FS:0000( 0005| 0| 0) 00000000 0000ffff 0 0 00021591573i[CPU0 ] | GS:0000( 0005| 0| 0) 00000000 0000ffff 0 0 00021591573i[CPU0 ] | EIP=00000560 (0000055f) 00021591573i[CPU0 ] | CR0=0x60000010 CR2=0x00000000 00021591573i[CPU0 ] | CR3=0x00000000 CR4=0x00000000 (0).[21591573] [0x000f055f] f000:055f (unk. ctxt): out dx, al ; ee 00021591573i[CMOS ] Last time is 1284617497 (Thu Sep 16 15:11:37 2010) # In bx_win32_gui_c::exit(void)! 00021591573i[CTRL ] quit_sim called with exit code 1 > ||< 以上で、x86_32bit + デバッグ機能有効化されたBochsを動かせるようになりました。 #navi_footer|Assembler|