CSDN博客

img Fnoopy

Write Your Own Operating System Tutorial(中文版)

发表于2003/7/30 8:17:00  944人阅读

Lesson 4: Hello, World

你等待已久的时刻终于来临。写我们“第一个”程序已经是时候了。每一本像样的程序设计书籍都会有一个“Hello, World”程序,现在我们了解的足够多,可以写一个“Hello, World”操作系统了。如果你做过一些尝试已经完成这一步了,你可以跳过这一课。我们将创建一个输出字符串的函数并且用它来显示我们的消息。

每次在屏幕上打印一个字符实在够呛。所以我们要写一个函数来打印一个以零结尾的字符串。这将是一个循环,每次打印一个字符,直到结束。

; ---------------------------------------------

; Print a null-terminated string on the screen

; ---------------------------------------------

putstr:

     lodsb         ; AL = [DS:SI]

     or al, al     ; Set zero flag if al=0

     jz putstrd    ; jump to putstrd if zero flag is set

     mov ah, 0x0e  ; video function 0Eh (print char)

     mov bx, 0x0007 ; color

     int 0x10

     jmp putstr

putstrd:

     retn

 

现在,稍许解释一下这个函数的用法。首先你需要把字串第一个字符的地址载入到SI中。然后就只需要调用这个putstr了。

你可以在你的程序中如下所示的创建字串。

msg  db 'Hello, World!', 0

最后的那个0用来标记这个字串的结束。接下来你就可以用下面的指令输出字串了。

mov si, msg    ; Load address of message

call putstr    ; Print the message

 

距离可以使用只有一项工作了。加载在SI寄存器中的msg的地址,实际上表示的是距离数据段首地址的偏移量,这个偏移量由寄存器DS存储。所以在你可以使用msg的地址之前,你必须设置当前的数据段。就现在而言,我们将使用从物理内存低地址开始的平坦寻址(flat addressing)。为了把数据段设为底部的开始部分,可以把DS设为零。下面的两个指令完成这个。

xor  ax, ax    ; Zero out ax

mov  ds, ax    ; Set data segment to base of RAM

 

试着把上面的代码结合到Lesson 3h.asm中。然后使用第三课中介绍的方法,编译,复制到软盘,启动。然后,享受吧。如果你遇到困难,你可以看看我的方法,helowrld.asm。不过只有你自己试过,才能体味到其间的快乐。

如果你完成了,请继续到下一课,我们将学着让我们的操作系统有交互性。

0 0

相关博文

我的热门文章

img
取 消
img