2017-12-27 256 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

我是一個初學者,我覺得這很混亂!你能告訴我應該提供什麼額外的信息嗎?另外,我不明白我正面臨的字符串索引問題。 –