我目前正在为我的操作系统编写一个32位内核,但我偶然发现了一个问题。
尝试使用here中的方法清除屏幕时,bochs崩溃并显示以下消息:
[CPU]预取:getHostMemAddr否决直接读取,pAddr = 0xa0000
clear_screen32方法(在保护模式下运行):
;================================;
; Clears the screen (in 32 bits) ;
;================================;
clear_screen32:
pusha
cld
mov edi, vmem
mov cx, 2000
mov ah, c_attrib
mov al, ' '
rep stosw
mov byte [_xpos], 0
mov byte [_ypos], 0
popa
ret
这里可能有什么问题?
编辑:我输入错误,是getHostMemAddr而不是getHostByAddr
* EDIT2:错误发生在*
rep stosw
如果我删除它,代码运行正常(但当然没有屏幕清除)
答案 0 :(得分:-1)
Welp,似乎bochs开发人员(或者我可能)有点愚蠢,因为在bochs中不存在CX寄存器。
当我在调试时将注册信息转储到屏幕时,我发现了。 CX寄存器根本就不存在。
我的解决方案?由于处于32位模式,并且可以访问32位寄存器,我只需将CX寄存器替换为ECX,这样就可以正常工作,屏幕也能完全清除。