从引导加载程序运行c代码

时间:2012-03-13 03:10:25

标签: c assembly bootloader

到目前为止,我有一个汇编脚本,可以让你从它启动并将hello world写入屏幕。现在我希望能够编写一些c代码,并能够让我的汇编脚本以某种方式运行它。我使用mingw gcc作为我的编译器。这是我在程序集中的引导加载程序:

 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代码以便汇编脚本执行它?我将如何编辑我当前的引导加载程序,以便可能?

3 个答案:

答案 0 :(得分:3)

首先,您应该选择要使用的编译器并研究其细节。可以为“托管”环境编译C程序,该环境假定标准初始化,main()作为入口点和标准库,以及“独立”环境,其中不提供这样的保证。要调用C代码,您应在引导加载程序中进行适当的环境设置(堆栈,数据段等)。此细节特定于编译器。将目标代码转换为适合您的引导加载程序的形式也可能是个问题。 对于16位代码,至少可以免费使用Turbo C和Watcom C. Watcom更先进,更现代,现在是开源的。 请注意,标准库在此类设置中不可用,因此C代码应专门为您的环境编写;这包括如下的水下宝石。尽管你没有编写库调用,但通常在库中实现32位长的乘法。

[一般来说,我对你使用C的要求感到困惑;一旦引导程序不太可能需要执行速度,使用更适用于此类上下文的内容就更为合适,如Forth。有准备使用的实现(参见FreeBSD bootloader)。]

答案 1 :(得分:1)

您需要编译16位的C代码。然后将其复制到引导设备中的给定位置。您需要修改引导加载程序以将代码加载到内存中并跳转到它。另请注意,gcc目前无法编译为16位。我听说Watcom编译器可以,所以它应该是有用的。

答案 2 :(得分:0)

一般来说,您需要做以下事情:

  1. 你最好准备一个交叉编译器,这样可以避免很多 麻烦。
  2. 您的引导程序应该能够在软盘中找到目录/文件 或CD。例如,如果你在CD上安装了bootloader 需要找到解析CD内容的方法。你可以参考“El Torito“CD媒体的标准。
  3. 您的引导程序应为您的c程序准备环境。 例如,C程序需要一个32位的保护模式,你的 bootloader应该准备好。
  4. 您的引导程序应将C程序加载到内存中,然后跳转到 它。
  5. 在大多数情况下,您必须编写另一个引导加载程序。你的#1 bootloader应加载#2 bootloader,加载#2 bootloader 你的C程序。你的第二个bootloader可以用汇编语言编写 将更容易验证您的工作。
  6. 您的C程序应该被视为独立模式。
  7. 您需要谷歌多次获取所有细节...