Разные результаты, когда я помещаю идентичный код в функцию, а не пишу ее в строке C - PullRequest
0 голосов
/ 04 ноября 2018

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

void kmain()
{
    char* _str = "hello"; // String to print off
    unsigned char strPtr = 0; // pointer to the first character in the string
    char* vidMemPointer = (char*) 0xb8000; //pointer to video memory
    unsigned short i = 0; // indexer for video memory.
    unsigned char l = 0;// length of string
    while (_str[++l]); // count the length of the string
    while (strPtr < l) // continue until all chars have been printed
    {
        vidMemPointer[i] = _str[strPtr]; // put char in video memory
        vidMemPointer[i + 1] = 0x0f; // color of char is white
        i += 2; // increase video memory indexer by 2 to go to next block
        ++strPtr;
    }
    return;
}

Для начала я просто хочу сделать функцию для подсчета длины строки. Я создал следующую функцию:

unsigned char len(char* ch)

{
    unsigned char l = 0;
    while(ch[++l]);
    return l;
}

Затем основная функция изменяется на:

void kmain()
{
    char* _str = "hello"; // String to print off
    unsigned char strPtr = 0; // pointer to the first character in the string
    char* vidMemPointer = (char*) 0xb8000; //pointer to video memory
    unsigned short i = 0; // indexer for video memory.
    unsigned char l = len(_str);// length of string
    while (strPtr < l) // continue until all chars have been printed
    {
        vidMemPointer[i] = _str[strPtr]; // put char in video memory
        vidMemPointer[i + 1] = 0x0f; // color of char is white
        i += 2; // increase video memory indexer by 2 to go to next block
        ++strPtr;
    }
    return;
}

для использования функции len. При попытке запустить этот код в QEMU текст QEMU по умолчанию постоянно мигает от видимого до нуля, пока процесс не будет остановлен, а текст, который я пытался распечатать, никогда не появится. Я не понимаю, как это могло иметь какое-то значение. Я действительно ценю любую помощь. Большое спасибо.

Редактировать: в настоящее время у меня есть скрипт, который компилирует его в объектный код, затем связывает код сборки, который я написал, а затем компилирует проект в один исполняемый файл. Ниже приведен мой bash-скрипт для сборки проекта:

rm -f *.o kernel
nasm -f elf32 kernel.asm -o asmkernel.o
gcc -m32 -c kernel.c -o ckernel.o
ld -m elf_i386 -T link.ld -o kernel asmkernel.o ckernel.o
qemu-system-i386 -kernel kernel

1 Ответ

0 голосов
/ 04 ноября 2018

Ничего себе после часов отладки я обнаружил, что это никак не связано с моим C-кодом. У меня была неправильная строка при объявлении моего стекового пространства в сборке, которая испортила код при попытке создать записи активации. Я ценю помощь.

...