B. *_*aan 4 c assembly inline-assembly bcc-compiler
我正在Real Mode下编写一个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(;;);
}
Run Code Online (Sandbox Code Playgroud)
当我用这个命令编译它时...
bcc -W -0 -c test.c -o test.obj
Run Code Online (Sandbox Code Playgroud)
......它正在发挥作用.但是,当我试图将它与...链接时
ld86 -d isimsiz.obj -o kernel.bin
Run Code Online (Sandbox Code Playgroud)
...它给了我这个错误:
undefined symbol: c
Run Code Online (Sandbox Code Playgroud)
为什么会这样?如何在BCC在线组装下使用C变量?
如果你知道关于BCC的好教程,请留下链接.我在互联网上找不到它:(
提前致谢.
bcc不支持引用C变量.你需要在汇编中编写整个函数:
void putchar(c)
{
#asm
mov ah, 0x0e
mov bx, sp
mov al, [bx+2]
xor bx, bx
int 0x10
#endasm
}
Run Code Online (Sandbox Code Playgroud)
您可能还想检查是否__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
}
Run Code Online (Sandbox Code Playgroud)
请注意,在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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以查看dev86 libc以获取有关bcc中内联汇编的示例.