我正在制作一个基本的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是否误解了函数的某些内容?我们是否遗漏了别的东西?
对于任何拼写错误和/或错误感到抱歉,这里是犯罪者的照片: