【问题标题】:Run c code from a bootloader program从引导加载程序运行 c 代码
【发布时间】:2012-03-29 11:45:14
【问题描述】:

到目前为止,我有一个汇编脚本,可以让您从它启动并将 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 代码以便汇编脚本执行它?另外我将如何编辑我当前的引导加载程序以便可能?

【问题讨论】:

标签: c assembly bootloader


【解决方案1】:

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

[总的来说,我对您要求精确使用 C 的要求感到困惑;只要引导加载程序不太需要执行速度,就更适合使用更适用于这种情况的东西,例如 Forth。有现成的实现(参见 FreeBSD 引导加载程序)。]

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      一般你需要做以下事情:

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

      所有细节都需要google很多次...

      【讨论】:

      • 如果您专门使用可以针对 16 位可执行文件/二进制文件(如 MSVC 1.52c)的编译器,则不会阻止您使用 16 位 C 代码; OpenWatcom;或类似 Bruce 的 C 编译器 (bcc),它在大多数 Linux 发行版上都可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 2011-07-02
      • 2010-10-05
      • 1970-01-01
      相关资源
      最近更新 更多