Встроенная сборка в 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.