2014-12-02 3 views
1

В настоящее время я работаю над самодельным проектом ОС. Я успешно написал загрузчик, который переключает компьютер в защищенный режим и загружает ядро, которое написано в c. Мое ядро ​​загружается нормально, но у меня проблема с функциями вызова вне main(). Кажется, что функция выполнена нормально, но из того, что я могу сказать, ни один из аргументов не передается. Я не могу понять, почему это так, и надеюсь, что кто-то здесь скажет мне, в чем моя проблема. Ниже приведен код для моего ядра, а также команды, используемые для его компиляции.Аргументы не передаются функции в c Ядро

EDIT: Перечитав мой вопрос, я думаю, мне нужно уточнить, что я имею в виду, когда говорю, что аргументы не передаются. Когда я вызываю print_char, независимо от того, какие значения передаются в качестве аргументов, это не имеет никакого эффекта. Однако, если я изменяю переменные внутри функции, она отлично работает.

kernel.c

#define VIDEO_ADDRESS 0xb8000 
#define WHITE_BLACK 0x0f 

void print_char(char character, int col, int row, char att_byte) { 
    unsigned char* vid_mem = (unsigned char*) VIDEO_ADDRESS; 
    int offset; 

    if (!att_byte) { 
     att_byte = WHITE_BLACK; 
    } 

    offset += 2*col; 
    offset += 80*row; 

    vid_mem[offset] = character; 
    vid_mem[offset+1] = att_byte; 
} 

void start() { 
    clear_screen(); 
    print_char('X', 0, 0, WHITE_BLACK); 
} 

build.bat

nasm boot.asm -f bin -o boot.bin 
nasm kernel_entry.asm -f elf -o kernel_entry.o 
gcc -ffreestanding -c kernel.c -o kernel.o 

ld -T NUL -o kernel.tmp -Ttext 0x1000 kernel_entry.o kernel.o 

objcopy -O binary -j .text kernel.tmp kernel.bin 

type boot.bin kernel.bin > OS.bin 

qemu-system-i386 OS.bin 
+0

Пожалуйста, разместите вывод своего скрипта 'build.bat' –

+0

Каково значение макроса' WHITE_BLACK'? Почему вы говорите, что никакие аргументы не должны проходить? –

+0

Возможно, вывод 'build.bat' уже говорит вам, что' offset' был неинициализирован. –

ответ

0

После долгих исследований и возня с gcc и ld в течение нескольких часов, я я решил свою проблему.

Я строй kernel.c, используя следующие команды:

gcc -Wall -pedantic-errors -nostdlib kernel.c -o kernel.exe 

ld -nostdlib -Ttext 0x1000 -o kernel.tmp kernel_entry.o kernel.exe 
objcopy -O binary -j .text kernel.tmp kernel.bin 

Я не совсем уверен, почему это работает, и мои предыдущие попытки не сделали, но сейчас все работает как надо. Спасибо за всю полученную помощь.

3

Вы не инициализировать переменную:

int offset = 0; 

Обратите внимание, что первое использование смещение было это:

offset += 2*col; 

, что означает, что либо вы должны быть инициализированы offset 0, или вы должны изменить эту строку на это:

offset = 2*col; 
+2

Вы должны были скомпилировать с помощью 'gcc -ffreestanding -Wall -Wextra -c -O1 kernel.c', и вы были бы предупреждены по 'gcc' –

+0

смещение переменной определяется при начале print_char(), хотя я не сразу присваиваю ему значение. @Basile Starynkevitch Я попробовал компиляцию с вашим предложением, и я получил предупреждение от gcc. Спасибо, но это не решает мою проблему. – Logan

+0

Это может не решить все ваши проблемы, но это должно по крайней мере решить одну проблему. Вам нужно инициализировать 'offset' до 0, потому что первое, что вы делаете с ним, это' offset + = 2 * col', что означает, что вы используете неинициализированное значение. 'offset' может быть что-то в этом пункте, но, вероятно, не то, что вы ожидали. – JS1

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