【发布时间】:2019-06-03 17:11:02
【问题描述】:
我有这个代码:
char* vidmem = (char*)0xb8000;
int main()
{
vidmem[0] = 'x';
}
但这就像 vidmem 没有初始化一样。如果相反我做这样的事情:
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 文件,但这并不重要。我在 gcc 上做错了吗?我该如何解决?
【问题讨论】:
-
你为什么要问一个新问题? stackoverflow.com/questions/56430956/… 这个是一样的,没有正确的答案(即使你已经接受了一些解决方法),但是你有很多有价值的 cmets。原因可能在于您(缺少)用于复制数据段的启动代码。
-
@AjayBrahmakshatriya 这是一个问题的一半,但没有人回答正确的问题,所以我在这里问了第二个问题
-
这就是问题的问题 - 它不完整。所以你必须完成它而不是发布另一个。此外,如果您对答案不满意 - 不接受它