Assembly 汇编程序和C代码之间的链接错误(MinGW)

Assembly 汇编程序和C代码之间的链接错误(MinGW),assembly,linker,x86,mingw,Assembly,Linker,X86,Mingw,错误:在函数“_go”:c.asm:(.text+0x6):未定义对“k_main”的引用 编译: asm\nasm-f elf-o c.o c.asm bin\ld-oformatbinary-Ttext 0x200000-o bin\kernel.bin c.o bin\video.o bin\inter.o bin\finter.o bin\kernel.o-I“c:\MinGW\include”-L“c:\MinGW\lib” c、 asm: kernel.c Help ple

错误:在函数“_go”:c.asm:(.text+0x6):未定义对“k_main”的引用
编译:
asm\nasm-f elf-o c.o c.asm
bin\ld-oformatbinary-Ttext 0x200000-o bin\kernel.bin c.o bin\video.o bin\inter.o bin\finter.o bin\kernel.o-I“c:\MinGW\include”-L“c:\MinGW\lib”
c、 asm:


kernel.c



Help please

标识符的实际编码由对象格式/平台/编译器定义,在本例中,C函数的前缀是下划线,因此符号实际上是
\u k\u main


如果您想让宏便于移植,可以使用宏进行编码,也可以在C源代码中强制使用符号。

标识符的实际编码由对象格式/平台/编译器定义,在这种情况下,C函数的前缀是下划线,因此符号实际上是
\k\u main

如果你想让它便于携带,你可以使用宏来进行编码,或者你可以在C源代码中强制使用符号。

与你的问题无关(我相信Ismael的答案是正确的)这是你的代码中的
mov esp,0x200000-4
。我想你减去4,这样你的第一次推就不会被放在0x200000?如果是这样,你就不必担心了。当在堆栈上推送某个内容时,ESP会首先调整(在32位环境中,通常先减去4),然后要推送的值存储在该位置。如果您使用
mov esp,0x200000
第一次推送会将值存储在0x1FFFC、0x1FFFD、0x1FFFE和0x1FFFF。与您的问题无关(我相信Ismael的答案是正确的),这是代码中的
mov esp,0x200000-4
。我想你减去4,这样你的第一次推就不会被放在0x200000?如果是这样,你就不必担心了。当在堆栈上推送某个内容时,ESP会首先调整(在32位环境中,通常先减去4),然后要推送的值存储在该位置。如果使用
mov esp,0x200000
第一次推送将在0x1fffc、0x1fffd、0x1fffe和0x1ffff处存储值。
section .text
global _go
extern  k_main
_go:
    mov esp, 0x200000-4`
    call  k_main
void k_main(){
    //iint();
    //initial();
    for(;;);
}