我正在实模式下编写 C 程序。程序会被加载到0x2000:0x0000地址并运行。 DS 寄存器等于 CS ,即 0x2000 。我也在用 bochs 进行调试。

我的目标是在屏幕上打印一些文本。所以我需要内联汇编(对于 BIOS INT 10h )。

这是我的测试文件:

asm("jmp _main");

void putchar(c) char c;
{
    asm("mov ah, 0x0e");
    asm("mov al, c");
    asm("xor bx, bx");
    asm("int 0x10");
}

void main ()
{
    asm("push cs");
    asm("pop ds");
    putchar('A');
    for(;;);
}

当我用这个命令编译它时......
bcc -W -0 -c test.c -o test.obj

...它正在工作。但是当我试图将它与...
ld86 -d isimsiz.obj -o kernel.bin

...它给了我这个错误:
undefined symbol: c

为什么会这样?如何在 BCC 内联汇编下使用 C 变量?

如果您知道有关 BCC 的好教程,请留下链接。我在互联网上找不到它:(

提前致谢。

PS:这里分别是 compiler BCClinker LD86 的手册页。

最佳答案

bcc 不支持引用 C 变量。您需要在汇编中编写整个函数:

void putchar(c)
{
#asm
     mov ah, 0x0e
     mov bx, sp
     mov al, [bx+2]
     xor bx, bx
     int 0x10
#endasm
}

您可能还想检查 __FIRST_ARG_IN_AX__ 是否已定义:
void putchar(c)
{
#asm
     mov ah, 0x0e
#if !__FIST_ARG_IN_AX__
     mov bx, sp
     mov al, [bx+2]
#endif
     xor bx, bx
     int 0x10
#endasm
}

请注意,在 K&R 样式的函数中,函数参数的类型不能比 int 窄,因此虽然 void putchar(c) char c; 在语法上是正确的,但您不能这样做。顺便说一句,这就是 libc 函数 putchar 接受 int 类型参数的原因。

如果您确实需要使用变量,请考虑使用全局变量:
unsigned equipment;
int has_floppy() {
#asm
    int 0x11 ! get BIOS equipment list
    mov _equipment,ax
#endasm

    return (_equipment & 1);
}
}

您可以查看 dev86 libc 以获取有关 bcc 中内联汇编的示例。

关于c - BCC 中的内联汇编(Bruce 的 C 编译器) - 如何使用 C 变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39545132/

10-11 11:51