![](/img/trans.png)
[英]How to compile with Bruce's C Compiler to get asm file that runs on 8086 processors
[英]Inline Assembly in BCC (Bruce's C Compiler) - How to use C variables?
我正在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(;;);
}
當我用這個命令編譯它時...
bcc -W -0 -c test.c -o test.obj
......它正在發揮作用。 但是,當我試圖將它與...鏈接時
ld86 -d isimsiz.obj -o kernel.bin
...它給了我這個錯誤:
undefined symbol: c
為什么會這樣? 如何在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
}
您可能還想檢查是否定義了__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中內聯匯編的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.