[问题] 中断与C语言的问题

楼主: thisisaname (这是一个名字)   2016-03-24 15:48:55
大家好:
手机排板请见谅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()这行拿到也就是不允许中断下,一切就会运作得非常正常

Links booklink

Contact Us: admin [ a t ] ucptt.com