我正在为x86架构编写一个bootloader。到目前为止,我只是使用16位,并使用BIOS调用显示字符,读取磁盘等,但现在我想进入32位保护模式。
我决定不再使用BIOS功能了,因为它们只能用于16位。
因为我的引导加载程序将加载到内存中的0x7c00
(因为扇区以0xaa55
,和结束,因为我现在想要以32位工作,第一个我boot.asm
中的两行是:
[org 0x7c00]
[bits 32]
现在,根据我的理解,BIOS的文本视频内存从0xb8000
开始,所以要在屏幕左上角显示一个字符 - 比方说,黑色背景上的白色'A' - 我会这样做:
mov al, 'A'
mov ah, 0x0f ; white on black
mov [0xb8000], ax
将具有正确属性的字符移动到视频内存的开头。然后我在bochs中模拟了我的操作系统,但我的角色并不是我想要的。我看不到它。
然后我认为它可能与我的[org 0x7c00]
指令有关,根据我的理解,这取消了我使用的任何地址。因此,将ax
移至0xb8000
,而不是将其移至0xb8000 - 0x7c00 = 0xb0400
,这是有道理的。我用以下代码替换了代码:
mov al, 'A'
mov ah, 0x0f
mov [0xb0400], ax
但这与上一次尝试有相同的问题(角色不在屏幕上,或者在正确的内存位置)。我想不出任何其他的尝试,在互联网上寻求任何帮助似乎没有任何用处。
为什么这不起作用?如何做我将角色A
移动到这个记忆区域,如果不是这样的话?