我有这个密码:

char* vidmem = (char*)0xb8000;

int main()
{
    vidmem[0] = 'x';
}

但这就像维德曼没有被初始化一样。如果我做了这样的事:
char* vidmem;

int main()
{
    vidmem = (char*)0xb8000;

    vidmem[0] = 'x';
}

这很管用。为什么?
我用这几行代码来编译和链接:
gcc -c main.c -o main.o -ffreestanding -fno-exceptions -m64
gcc -m64 -Wl,--build-id=none -static -nostdlib -nodefaultlibs -lgcc main.obj [...] -T linker.ld -o out.bin

使用此链接器文件:
ENTRY(_start)

SECTIONS
{
    . = 0x7C00;

    .bss :
    {
        *(.bss);
    }

    .text :
    {
        *(.text);
    }
}

实际上有一些程序集代码调用这个C文件,但这无关紧要。我对海合会有什么不好吗?我怎样才能修好它?

最佳答案

您尚未将datarodata节放入链接器脚本中。检查main.o文件中的vidmem节,并确保在脚本中正确设置了该节。

10-08 04:57