2017-05-13 3 views
0

Ich schrieb einen Bootloader und kompilierte es mit NASM Assembler (nicht AS86), alles funktionierte perfekt.Kombinieren NASM, BCC und Ld86 im Real-Modus: hat schlechte magische Nummer

Nun möchte ich lernen, wie 16-Bit C Code in meine Anwendung einfügen. Ich lese von mehreren SOs, dass bcc für solche Situationen aufgrund der Tatsache empfohlen wird, dass es 8086-Prozessoren unterstützt.

Während meines Code mit einem C Testcode kombiniert konfrontiert ich folgende Fehlermeldung: ld86: testasm.o has bad magic number

ich meinen Code auf das folgende reduziert:

testasm.asm:

[bits 16] 
global foo 

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

testc.c:

extern void foo(); 

main() { 
    foo(); 
} 

und die 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 

und ich habe immer noch das Problem. Jeder weiß, wie man NASM, und ld86 zusammen kombiniert.

Antwort

3

Für Neulinge erkannte ich das Problem. Das Ausgabeformat von NASM sollte AS86 sein, um mit LD86 kompatibel zu sein. So

ASFLAGS=-f aout 

sollte mit

ASFLAGS=-f as86 

Zusätzlich ersetzt werden, haben Sie den Code ein anderes Problem: foo in testasm.asm mit _foo ersetzt werden sollte, aber fragen Sie mich nicht warum!

+1

Vor der Einführung des ELF-Objektformats wurde Symbolen aus der C-Programmiersprache ein Unterstrich vorangestellt, um sie von Registernamen und lokalen Bezeichnungen zu unterscheiden. Dies ist immer noch ein Windows, da sie ELF nie angepasst haben. – fuz

+0

Danke für die Information @fuz –