大家好:
手機排板請見諒OTZ
我最近自己開始學習自己刻一個作業系統可是在螢幕顯示方面遇到了一個難以解決的問題。
以下是一段在main.c裡的程式碼(main.c之前是一些組合語言 開啟a20, 保護模式, get之類的)
In main.c:
…(省略)
initVga();
initPIC();
ioSTI();
vgaClearScreen(0x0);
…(省略)
出問題的是在vgaClearScreen()這個函數裡:
void vgaClearScreen(char color_code)
{
unsigned short i;
for(i=0;i<=0xf9ff;i++)
{
video_mode_info->vram[i]=color_code;
//video_mode_info->vram=0x000a0000
}
return;
}
vgaClearScreen()編譯成組合語言後(compiled by cygwin):
;0x000107c4:
mov eax, dword ptr ds:0x00012808
; ds:0x00012808->儲存視訊記憶資料struct的 位置(=0x00010130)
mov edx, dword ptr ds:[eax+16]
; edx->視訊記憶體位置0x000a0000(320*200彩色模式)
movzx eax, word ptr ss:[ebp-2]
; ss:[ebp-2]-> unsigned short i
add edx, eax
; 0x000a0000+i
movzx eax, byte ptr ss:[ebp-20]
mov byte ptr ds:[edx], al
; al-> char color_code
movzx eax, word ptr ss:[ebp-2]
add eax, 0x00000001
; i++
mov word ptr ss:[ebp-2], ax
cmp word ptr ss:[ebp-2], 0xf9ff
jbe .-39
; if(i<=0xf9ff) {goto 0x000107c4;}
問題來了:
在Bochs的debug模式中,只要跑到i=0x48af的地方,整個程式跑到"jbe .-39"這句的時候,
一執行下去就會跳出Division by zero的錯誤 由於我還沒設定IDT所以自然的緊接著又跳出
0x0d錯誤,接著triple fault模擬器暫停
被這個bug困擾好久,拜託各位幫幫我QQ
附上word檔,內有這個問題的易讀彩色版和bochs印出的報告
https://goo.gl/J967bJ
謝謝各位
補充一下:
如果把inSTI()這行拿到也就是不允許中斷下,一切就會運作得非常正常