4

我做了简单的代码,应该写入 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

但是,当我在 QEMU 中运行它时,它不会写“Hello world”。我使用 NASM 组装了它。 图片

我想用“Hello world!”覆盖第一行的前 12 个字符。

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

4

1 回答 1

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

al是 的一部分eax,因此通过将字符读入al您的屏幕指针。

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

push 0xb800
pop es
xor di,di
cld
...
stosb ; [es:di] = al, di++
于 2013-08-31T18:44:03.337 回答