使用16位模式在没有BIOS例程的情况下打印字母

时间:2019-11-23 07:11:49

标签: assembly x86-16 bootloader osdev vga

我意识到在保护模式下,可以通过修改内存位置0xb8000等来使用内存映射的I / O打印字母。 我们可以在16位实模式下执行此操作吗? (使用细分访问位置,然后对其进行修改)

这是我的汇编代码...

[bits 16]
mov ax,0xb800
mov ds,ax    #This is the segment register that should hopefully give me 0xb8000
mov byte[ds:0x0000],'X'
mov byte[ds:0x0001],0x0f

times 510-($ -$$) db 0
dw 0xaa55

这是行不通的。

[编辑] 原来我需要在末尾使用jmp $来防止任何随机代码执行,并且代码按预期运行

2 个答案:

答案 0 :(得分:1)

原来,我只需要在末尾使用jmp $即可防止任何随机代码执行。代码按预期工作

答案 1 :(得分:0)

它应该可以工作,并且有两个可能的失败原因:

  • 如果您尚未处于文本模式,则B800段不会用于在屏幕上呈现文本。 (很有可能是现代BIOS)
  • 如果您具有单色屏幕,则您的图形卡可能会决定使用B000而不是B800。 (现代BIOS不太可能)。