2017-01-07 2 views
0

Я разрабатываю ядро ​​ОС. Перед печатью ASCII-символов на экране появляется проблема. Когда я пытаюсь напечатать символы на экране, общие символы ascii легко печатаются в белом цвете. Но когда я пытаюсь напечатать расширенные символы ASCII, такие как блоки, сигма и т. Д., Он печатает желтым цветом. Скорее эти символы печатаются с color's number - 1.Расширенные символы ASCII печатаются желтым вместо белого - OSDev

WHITE -> YELLOW 
YELLOW -> BRIGHT MAGENTA 
BRIGHT MAGENTA -> BRIGHT RED 
. 
. 
and so on 

Может кто-нибудь сказать, почему это происходит и помогло решить эту проблему?

Мой код такой -

putChar(0xdb,0,3,color(BLACK,BLACK)); 
putChar('A',2,3,color(WHITE,BLACK)); 

putChar(228,0,4,color(B_GREEN,BLUE)); 
putChar('A',2,4,color(B_GREEN,BLUE)); 

putChar(228,0,5,color(B_MAGENTA,BLUE)); 
putChar('A',2,5,color(B_MAGENTA,BLUE)); 

И выход -

The Output

Я мог бы использовать цвет + 1 код, но нет ничего выше белого. Как я могу напечатать их в белом?

EDIT - The putChar Код

void putChar(char character, short col, short row, unsigned char attr) { 
    volatile unsigned char* vid_mem = (unsigned char *) VIDEO_MEM; 
    int offset = (row*80 + col)*2; 
    vid_mem += offset; 
    if(!attr) { 
     attr = default_color; 
    } 
    *(unsigned short int *)vid_mem = (attr<<8)+character; 
} 
+0

Ну ... что в 'putChar()'? – duskwuff

+0

@duskwuff Я добавил код –

+0

Это просто расширение знака - либо сделайте 'character'' unsigned char', либо замаскируйте старшие биты, прежде чем добавить его в 'attr << 8'. –

ответ

3

Скорее всего, проблема здесь:

(attr<<8)+character 

В x86 НКУ типа char подписан по умолчанию. Таким образом, когда вы передаете символы с кодами 0x80 ... 0xFF, они обрабатываются как подписанные, а знак расширения расширен до добавления. Итак, для тех персонажей вы эффективно получаете (attr<<8)+0xFFFFFF80 ... (attr<<8)+0xFFFFFFFF. И добавление 0xFF00 в (attr<<8) эффективно вычитает 1 из attr.

+0

Да, вот в чем проблема. Я исправил его, и теперь он работает. –

Смежные вопросы