2013-11-24 23 views
1

我正在使用某些彙編函數和16位C編譯器創建操作系統的工作。我的任務是使用0x10中斷在屏幕上打印字符串。由於中斷可以在彙編文件中調用,因此我提供了一個彙編文件,其中包含一個名爲interrupt的函數,其中包含五個參數:中斷號和在AXBXCXDX中傳遞的中斷參數。 例如,要打印 'Q' 與所提供的功能,我需要寫這樣的:如何使用BIOS中斷打印字符串

char al = 'Q' 
char ah = 0xE 
int ax = ah*256+al; 
interrupt(0x10,ax,0,0,0); 

,或者簡單:

interrupt(0x10,0xE*256+'Q',0,0,0); 
中稱爲 ç程序

kernel.c

我的任務是寫一個函數printString(char *chars)C它採用一個字符串並使用討論的彙編函數在屏幕上打印它。

我已經這樣做了:

void printString(char * chars){ 
int i = 0; 
int l = length(chars); 
for(; i < l; i++){ 
    interrupt(0x10,0xE*256+chars[i],0,0,0); 
} 
} 

,但它的字符串多次打印而不是打印一次。 當我嘗試打印「Hello World」時,它打印了11次,因爲它包含11個字符,其他字符串也是如此。

+4

您可能在處理中斷的代碼上遇到問題。你可以添加它嗎? –

+0

不會''strlen()'而不是'length()'?這段代碼是否實際編譯?或者是'length()'自定義函數來獲取字符串的長度?在這種情況下,你可以添加它嗎? –

+0

這是一個體面的練習入門,但使用BIOS不是編寫操作系統的方式。將東西寫入屏幕的正確方法是爲視頻界面編寫驅動程序。 –

回答

0

我認爲你需要尋找一個空字符來終止讀取。我注意到程序集文件也對字符緩衝區做了一些奇怪的事情。當我直接從main()調用中斷函數時,甚至打印了多個字符。

添加行:while(1);保持main()不返回。執行main()的多個實例的引導加載器是導致重複輸出的原因。

相關問題