簡體   English   中英

BCC中的內聯匯編(Bruce的C編譯器) - 如何使用C變量?

[英]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有一個很好的教程,請留下鏈接。 我在互聯網上找不到它:(

提前致謝。

PS:以下是相應編譯器BCC鏈接器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中內聯匯編的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM