2016-09-23 9 views
0

エラー:関数で '_go':c.asm :(テキスト+ 0x6に):
ASM \ NASM -f: `k_main'
コンパイルに未定義参照elf -o co c.asm
bin \ ld -oformatbinary -Text 0x200000 -o bin \ kernel.bin bin \ video.o bin \ inter.o bin \ finter.o bin \ kernel.o -I "C :\ MinGWの\は、」-L "C:\ MinGWの\" libに
c.asm:リンクエラー(MinGWの)

section .text 
global _go 
extern k_main 
_go: 
    mov esp, 0x200000-4` 
    call k_main 


kernel.c

void k_main(){ 
    //iint(); 
    //initial(); 
    for(;;); 
} 


ヘルプください

+1

あなたの質問には関係ありません(私はIsmaelの回答は正しいと思います)。あなたのコードにはこの 'mov esp、0x200000-4'があります。私はあなたが最初のプッシュが0x200000に配置されないように4を引くと仮定しますか?もしそうなら、あなたは心配する必要はありません。何かがスタックにプッシュされると、_ES​​P_が最初に調整されます(通常は32ビット環境では** FIRST **が減算されます)。プッシュしたい値がその場所に格納されます。 'mov esp、0x200000'を使うと、最初のプッシュは0x1FFFFC、0x1FFFFD、0x1FFFFE、0x1FFFFFの値を格納します。 –

答えて

2

識別子の実際の符号化は、オブジェクト形式/プラットフォーム/コンパイラによって定義され、この場合、C関数は下線が接頭辞を取得するので、シンボル実際には_k_mainです。

マクロを使用して移植性を持たせたい場合や、Cのソースコードでそのシンボルを強制的に使用することができます。