在实模式下结合NASM,BCC和Ld86:具有糟糕的幻数

时间:2017-05-13 08:42:54

标签: c assembly nasm real-mode bcc

我写了一个bootloader并使用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

我仍然有问题。任何人都知道如何将NASMbccld86组合在一起。

1 个答案:

答案 0 :(得分:3)

对于新来的人,我发现了问题。 NASM的输出格式应为AS86,以便与LD86兼容。 所以,

ASFLAGS=-f aout

应替换为

ASFLAGS=-f as86

此外,代码还有另一个问题: foo中的testasm.asm应该替换为_foo,但不要问我原因!