2010-04-26 50 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重要码。