Write Your Own Operating System Tutorial(中文版) (轉)

amyz發表於2007-11-10
Write Your Own Operating System Tutorial(中文版) (轉)[@more@]

:namespace prefix = o ns = "urn:schemas--com::office" />

你等待已久的時刻終於來臨。寫我們“第一個”已經是時候了。每一本像樣的書籍都會有一個“Hello, World”程式,現在我們瞭解的足夠多,可以寫一個“Hello, World”操作了。如果你做過一些嘗試已經完成這一步了,你可以跳過這一課。我們將建立一個輸出字串的並且用它來顯示我們的訊息。

每次在螢幕上列印一個字元實在夠嗆。所以我們要寫一個函式來列印一個以零結尾的字串。這將是一個迴圈,每次列印一個字元,直到結束。

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

; Print a null-tenated 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  ; vo function 0Eh (print char)

  mov bx, 0x0007 ; color

  int 0x10

  jmp putstr

putstrd:

  retn

 

現在,稍許解釋一下這個函式的用法。首先你需要把字串第一個字元的地址載入到SI中。然後就只需要這個putstr了。

你可以在你的程式中如下所示的建立字串。

msg  '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

 

試著把上面的程式碼結合到中。然後使用第三課中介紹的方法,編譯,複製到,啟動。然後,享受吧。如果你遇到困難,你可以看看我的方法,。不過只有你自己試過,才能體味到其間的快樂。

如果你完成了,請繼續到下一課,我們將學著讓我們的有互動性。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-981571/,如需轉載,請註明出處,否則將追究法律責任。

相關文章