繁体   English   中英

将相同的代码放入函数中与将其内联 C 编写时的不同结果

[英]Different results when I put identical code in a function vs writing it inline C

我正在用 C 开发一个简单的操作系统并使用 QEMU 来测试它。 我正在尝试编写一些可以调用的函数,例如打印函数。 当我在 main 方法中编写代码时,一切正常,如下所示:

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

哇经过数小时的调试,我发现它与我的 C 代码完全无关。 在程序集中声明我的堆栈空间时,我有一个错误的行,它在尝试创建激活记录时弄乱了代码。 我很感激你的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM