自定义 x86 内核访问 char* 的 C 函数给出随机值

C function of custom x86 kernel accessing char* gives random value

我正在用 C 为 x86 编写自定义内核。每当我尝试从 char* 访问一个值时,我都会得到一个随机值。

void test(char input[]) {
    char* video_memory = (char*) 0xb8000;
    *video_memory = input[0];
}

void main() {
    test("ba");
}

这似乎我应该让 'b' 打印出来,但它给出了一些随机符号。

这个也一样

void test() {
    char* video_memory = (char*) 0xb8000;
    char* val = "ba";
    *video_memory =  val[0];
}

void main() {
    test();
}

但不是这个

void test() {
    char* video_memory = (char*) 0xb8000;
    *video_memory =  "ba"[0];
}

void main() {
    test();
}

最后一个效果很好。

我做错了什么?

编辑: 这是我设置堆栈的方式

[BITS 32]
init_pm:                       
    mov ax, DATA_SEG        
    mov ds, ax
    mov ss, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    mov ebp, 0x90000       
    mov esp, ebp               
    
    call BEGIN_PM

BEGIN_PM:
    call KERNEL_OFFSET    
    jmp $

已解决!问题根本与我的代码无关,而是我生成二进制文件的方式。

我原来的方法:

gcc -ffreestanding -c kernel.c kernel.o
nasm kernel_entry.ASM -f elf64 -o kernel_entry.o
ld -o kernel.bin -T linker.l kernel_entry.o kernel.o --oformat binary
nasm -f bin -o bootloader_s1.bin bootloader_s1.ASM
cat bootloader_s1.bin kernel.bin > os-image

我的新方法:

gcc -m32 -fno-pie -ffreestanding -c kernel.c kernel.o
nasm kernel_entry.ASM -f elf -o kernel_entry.o
ld -m elf_i386 -o kernel.bin -T linker.l kernel_entry.o kernel.o --oformat binary
nasm -f bin -o bootloader_s1.bin bootloader_s1.ASM
cat bootloader_s1.bin kernel.bin > os-image

我相信这是因为当我的代码被编译成 32 位 运行 时,我正在编译为 64 位。