首先,它看起來像你試圖使用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位保護模式二進制文件一起工作,但希望我已經命中指甲足夠靠近頭部,你可以自己處理其餘的部分。祝你好運!
那麼,哪條線導致seg-fault? –
哪個操作系統? – Vlad
1)你應該把這些語句合併成一個單獨的asm(「... \ n \ t ....」)2)更重要的是:我知道沒有任何操作系統可以工作(這甚至假設你的意思是' int $ 0x10')。 – user786653