Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在INT16h后编写引导扇区-粉红色方块_Assembly_Bios - Fatal编程技术网

Assembly 在INT16h后编写引导扇区-粉红色方块

Assembly 在INT16h后编写引导扇区-粉红色方块,assembly,bios,Assembly,Bios,我已经在x86汇编中编写了自己的极其简单的引导扇区(在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,

我已经在x86汇编中编写了自己的极其简单的引导扇区(在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.
这工作正常,但在显示“OK”约3秒钟后,屏幕上覆盖着奇怪的粉红色方块。(照片在这里:)

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


原因可能是什么?

这将运行垃圾,因为在打印出OK后,您将进入无限的未初始化内存领域。尝试在
乘以510-($-$$)db 0之前添加此项

hang:
   jmp hang
或:


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

哦,对了,我忘了jmp$。有趣的是,我不知道这样的事情会发生在一些随机的CPU指令中。在真实的CPU中,RAM可能(也将!)包含垃圾。:-)在QEMU中,这可能不会发生,您的QEMU-CPU将只是简单地停止。此外,不要假设在汇编中添加新指令(即int 16h)会导致新问题。有时情况并非如此(哦,天哪,我有多少次遇到了分区不匹配或诸如此类的情况!)。这就是为什么汇编很漂亮。我在我的一台旧机器上运行它,所以我确实在一个真正的CPU上;)
cli
hlt