マイペースなプログラミング日記

x86エミュレータやFPGA、WebGLにお熱なd-kamiがマイペースに書くブログ

アセンブラ短歌

前から興味があったアセンブラ短歌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での実行結果)を載せる