Встроенная сборка в BCC (компилятор C Брюса) - Как использовать переменные C?

Я пишу программу на 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

Почему это происходит? Как я могу использовать переменные C в BCC In-Line Assembly?

Если вы знаете хороший учебник о BCC, пожалуйста, оставьте ссылку. Я не смог найти его в интернете:(

Заранее спасибо.

PS: Вот справочные страницы соответствующего компилятора BCC и компоновщика LD86.

1 ответ

Решение

ОЦК не поддерживает обращение к переменным Си. Вам нужно написать всю функцию в сборке:

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.

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