2017-05-13 20 views
0

부트 로더를 작성하고 NASM 어셈블러 (AS86이 아님)를 사용하여 컴파일하면 모든 것이 완벽하게 작동합니다.NASM, BCC 및 Ld86을 리얼 모드로 결합 : 잘못된 마법 번호

이제 응용 프로그램에 16 비트 C 코드를 삽입하는 방법을 배우고 싶습니다. 나는 8034 프로세서를 지원한다는 사실 때문에 bcc이 그러한 상황에 권장되는 몇 가지 SO에서 읽었다. 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(); 
} 

메이크 :

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, bccld86을 함께 결합하는 방법을 알고 있습니다.

답변

3

새로 도착한 사람들에게 문제가 발생했습니다. NASM의 출력 형식은 LD86과 호환되도록 AS86이어야합니다. 그래서,

ASFLAGS=-f aout 

는 또한

ASFLAGS=-f as86 

로 대체해야 코드는 또 다른 문제가있다 : testasm.asmfoo_foo로 대체해야하지만 왜 나 한테 물어하지 않습니다!

+1

ELF 개체 형식이 도입되기 전에 C 프로그래밍 언어의 기호 앞에 밑줄이 붙어서 레지스터 이름과 로컬 레이블과 구별됩니다. ELF를 채택한 적이 없기 때문에 이것은 여전히 ​​하나의 Windows로 수행됩니다. – fuz

+0

정보 주셔서 감사합니다 @fuz –