使用BIOS中断0x13将驱动器扇区的内容存储到字符数组中时出现问题

时间:2016-11-01 00:22:56

标签: c x86 bios

我们正在使用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并将其写入缓冲区数组。我的教授看了几分钟,说看起来还不错,但不确定为什么它不起作用。明天会去看他进一步调查,但周三还有一些步骤,我正在努力想出这个问题。任何帮助将不胜感激

0 个答案:

没有答案