使用 16 位模式在没有 bios 例程的情况下打印字母
Using 16 bit mode to print a letter WITHOUT bios routines
我意识到在保护模式下,可以使用内存映射 I/O 通过修改内存位置 0xb8000 等来打印字母...
我们可以在 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 $ 来防止任何随机代码执行并且代码按预期工作
它应该可以工作,有两个可能的失败原因:
- 如果您尚未处于文本模式,则 B800 段不用于在屏幕上呈现文本。 (现代 BIOS 很有可能)
- 如果您有单色屏幕,您的显卡可能决定使用 B000 而不是 B800。 (现代 BIOS 不太可能)。
原来我只需要最后的 jmp $ 来防止任何随机代码执行。代码按预期工作
我意识到在保护模式下,可以使用内存映射 I/O 通过修改内存位置 0xb8000 等来打印字母... 我们可以在 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 $ 来防止任何随机代码执行并且代码按预期工作
它应该可以工作,有两个可能的失败原因:
- 如果您尚未处于文本模式,则 B800 段不用于在屏幕上呈现文本。 (现代 BIOS 很有可能)
- 如果您有单色屏幕,您的显卡可能决定使用 B000 而不是 B800。 (现代 BIOS 不太可能)。
原来我只需要最后的 jmp $ 来防止任何随机代码执行。代码按预期工作