2012-03-13 112 views
2

到目前爲止,我有一個程序集腳本,可以從中啓動並向屏幕寫入hello world。現在我想能夠編寫一些C代碼,並能夠讓我的程序集腳本以某種方式運行它。我用我的編譯器使用mingw gcc。這是我的裝配引導程序:從bootloader程序運行c代碼

org 7C00h 
jmp short Start 
Msg: db "Hello, world" EndMsg: Start: mov bx, 000Fh 
mov cx, 1  
xor dx, dx 
mov ds, dx 
cld    Print: mov si, Msg 

      Char: mov ah, 2  
int 10h 
lodsb 


mov ah, 9 
int 10h 
inc dl  
cmp dl, 80  
jne Skip 
xor dl, dl 
inc dh 
cmp dh, 25  
jne Skip 
xor dh, dh 
Skip: cmp si, EndMsg 
jne Char   
jmp Print  times 0200h - 2 - ($ - $$) db 0  
dw 0AA55h 

我的問題是如何編譯c代碼,以便程序集執行它?也如何編輯我的當前引導裝載程序,這將有可能?

+1

有趣,但你沒有問的問題。我們無法回答你沒有問過的問題。 – abelenky 2012-03-13 03:22:36

+0

您可能想查閱操作系統開發教程。例如[Bona Fide OS開發教程](http://www.osdever.net/tutorials/index)或[OSDev.org]上的教程(http://wiki.osdev.org/Expanded_Main_Page) – 2012-03-13 06:38:49

+1

可能的重複[通過彙編程序在引導程序級執行C程序](http://stackoverflow.com/questions/6169071/execute-c-program-at-bootloader-level-via-assembler) – 2012-03-13 11:17:31

回答

3

首先,你應該選擇一個編譯器來使用和研究它的細節。 C程序可以編譯爲標準初始化的「託管」環境,作爲入口點和標準庫的main(),以及沒有提供這種保證的「獨立」環境。要調用C代碼,您應該在引導加載程序中進行適當的環境設置(堆棧,數據段等)。這個詳細信息是編譯器特定的。目標代碼轉換爲適合你的引導程序的形式也可能是問題。 對於16位代碼,至少有Turbo C和Watcom C可供免費使用。 Watcom更加先進,現代化,現在開源。 請注意,標準庫在此類設置中不可用,因此C代碼應專門針對您的環境編寫;這包括諸如例如儘管不寫庫調用,但通常在庫中實現32位長乘法。

[一般來說,我很困惑你的請求使用正確的C;只要引導加載程序不太可能需要執行速度,那麼使用更適用於此類上下文的東西就更合適了,如Forth。有準備使用實現(見FreeBSD的引導程序)]

1

您需要編譯16位的C代碼。然後將其複製到引導設備中的給定位置。您需要修改引導加載程序以將代碼加載到內存中並跳轉到該內存。另請注意,gcc目前無法編譯爲16位。我聽說Watcom編譯器可以,所以它應該是有用的。

0

一般來說,你需要做以下事情:

  1. 你最好準備一個交叉編譯器,這會避免很多的麻煩 。
  2. 您的引導加載程序應該能夠在軟盤 或CD中找到目錄/文件。例如,如果您在CD上安裝了bootloader,您需要找到解析CD內容的方法。您可以參考CD媒體的「El Toroito」標準。
  3. 你的引導程序應該爲你的c程序準備環境。 例如,你的C程序需要32位的保護模式,你的 引導加載程序應該準備它。
  4. 你的引導程序應該將C程序加載到內存中,並跳轉到 它。
  5. 在大多數情況下,您必須編寫另一個引導加載程序。您的#1 引導加載程序應該加載#2引導加載程序,#2引導加載程序加載 您的C程序。你的第二個引導程序可以用程序集編寫,那麼 將更容易驗證你的工作。
  6. 你的C程序應該作爲獨立模式來編寫。

您需要谷歌很多很多次的所有細節...

+0

您不會阻止使用16位的程序,如果你專門使用了一個編譯器,它可以定位16位可執行文件/二進制文件,如MSVC 1.52c; OpenWatcom;或者像大多數Linux發行版中可用的布魯斯的C編譯器(bcc)。 – 2015-12-09 13:36:48