我们正在使用bcc和一些教授编写的模拟器软件在C语言的操作系统类中编写内核。我坚持的当前步骤是使用0x13 BIOS中断从软盘读取扇区,将其存储在字符数组中,然后将其打印到屏幕上。完成kernel.c后,我们将其构建到floppy.img文件中。然后我们将.txt文件加载到我们正在读取的软盘的扇区30中,这样我们就可以测试我们的readSector函数是否正常工作。最后,我们在模拟器中运行floppy.img文件,该模拟器将模拟操作系统
int main(){
void printString(char*);
void readString(char*);
void readSector(char*, int);
int mod(int, int);//Modulus Function
int div(int, int);//Divison Function
char buffer[512];
readSector(buffer,30);
printString(buffer);
while(1);
}
printString函数工作正常,我一直用它来进行调试
void printString(char* chars){
int i;
for(i = 0; chars[i] != '\0'; i++){
interrupt(0x10, 0xe*256+chars[i], 0, 0, 0);
}
}//printString
我们并没有真正给出0x13中断的明确构造函数,我认为这是正确的顺序,但我不是100%。当我运行模拟器时,它会打印“被调用的中断0x13”,但在此之后不打印任何内容,因为它应该从main打印缓冲区的内容。
void readSector(char* buffer, int sector){
int relativeSector = mod(sector,18)+1; //sector%18
int head = mod(div(sector,18),2); //(sector/18)%2
int track = div(sector,36); //sector/36
interrupt(0x13, 2, 1, buffer, track, relativeSector, head, 0); //0x13, AH, AL, BX, CH, CL, DH, DL
printString("Called interrupt 0x13\0");
}
由于bcc不包含mod / div,我根据一些给定的伪代码
制作了这些int mod(int a, int b){//a == modulend, b == modulosor
while(a > b){
a =a-b;
}
return a;
}//mod
int div(int a, int b){//a == dividend, b == divisor, q == quotient
int q = 0;
while((q*b) <= a){
q++;
}
return q-1;
}//div
我不是100%确定0x13中断是如何工作的,我假设它会读取扇区30并将其写入缓冲区数组。我的教授看了几分钟,说看起来还不错,但不确定为什么它不起作用。明天会去看他进一步调查,但周三还有一些步骤,我正在努力想出这个问题。任何帮助将不胜感激