2010-04-26 46 views
2

我想建立一個像操作系統一樣的舊的16位DOS操作系統。幫助建立一個16位的操作系統

我的例子內核代碼:

asm(".code16\n"); 
    void putchar(char); 
    int main() 
    { 
    putchar('A'); 
    return 0; 
    } 
    void putchar(char val) 
    { 
     asm("movb %0, %%al\n" 
      "movb $0x0E, %%ah\n" 
      "int $0x10\n" 
      : 
      :"r"(val) 
     ) ; 
    } 

這是我如何編譯:

nasm -f bin -o ./bin/boot.bin ./source/boot.asm 
gcc -nostdinc -fno-builtin -I./include -c -o ./bin/kernel.o ./source/kernel.c 
ld -Ttext=0x9000 -o ./bin/kernel.bin ./bin/kernel.o -e 0x0 
dd if=/dev/zero of=./bin/empty.bin bs=1440K count=1 
cat ./bin/boot.bin ./bin/kernel.bin ./bin/empty.bin|head -c 1440K > ./bin/os 
rm ./bin/empty.bin 

和我在虛擬機上運行。

當我爲恆定值putchar函數(在內核代碼)......即是這樣的:

void putchar() 
{ 
    char val = 'A'; 
    asm("movb %0, %%al\n" 
    "movb $0x0E, %%ah\n" 
    "int $0x10\n" 
    : 
    :"r"(val) 
    ) ; 
} 

然後正常工作。但是當我將參數傳遞給它時(這是在前面的代碼中),那麼它爲任何字符打印一個空格。 我該怎麼辦?

+0

你的意思是,「一個像dos的16位操作系統」,或者「一個16位DOS操作系統」? – 2010-04-26 12:29:39

+0

err ...我不應該使用'dos'這個詞。讓它只是一個16位的基本操作系統。 :-) – brainbarshan 2010-04-26 12:33:33

+0

啊!代碼大牆! – Earlz 2010-04-26 23:26:16

回答

3

如果您正在嘗試使gcc生成16位代碼,則需要使用.code16gcc而不是.code16,以獲得函數參數的堆棧操作權限:請參見"Writing 16-bit Code" in the gas documentation

(同樣,這取決於GCC您正在使用的版本,你可能需要無論是-fno-unit-at-a-time-fno-toplevel-reorder選項編譯kernel.c,以確保任何編譯的代碼之前的asm()指令真正被彙編器遇到的 - 否則編譯器可以圍繞洗牌的東西)

+0

謝謝。有效。現在我的putchar函數正常工作。 但是一個新問題出現了。數組和指針的東西不起作用。 例如: char * str =「Hello」; putchar(str [0])。 這不起作用。請給我一些關於這個的暗示或鏈接? – brainbarshan 2010-04-27 07:41:37

+0

可能存在與段寄存器的設置有關的問題,和/或代碼沒有在您認爲的地址上運行。調試這個最好的方法是運行它,讓你單步執行代碼。我聽說[Bochs](http://bochs.sourceforge.net/)及其提供的調試工具應該對這類事情有好處,儘管我自己並沒有嘗試過。 – 2010-04-27 19:12:43

1

我找到另外一個編譯器來解決這個問題:BCC

這是一個C語言編譯器8086級的CPU是用於引導加載程序的有關8086的開發或BIOS重要碼。