这是我的项目结构:
- "boot.asm" :进入 64 位模式,进行 CHS 读取并将"内核"加载到0x100000,然后 JMP 加载到0x100000
- "kernel.asm"
这是"kernel.asm":
[bits 64]
msg: db "K"
mov al, [msg]
mov ah, 3 ; cyan
mov word [0xb8000], ax
jmp $
当放入"boot.asm"中时,此代码有效。但只有在放入"kernel.asm"中时才会打印奇怪的字形或"S"......我不知道为什么。问题似乎出在"味精"声明上。例如,当我将" msg: db "K"替换为" msg equ "K" 时,它会打印出好的字符,我无法找出问题所在,您有什么建议吗?
干杯
你忘了跳过味精。除非程序执行 msg 跳转,否则 msg 将被解释为命令。请尝试以下代码:
[bits 64]
jmp start
msg: db "K"
start:
mov al, [msg]
mov ah, 3 ; cyan
mov word [0xb8000], ax
jmp $
已解决:解决方案只是将[org 0x100000]
放在kernel.asm中,以提及nasm将代码放在哪里,以确保所有内存访问都处于绝对寻址状态。