起動するまでの長い道のり IPL編(2) 文字表示の巻

 前回でとりあえず起動するまではできた。だが、前回のコードでは、プログラムの部分が無限ループするだけで何もしない。せめて起動したというメッセージくらいは表示させて、俺はマジで本当に起動したのだということを主張させたい。そのためには、恐怖のアセンブラ(くどい)で処理を書き足さなければならない。

とりあえずソース

 ipl.sを書き直す。

# 前略

    # boot begin
begin:

    # deny interrupt
    cli
    
    # setup registers
    cld
    xorw    %ax, %ax
    movw    %ax, %ss
    movw    %ax, %es
    movw    %ax, %fs
    
    # setup stack pointer
    movw    $0x7c00, %ax
    movw    %ax, %sp

    # setup code segment
    ljmp    $0x7c0, $set_cs
set_cs:
    movw    %cs, %ax
    movw    %ax, %ds

    # show message
    movw    $BOOT_MSG, %si
    call    print

    # infinite loop
end:
    jmp end

# print string
#   params:
#       si = string address
print:
    xorw    %bx, %bx
    movb    $0x0e, %ah
print_char:
    lodsb
    orb     %al, %al
    jz      print_end
    int     $0x10
    jmp     print_char
print_end:
    ret

BOOT_MSG: .string "Hello,World!\r\n"

# 後略

 変わっていない部分は省略した。

実行してみる

 ソースさえ書けばこっちのもんだ! と思って実行してみる。

$ as -o ipl.o ipl.s
$ objcopy -S -O binary ipl.o ipl.bin
$ dd if=/dev/zero of=fd.img count=2880
$ dd if=ipl.bin of=fd.img conv=notrunc
$ ./qemu/qemu.exe -L ./qemu -m 128 -fda fd.img

 qemuの画面の最終行に「Hello,World!」と出れば成功だ。これにより、俺はマジで本当に起動したのだということが主張された。