Объединение 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
но не спрашивай меня почему!