什么可以导致C变量在1上初始化?

时间:2016-06-18 16:19:40

标签: c gcc operating-system nasm

我正在制作一个基本的x86操作系统,其中一个小组使用C和NASM进行大学学习。我们必须使用VGA模式3制作一个简单的游戏来显示'图形'在80x50字符网格上。我们正在使用bochs来模拟操作系统。

前一段时间我们不得不制作一个程序,只要按下某个键,它就会显示在屏幕的右上角。老师给了我们一些与PIC交互的预制函数,并将键盘中断映射到IDT上的条目33。我们对实施没有任何问题。

现在,最近,我们为必要的键添加了功能,同时仍然在右上角显示按下的键。不同之处在于,现在,出于某种原因,无论何时释放密钥,或按下另一个密钥(即,您生成的扫描代码对于在游戏中执行某​​项操作的密钥而言都不是),将打印出一个笑脸。右上角。

这是键盘中断处理程序的代码:

global _isr33

_isr33:
pushad
    xor eax,eax
    in al, 0x60
    push eax
    call manejo_teclado
    pop eax
    call fin_intr_pic1
popad
iret

这是' manejo_teclado' (handle_keyboard):

char manejo_teclado(char scanCode){
    char valor;
    int player;
    direccion dir;

    if(scanCode == 0x2a){ 
        valor = '1';

    }
    if(scanCode == 0x36){
        valor = '2'; 

    }
    if(scanCode == 0x1f){
        valor = 's'; 
        dir = ABA;
        player = 0;
        game_mover_cursor(player,dir);

    }
    //1e (A), 1f (S), 20 
    if(scanCode == 0x1e){
        valor = 'a';
        dir = IZQ;
        player = 0;
        game_mover_cursor(player,dir);

    }
    if(scanCode == 0x20){
        valor = 'd';
        dir = DER;
        player = 0;
        game_mover_cursor(player,dir);

    }
    if(scanCode == 0x11){
        valor = 'w';
        dir = ARB;
        player = 0;
        game_mover_cursor(player,dir);

    }
    //24 (J), 25 (K), 26 (L)
    if(scanCode ==0x17 ){
        valor = 'i';
        dir = ARB;
        player = 1;
        game_mover_cursor(player,dir);

    }
    if(scanCode == 0x24){
        valor = 'j';
        dir = IZQ;
        player = 1;
        game_mover_cursor(player,dir);

    }
    if(scanCode == 0x25){
        valor ='k' ;
        dir = ABA;
        player = 1;
        game_mover_cursor(player,dir);

    }
    if(scanCode == 0x26 ){
        valor = 'l';
        dir = DER;
        player = 1;
        game_mover_cursor(player,dir);          
    }
    if(scanCode == 0x15){
        //modo debug
        valor = 'y';
        //lanzar_modo_debug();
    }

    print_char(valor, 79, 0, (unsigned short)0x0E);
    return valor;
}

' print_char' (VIDEO_SCREEN是0xB8000,' ca'是一个结构,它包含字符的字节和用于格式化的字节)

void print_char(char  text, unsigned int x, unsigned int y, unsigned short attr) {
    ca (*p)[VIDEO_COLS] = (ca (*)[VIDEO_COLS]) VIDEO_SCREEN;
    p[y][x].c = (unsigned char) text;
    p[y][x].a = (unsigned char) attr; 
}

'勇敢'变量,也就是打印到屏幕上的变量,当scanCode不是已定义的变量之一时,它永远不会被初始化,但仍然正在使用值1(面部代码)初始化。

我已经改变了' manejo_teclado'函数,替换单个if-else if-else if- ..链的ifs链。这摆脱了笑脸。

面部也是一致的,它发生在我们编译的所有计算机上。我们没有制作makefile(教师为我们提供了一个),gcc版本是4.8.4。

所以对于这些问题:这是由编译过程引起的吗? gcc是否误解了函数的某些内容?我们是否遗漏了别的东西?

对于任何拼写错误和/或错误感到抱歉,这里是犯罪者的照片:

The perpetrator

0 个答案:

没有答案
相关问题