x86汇编直接写入VGA简单操作系统

时间:2013-08-31 17:00:53

标签: assembly x86 bootloader

我制作了简单的代码,应该写入VGA内存。

org 07c00h
  mov eax,0xb8000
  mov bx,msg
  call printstr
printstr:


  mov al,byte[bx]
  mov byte[eax],al
  inc eax
  mov byte[eax],1
  inc eax
  inc bx
  cmp byte[bx],0
  je end
  jmp printstr

end:
  jmp end
msg: db "Hello world!",0
times 510-($-$$) db 0
dw 0xaa55

但不是写#34; Hello world"当我在QEMU中运行时,它会这样做。 我用NASM组装了这个。 Image

我想在第一行覆盖前12个字符" Hello world!"。

有人知道为什么它会给我这个结果吗?

1 个答案:

答案 0 :(得分:3)

  mov al,byte[bx]
  mov byte[eax],al

aleax的一部分,因此通过将一个字符读入al,您就会丢弃屏幕指针。

除此之外,您不应该在引导加载程序中使用分段寻址吗?像这样:

push 0xb800
pop es
xor di,di
cld
...
stosb ; [es:di] = al, di++