我有这样的 asm 码。
format ELF
public _start
extrn _kernel_main
section ".text" executable
_start:
movzx edx, dl
push edx
push esi
push ebx
call _kernel_main
@@:
jmp @b
;section ".data" writable
和这样的ld脚本。
ENTRY(_start)
KERNEL_BASE = 0xFFC00000;
SECTIONS {
.text KERNEL_BASE : {
*(.text)
*(.code)
*(.rdata*)
}
.data ALIGN(0x1000) : {
*(.data)
}
.bss ALIGN(0x1000) : {
*(.bss)
}
.empty ALIGN(0x1000) - 1 : {
BYTE(0)
}
}
这段C代码可以正常工作
void kernel_main() {
char *screen_buffer = (void*)0xB8000;
char msg[] = "Hello, World!";
unsigned int i = 24 * 80;
screen_buffer[i * 2] = *msg;
int j = 0;
while (msg[j] != '\0') {
screen_buffer[i * 2] = *(msg + j);
j++;
i++;
}
}
但如果我尝试使用这个代码:
void kernel_main() {
char *screen_buffer = (void*)0xB8000;
char *msg = "Hello world!";
unsigned int i = 24 * 80;
while (*msg) {
screen_buffer[i * 2] = *msg;
msg++;
i++;
}
}
它就停止了正确的执行并且不显示任何字符.
c代码也是一样的。
我看不出这两段代码有什么不同。char msg[] = "你好,世界!"。 和 char *msg = "你好,世界!"。谁能告诉我,我哪里错了。
我只是跳过了 -c 编译器选项。
gcc src\kernel.c -o bin\main.o -c
-c编译和组装,但不链接。