2017-12-27 270 views
1

我正在研究一个基本的内核。我跟随了一些在线课程,并开始从头开始写这个。但是,我在编写这个内核时看到了不寻常的行为。不寻常的内核行为

让我给出一个简单的背景。我正在编写内核,C和引导程序。源代码可用here

问题:

在打印为const char *,在一些垃圾值,而真正的串0的索引结果只从指数1。现在看到了,我决定坚持这个黑客和继续编码内核,希望稍后解决这个问题。

所以今天早上我正在写更新光标位置的例程。在打印例程中,我更新了代码,将光标位置作为偏移量与我以前使用的x-y坐标一起使用。令我惊讶的是,索引现在从2开始,而不是1.

我不知道哪里出错了。

/** print msg at (x,y) or cursor */ 
void print_at(const char* msg, int x, int y){ 
    unsigned char *video = (unsigned char *)VIDEO_ADDRESS; 
    unsigned int offset = 0, i = 1; // i=1? 
    // decide offset value 
    if(x>=0||y>=0){ 
    // get offset from coordinates 
    offset = get_offset(x,y); 
    }else{ 
    // get cursor 
    offset = get_cursor(); 
    i+=1; // i=2? 
    } 
    while(1){ 
     char c = msg[i]; 
     if(c==0){ 
      // end of string 
      break; 
     }else if(c=='\n'||(offset/(2*MAX_ROWS)==MAX_COLS)){ 
      // go to next line 
      offset = get_offset((offset/(2*MAX_COLS)),MAX_COLS-1); 
     }else{ 
      // print the character 
      video[offset] = c; 
      video[offset+1] = WHITE_ON_BLUE; 
     } 
     offset+=2;i++; 
    } 
    update_cursor(offset); 
} 

而且,在我get_offset(INT行,诠释山口)程序,代码异常行为。正常的抵消计算应该是(row*MAX_COLS+col)*2

然而,这会导致这样的事情: Screenshot-1

如果我做公式(row*MAX_COLS+col)*2+1,打印功能是否正常工作:Screenshot-2

我试图寻找到处问我的同事,但我无法得到任何帮助。我如何开始调试它?

+0

'我该如何开始调试?' - 尝试在左上角输出一个字符,因此您将得到该位置的偏移量。在右上角输出单个字符,记住这个偏移量。在第二行的开头输出单个字符。然后在GDB下运行你的代码并检查计算的'偏移量'是否与预期的一样。 – Tsyvarev

回答

0

offset/(2 * MAX_COLS)计算在整数算术。除非正数offset大于或等于2 * MAX_COLS,否则表达式的值将为零。

(row * MAX_COLS + col) * 2 + 1是一个更好的方式来写这个,因为它避免了分割,虽然这可能容易受到int溢出。

+0

我不明白!为了计算(行,列)位置的偏移量,公式不应该是'(row * MAX_COLS + col)* 2'? –

+0

@ShubhamSharma:你告诉我! (这将取决于你如何根据你的来源,你不提供这些细节)。尽管您的主要问题是不需要的余数截断。 – Bathsheba

+1

我是一个初学者,我觉得这很混乱!你能告诉我应该提供什么额外的信息吗?另外,我不明白我正面临的字符串索引问题。 –