Объединение NASM, BCC и Ld86 в реальном режиме: имеет плохой магический номер

Я написал загрузчик и скомпилировал его, используя NASM ассемблер (не AS86) все работало отлично.

Теперь я хочу научиться вставлять 16-битные C код в моем приложении. Я прочитал от нескольких SO, что bcc рекомендуется для таких ситуаций в связи с тем, что он поддерживает 8086 процессоров.

Во время объединения моего кода с C В тестовом коде я столкнулся со следующей ошибкой: ld86: testasm.o has bad magic number

Я сократил свой код до следующего:

testasm.asm:

[bits 16]
global foo

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

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 $@ $^ $(LDFLAGS)

testc.o: testc.c
    bcc -o $@ $^ $(CFLAGS)

testasm.o: testasm.asm
    nasm -o $@ $^ $(ASFLAGS)

clean:
    rm -f *.o testc.bin

и у меня все еще есть проблема. Любой знает, как сочетать NASM, bcc а также ld86 все вместе.

1 ответ

Решение

Для новичков я обнаружил проблему. Выходной формат NASM должно быть AS86 для того, чтобы быть совместимым с LD86. Так,

ASFLAGS=-f aout

следует заменить на

ASFLAGS=-f as86

Кроме того, в коде есть еще одна проблема:foo в testasm.asm следует заменить на _foo но не спрашивай меня почему!

Другие вопросы по тегам