次の 2 行のコードを使用すると、次のようになります。
cli ; stop all interrupts
hlt ; halt the cpu
x86 pc の起動可能なプログラムを停止できます。
BITS 16
start:
mov ax, 07C0h ; Set up 4K stack space after this bootloader
add ax, 288 ; (4096 + 512) / 16 bytes per paragraph
mov ss, ax
mov sp, 4096
mov ax, 07C0h ; Set data segment to where we're loaded
mov ds, ax
cld ; clear direction flag
mov si, text_string ; Put string position into SI
call print_string ; Call our string-printing routine
cli ; stop all interrupts
hlt ; halt the cpu
jmp $ ; Jump here - infinite loop!
text_string db 'Hello World!', 0
print_string: ; Routine: output string in SI to screen
mov ah, 0Eh ; int 10h 'print char' function
.repeat:
lodsb ; Get character from string
cmp al, 0
je .done ; If char is zero, end of string
int 10h ; Otherwise, print it
jmp .repeat
.done:
ret
times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s
dw 0xAA55 ; The standard PC boot signature
「prog.asm」として保存し、「nasm」を使用してブート セクターを作成します。
nasm -f bin -o boot.img prog.asm
これで、「qemu」を使用してテストできます。
qemu-system-i386 -drive file=boot.img,index=0,media=disk,format=raw -boot c -net none
注: 上記の 2 行を削除すると、仮想マシンが利用可能な最大の CPU サイクルを使用するようになります。
編集:「cld」命令を追加しました。Michael が述べたように、text_string が左から右に読み込まれるようにする必要がありました。