2017-05-13 13 views
0

私はブートローダを書いてNASMアセンブラ(AS86ではない)を使ってコンパイルしました。リアルモードでNASM、BCC、Ld86を組み合わせる:悪いマジックナンバー

ここで、私のアプリケーションに16ビットのCコードを挿入する方法を学びたいと思います。私はいくつかのSOから、bccが8086プロセッサをサポートしているという事実のためにこのような状況にお勧めしていると読んでいます。 ld86: testasm.o has bad magic number

私は次の私のコードを削減:

testasm.asm

[bits 16] 
global foo 

foo: 
    mov ax, 0x0e41 
    int 0x10 
    jmp $ 

Cテストコードと私のコードを組み合わせた時に

は、私は次のようなエラーに直面しましたtestc.c

extern void foo(); 

main() { 
    foo(); 
} 

Makefileの

CFLAGS=-0 -c 
LDFLAGS=-T 0x7C00 -0 
ASFLAGS=-f aout 

all: testc.bin 

testc.bin: testasm.o testc.o 
    ld86 -o [email protected] $^ $(LDFLAGS) 

testc.o: testc.c 
    bcc -o [email protected] $^ $(CFLAGS) 

testasm.o: testasm.asm 
    nasm -o [email protected] $^ $(ASFLAGS) 

clean: 
    rm -f *.o testc.bin 

と、私はまだ問題を抱えています。いずれも、NASM,bccおよびld86をどのように組み合わせるかを知っています。

答えて

3

新しいコーナーでは、問題が検出されました。 LD86と互換性を持たせるには、NASMの出力形式をAS86にする必要があります。 ので、

ASFLAGS=-f aout 

はまた

ASFLAGS=-f as86 

に置き換える必要があり、コードは別の問題を抱えている:testasm.asmfoo_fooに置き換える必要がありますが、なぜ私に聞かないでください!

+1

ELFオブジェクト形式が導入される前は、Cプログラミング言語のシンボルの先頭に、レジスタ名とローカルラベルと区別するためのアンダースコアが付いていました。これはまだELFに適合しないので、1つのWindowsで行われます。 – fuz

+0

情報ありがとうございました@fuz –