BIOS で Hello World!

bochsを使ってHello World! - ラシウラ
このエントリを参考に、これとはちょっと違う方法で BIOSHello World!を出力してみた。
アセンブラyasm、実行には Q.app(qemu) を使った。

org 0x7C00  ; start address for BIOS

start:
  ; get current cursor position
  mov ah, 0x03
  mov bh, 0
  int 0x10
  ; dh = y-coordinate, dl = x-coordinate

  ; print hello
  mov ah, 0x13
  mov al, 0x01
  mov bh, 0
  mov bl, 0x07  ; set color white
  mov cx, msgend-msg  ; sizeof(msg)
  mov bp, msg
  int 0x10

end: 
 jmp  end

msg:
  db 'Hello World!'
msgend:

padding:
  times 510-($-$$) db 0
  dw  0xAA55

BIOSコールについてはここが参考になる。
http://community.osdev.info/index.php?(AT)BIOS
http://hp.vector.co.jp/authors/VA003720/lpproj/int10h/int10h.htm
俺が知らなかった org や times, $, $$, db のドキュメント。
http://www.tortall.net/projects/yasm/manual/html/objfmt-bin.html
http://www.tortall.net/projects/yasm/manual/html/nasm-pseudop.html
http://www.tortall.net/projects/yasm/manual/html/nasm-expr.html

次にブートイメージの作成

% yasm -f bin -o hello.bin hello.s
% dd if=/dev/zero of=fd.img bs=512 count=2880
% dd if=hello.bin of=fd.img conv=notrunc

この後、Q.app で新しく仮想PCを作り、
Hardware -> Floppy でさっき作った fd.img を選び、Boot from を floppy にして起動。
Q.app のメッセージの次に正しく Hello World! が出力された。