向指针添加变量是不同的,然后添加常量

时间:2019-08-14 11:35:19

标签: c

因此,我对操作系统有了一些了解,并且按照here所述构建了引导加载程序和内核条目之后,我遇到了一些奇怪的行为。

考虑这段代码

#define VIDEO_ADDRESS 0xb8000
unsigned char* vidmem = (unsigned char*) VIDEO_ADDRESS;
int p = 0;

现在,如果我这样做

*(vidmem + 0) = 0x30;

它应该在左上角打印0,但是如果我这样做的话

*(vidmem + p) = 0x30;

将它打印在其他地方!

我尝试更改p的类型,看来使用int会导致0被打印在其他位置(看起来完全无关)。如果我使用unsigned的任何其他变体和任何其他类型(char,long,int,short),那么我需要设置p = 1以便将0打印在左上角角落(减去1吗?)。

我不明白这里发生了什么,将不胜感激。

这是完整的代码

//kernel.c
#define VIDEO_ADDRESS 0xb8000

int main() {
    unsigned char* vidmem = (unsigned char*) VIDEO_ADDRESS;
    int p = 0;
    *(vidmem + p) = 0x30;
}

这是我编译C文件的方式

gcc -ffreestanding -c screen.c -o screen.o

我正在使用qemu运行代码(不确定是否与此有关)

更新:

如果我改用GRUB,它会按预期工作。

1 个答案:

答案 0 :(得分:0)

这可能不是答案,但是我需要格式化代码。

要调试,请尝试:

#define VIDEO_ADDRESS 0xb8000

int main() {
    int p = 0;
    unsigned char* vidmem = (unsigned char*) VIDEO_ADDRESS + p;
    *vidmem = 0x30;
}

这可能证明Antti Haapala的怀疑。

我还恳求检查生成的汇编程序,如果您的平台上有调试器,则可以将其步进到调试器中并检查寄存器和内存位置。