以下是之前寫的版本, 有一些錯誤, 花了幾天時間, 終於修正這些錯誤。保留下來當作歷史紀錄。我在 dosbox 測試, 沒想到在 dosbox 測試可以成功, 但在 qemu, bochs dos 環境會當機, 看來 dosbox 的測試不太可靠。請不要看這篇寫的資料。
改參考: http://descent-incoming.blogspot.com/2011/10/c-run-time-environment-in-x86-protected.html
程式首先進入 x86 保護模式, 讀寫 5MB 的位址, 然後呼叫 c function kmain, kmain 會使用 inline assembly 設定 al 暫存器的值, 再呼叫 5M_mem_rw_mix_c.S 的 DispAL 將 al 暫存器的值印要螢幕上。
asm("movb $0xab, %al");
要能開始使用 C 語言最主要是將要 stack 設定好, 因為 call 指令會使用 stack, 因為是在 x86 保護模式下, 所以是以 selector 來設定 ss 暫存器, 而 5M_mem_rw_mix_c.S 163~166 就是在設定 stack, 一旦 stack 設好, 就可以使用 call 指令來呼叫 c function。
而 C 語言呼叫慣例那是另外一件事, 會稍微複雜一點, 不過那也只發生在傳遞參數時才會比較複雜, 在這階段不太需要考慮這件事情。為什麼我不寫? 因為我還沒搞懂 XD
紅色的 AB 就是透過 inline assembly 設定 al 暫存器的值, 然後將 al 的內容印出來。最後一樣切回真實模式並回到 DOS box 提示符號下。
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。