2011-11-02 33 views
0

我是一个新手,以组装和程序C(在Linux中使用GCC)如何启动这段代码?

可以在这里任何人告诉我如何使用随身碟

我用命令编译C代码转换成由它装配和引导(在Linux终端):

gcc -S bootcode.c 

代码给了我bootcode.S文件

我该怎么办与???

我只想编译下面的代码,直接从USB记忆棒

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

任何帮助,在这里运行???

+3

德阅读http://wiki.osdev.org/Main_Page,尤其是 - http://wiki.osdev.org/Boot_sequence,了解计算机的启动方式。 –

+3

如果我理解你的话,你想直接从BIOS启动U盘?这是一项艰巨的任务,需要很多普通程序无法完成的工作(例如,没有用于printf的操作系统)。你应该做一个关于开发引导程序代码和操作系统的谷歌搜索。 –

回答

2

首先,

你应该知道,当你正在编写引导程序代码,你应该知道,你正在创建你的代码,这意味着自己的环境,没有什么这样的现成的C库可用于您或任何类似的,只有和唯一的BIOS服务(或中断程序)。因为你没有“stdio.h”头文件,这意味着CPU在执行你的编译代码时获得了胜利找不到这个头文件,从而不理解什么是“printf”(因为printf是stdio.h头文件的一个方法)。 所以如果你想打印任何字符串,你需要自己编写这个函数,或者在一个单独的文件中作为头文件,并在编译时在创建最终的二进制文件或者在同一个文件中链接它的目标文件。它是由你决定。可能还有其他的方式,我不太熟悉它们,只是做一些研究。

另一件您应该知道的事情是,BIOS负责将这个启动代码(您的上面的代码)加载到内存位置0x07C00(0x0000h:0x7C00中的段:offset代表),所以您必须提及在你的代码,你写这个内存位置的代码,或者通过

1,使用ORG指令

2 - 或者通过加载相应的寄存器为(CS,DS,ES)

另外,你应该让自己熟悉段:偏移量内存表示方案,只是谷歌它或阅读我ntel手册。

最后,BIOS将您的代码加载到0x07C00中,启动代码不得超过512byte(仅限于BOOTABLE MEDIA的第一扇区,因为扇区是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 - 阿尔及利亚

2

启动电脑并不那么容易。需要编写一个引导程序。引导加载程序必须遵守一定的规则,并与ROM等硬件相对应。您还需要禁用中断,保留一些内存等。查看MikeOS,这是一个伟大的项目,可以更好地帮助您了解过程。 干杯