如何启动此代码?

时间:2011-11-02 10:43:34

标签: linux gcc assembly boot

我是c的汇编和程序的新手(在Linux中使用GCC)

这里的任何人都可以告诉我如何将c代码编译成汇编并使用笔式驱动器从它启动

我使用命令(在linux终端中):

 gcc -S bootcode.c

代码给了我一个bootcode.S文件

我该怎么做???

我只想编译以下代码并直接从USB记忆棒运行

#include<stdio.h>
void main()
{
  printf ("hi");
}

这里的任何帮助???

2 个答案:

答案 0 :(得分:2)

启动计算机并非易事。需要编写引导加载程序。引导加载程序必须遵守某些规则并与ROM等硬件相对应。您还需要禁用中断,保留一些内存等。查看MikeOS,这是一个很好的项目,可以更好地帮助您理解该过程。 干杯

答案 1 :(得分:2)

首先,

您应该知道,当您编写引导加载程序代码时,您应该知道您正在创建自己的代码环境,这意味着,没有任何此类现成的C库可用于您或类似的任何内容,仅限BIOS服务(或中断程序)。

现在,如果你有这个,你可能会发现上面的代码无法启动,因为你没有“stdio.h”标题,这意味着执行编译代码时的CPU赢了找到这个头,从而不会理解什么是“printf”(因为printf是stdio.h头的一个方法)。 因此,如果您想要打印任何字符串,您需要在单独的文件中将您的OWN写入此函数作为标题,并在创建最终二进制文件时或在同一文件中的编译时链接其目标文件。它是由你决定。可能还有其他方法,我对它们并不熟悉,只做一些研究。

你应该知道的另一件事是,BIOS负责将这个启动代码(在你的情况下你的上面的代码)加载到内存位置0x07C00(0x0000h:0x7C00 in segment:offset表示),所以你必须提到您在此内存位置编写此代码的代码,可以通过

1 - 使用ORG指令

2 - 或者通过加载适当的寄存器(cs,ds,es)

另外,你应该熟悉这个片段:偏移内存表示方案,只需谷歌或阅读英特尔手册。

最后,为了让你的代码加载到0x07C00,启动代码不得超过512byte(仅在可启动媒体的第一扇区,因为一个sectore是512byte),他必须找到这个的最后两个字节您的代码的第一个扇区(字节510和字节511)的引导签名为0x55AA,否则BIOS将不会将此代码视为AS BOOTABLE。 通常这被编码为:

ORG 0x7C00

...

您的启动代码并加载更多代码,因为512byte是不够的。

...

次510 - ($ - $$)db 0x00; Zerofill最多510个字节

               dw 0xAA55 ;Boot Sector signature,written in reverse order since it

                             will be stored as little endian notation

只是为了让你知道,我没有在这里介绍所有内容,因为如果是这样,我会写关于它的页面,你需要在网上寻找更多的资源,这里是一个开始的链接(在汇编中编码):

http://www.brokenthorn.com/Resources/OSDevIndex.html

这就是全部,希望这对你有帮助...... ^ _ ^

Khilo - ALGERIA