编写一个bootsector - INT16h后的粉红色方块

时间:2014-06-14 14:59:07

标签: assembly bios

我在x86程序集中编写了我自己的,非常简单的bootsector(在windows下使用nasm编译)。它的任务是在屏幕上显示一条消息,读取一个字符,打印“OK”,然后无休止地循环。

以下是代码:

mov ah, 0x0e ; int 10/ah = 0eh -> scrolling teletype BIOS routine
mov al, 'P'
int 0x10
mov al, 'l'
int 0x10
mov al, 'e'
int 0x10
mov al, 'a'
int 0x10
mov al, 's'
int 0x10
mov al, 'e'
int 0x10
mov al, ' '
int 0x10
mov al, 'e'
int 0x10
mov al, 'n'
int 0x10
mov al, 't'
int 0x10
mov al, 'e'
int 0x10
mov al, 'r'
int 0x10
mov al, ' '
int 0x10
mov al, 'a'
int 0x10
mov al, ' '
int 0x10
mov al, 'c'
int 0x10
mov al, 'h'
int 0x10
mov al, 'a'
int 0x10
mov al, 'r'
int 0x10
;newline
mov al, 0x0D
int 0x10
mov al, 0x0A
int 0x10

mov ah, 00h
int 16h
;block until a key is pressed

mov ah, 0x0e
;newline
mov al, 0x0D
int 0x10
mov al, 0x0A
int 0x10
mov al, 'O'
int 0x10
mov al, 'K'
int 0x10

times 510 -( $ - $$ ) db 0 ; Pad the boot sector out with zeros
dw 0xaa55 ; Last two bytes form the magic number ,
; so BIOS knows we are a boot sector.

这样可以正常工作,但是在显示“确定”后大约3秒钟,屏幕上覆盖着奇怪的粉红色方块。 (图片来源:http://i.imgur.com/gewJRuP.jpg)。

显然这是由INT16例程引起的,因为我以前的测试只打印了一些文本并没有导致这种情况。

可能是什么原因?

1 个答案:

答案 0 :(得分:2)

这将运行垃圾,因为打印出来之后OK你会遇到未初始化内存的无尽境界。尝试在times 510 -( $ - $$ ) db 0

之前添加此内容
hang:
   jmp hang

或者:

cli
hlt

停止发生中断然后等待中断,有效地挂断机器。