2017-05-13 3 views
0

J'ai écrit un chargeur de démarrage et l'ai compilé en utilisant NASM assembleur (pas AS86), tout fonctionnait parfaitement.Combinaison de NASM, BCC et Ld86 en mode réel: a un mauvais nombre magique

Maintenant, je veux apprendre comment insérer le code C 16 bits dans mon application. J'ai lu de plusieurs SO que bcc est recommandé pour de telles situations en raison du fait qu'il prend en charge 8086 processeurs.

En combinant mon code avec un code de test C je faisais face à l'erreur suivante: ld86: testasm.o has bad magic number

Je réduit mon code à ce qui suit:

testasm.asm:

[bits 16] 
global foo 

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

testc.c:

extern void foo(); 

main() { 
    foo(); 
} 

et le 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 

et j'ai encore le problème. Tout le monde sait comment combiner NASM, bcc et ld86 tous ensemble.

Répondre

3

Pour les nouveaux arrivants, j'ai détecté le problème. Le format de sortie de NASM doit être AS86 afin d'être compatible avec LD86. Ainsi,

ASFLAGS=-f aout 

doit être remplacé par

ASFLAGS=-f as86 

En outre, le code a un autre problème: foo dans testasm.asm doit être remplacé par _foo mais ne me demandez pas pourquoi!

+1

Avant l'introduction du format d'objet ELF, les symboles du langage de programmation C étaient préfixés d'un trait de soulignement pour les distinguer des noms de registre et des étiquettes locales. C'est encore fait un Windows car ils n'ont jamais adapté ELF. – fuz

+0

Merci pour l'information @fuz –