前から興味があったアセンブラ短歌。PC/AT互換機のブートセクタでできないものかとHello Worldを頑張ってみたが、私には無理だったので、別のプログラムを考えた。それは画面塗りつぶしプログラム。BIOS Function Callの1ドット塗りつぶすという命令を使い、画面全体を塗りつぶしてみた。アセンブリコードは下記に示す(nasm用)
ORG 0x7C00 ;画面初期化 MOV AX, 0x0003 INT 0x10 ;ビデオモード設定 ;VGAグラフィックス、640x480x4bitカラー MOV AX, 0x0012 INT 0x10 MOV AH, 0x0C MOV DX, 479 MOV AL, 1 next_y: MOV CH, 6 MOV CL, 39 next_x: INT 0x10 DEC CX JNE next_x DEC DX JNE next_y fin: JMP fin TIMES 510-($-$$) DB 0 DB 0x55, 0xAA
そしてnasmの-lオプションでアセンブリコードとバイナリの対応付けを出力したものがこちら。
1 ORG 0x7C00 2 3 ;画面初期化 4 00000000 B80300 MOV AX, 0x0003 5 00000003 CD10 INT 0x10 6 7 ;ビデオモード設定 8 ;VGAグラフィックス、640x480x4bitカラー 9 00000005 B81200 MOV AX, 0x0012 10 00000008 CD10 INT 0x10 11 12 0000000A B40C MOV AH, 0x0C 13 0000000C BADF01 MOV DX, 479 14 0000000F B001 MOV AL, 1 15 16 next_y: 17 00000011 B506 MOV CH, 6 18 00000013 B127 MOV CL, 39 19 20 next_x: 21 00000015 CD10 INT 0x10 22 23 00000017 49 DEC CX 24 00000018 75FB JNE next_x 25 26 0000001A 4A DEC DX 27 0000001B 75F4 JNE next_y 28 29 fin: 30 0000001D EBFE JMP fin 31 32 0000001F 00<rept> TIMES 510-($-$$) DB 0 33 000001FE 55AA DB 0x55, 0xAA
最後におまじないがあるけど、実行部分は以下のようになっている。MOVの使い分けがせこいが、5・7・5・7・7になったので満足
B80300CD10 B81200CD10B40C BADF01B001 B506B127CD1049 75FB4A75F4EBFE
となっている。bochsで動作確認済みだが、私が作ったWeb版x86エミュレータでも動作確認ができる。http://web-d-emu.appspot.com/にアクセスして、テキストエリアに上記の16進数をコピペする。そのあと『ディスプレイ』ボタンを押してから『実行』ボタンを押すと画面を塗りつぶしてく様子が見れる。下記にスクリーンショット(bochsでの実行結果)を載せる