当我将相同的代码放在一个函数中与将它内联写入 C 中时,结果不同
Different results when I put identical code in a function vs writing it inline C
我正在用 C 语言开发一个简单的 OS 并使用 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;
}
然后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 = 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 代码完全无关。在程序集中声明我的堆栈 space 时,我有一条错误的行,在尝试创建激活记录时弄乱了代码。感谢您的帮助。
我正在用 C 语言开发一个简单的 OS 并使用 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;
}
然后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 = 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 代码完全无关。在程序集中声明我的堆栈 space 时,我有一条错误的行,在尝试创建激活记录时弄乱了代码。感谢您的帮助。