【问题标题】:x86 assembly directly write to VGA simple OSx86 汇编直接写入 VGA 简单操作系统
【发布时间】:2013-08-31 17:00:52
【问题描述】:

我编写了简单的代码,应该写入 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 组装了它。 Image

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

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

【问题讨论】:

    标签: assembly x86 bootloader


    【解决方案1】:
      mov al,byte[bx]
      mov byte[eax],al
    

    aleax 的一部分,因此通过将字符读入al,您就是在浪费屏幕指针。

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

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

    【讨论】:

    • 谢谢。我没有使用分段寻址,因为我不熟悉它,我不确定我是否理解它。
    • 好吧,我从未编写过 x86 操作系统或引导加载程序,但我猜 CPU 以实模式启动,因此您 必须 使用分段在您切换到保护模式之前进行寻址。
    • 自 386 以来,即使在实模式下也可以使用 32 位寻址。不过,只会使用结果线性地址的前 20(或 21?)位。
    猜你喜欢
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    • 2013-05-22
    • 2018-11-16
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多