2011-08-15 54 views
0

要嘗試使用C顯示圖形,我試圖利用C的「內聯彙編」功能。我在編譯過程中沒有錯誤,但是當我嘗試運行該程序,我得到這個錯誤:分割錯誤:11運行C程序時

Segmentation Fault: 11

這裏是我的代碼:

int main(){ 
asm("movb 0xc,%ah"); 
asm("movb $1,%al"); 
asm("movw $5,%cx"); 
asm("movw $5,%dx"); 
asm("int $0xc"); 
return 0; 
} 

讚賞建設性的批評,辱罵不是。 謝謝!

+1

那麼,哪條線導致seg-fault? –

+2

哪個操作系統? – Vlad

+0

1)你應該把這些語句合併成一個單獨的asm(「... \ n \ t ....」)2)更重要的是:我知道沒有任何操作系統可以工作(這甚至假設你的意思是' int $ 0x10')。 – user786653

回答

2

首先,它看起來像你試圖使用BIOS中斷來做圖形,但圖形中斷是int 10h (0x10),而不是0xc,所以你想調用int $ 0x10。其次,你不能在32位或64位Linux或Windows程序中調用大多數BIOS中斷,因此請確保你正在爲DOS編譯這個中斷。否則,在BIOS中斷中調用調用中斷操作碼會導致程序崩潰。如果你運行一個更新版本的Windows,你可能仍然需要在DOSBox等仿真器中運行你的編譯好的程序,才能正常工作。

最後,GCC內聯彙編有一定的格式,它:

__asm__ __volatile__ ( 
     assembler template 
     : output operands     /* optional */ 
     : input operands     /* optional */ 
     : list of clobbered registers  /* optional */ 
     ); 

因此,例如:

int main() 
{ 
    /* Set video mode: */ 
    __asm__ __volatile__ (
    "movb $0x0, %%ah \n\ 
    movb $0x13, %%al \n\ 
    int $0x10" 
    : 
    : 
    :"ax" 
); 

    /* Draw pixel of color 1 at 5,5: */ 
    __asm__ __volatile__ (
    "movb $0xC,%%ah \n\ 
    movb $1, %%al \n\ 
    movw $5, %%cx \n\ 
    movw $5, %%dx \n\ 
    int $0x10" 
    : 
    : 
    :"ax","cx","dx" 
); 

    /* Reset video mode: */ 
    __asm__ __volatile__ (
    "movb $0x0, %%ah \n\ 
    movb $0x03, %%al \n\ 
    int $0x10" 
    : 
    : 
    :"ax" 
); 

    return 0; 
} 

但可選字段是唯一真正有用的,如果你正在寫的彙編函數語言並希望傳入來自C代碼的參數。

此外,我沒有DJGPP和DOS安裝方便,所以我不能測試任何代碼,以確保它與它生成的32位保護模式二進制文件一起工作,但希望我已經命中指甲足夠靠近頭部,你可以自己處理其餘的部分。祝你好運!

+0

嗨,詹姆斯,你的繪製像素的代碼對我來說是非常有用的,你知道獲取像素顏色的代碼是怎麼樣的嗎? –

+0

在如此低的水平下,像素格式和偏移量計算將由所使用的視頻模式定義。 VGA模式13h(從我的例子)是一個索引顏色模式,所以你必須從視頻內存中實際複製像素數據,並將這些值與調色板條目進行比較以獲得實際的顏色數據。您可以在這裏閱讀更多關於VGA圖形編程的內容:http://www.brackeen.com/vga/ –