2024年5月11日发(作者:)

Making plain binary files using a C compiler (i386+)

作者:Cornelis Frank April 10, 2000

翻译:coly li

我写这篇文章是因为在internet上关于这个主题的信息很少,而我的EduOS项目又需要它。对

于由此文中信息所引申、引起的意外或不利之处,作者均不负有任何责任。如果因为我的糟糕英

语导致你的机器故障,那是你的问题,而不是我的。

1,你需要什么工具

一个i386或者更高x86CPU配置的PC

一个Linux发行版本,Redhat或者Slackware就不错。

一个GNU GCC编译器。一般linux发行版本都会自带,可以通过如下命令检查你的GCC的

版本和类型:

gcc --version

这将会产生如下的输出:

2.7.2.3

可能你的输出和上面的不一样,但是这不碍事。

Linux下的binutils工具包。

NASM 0.97或者更高的版本汇编器。Netwide Assembler,即NASM,是一个80x86的模块化

的可移植的汇编器。他支持一系列的对象文件格式,包括linux的””,和

ELF,NetBSD/FreeBSD,COFF,Microsoft 16位OBJ和Win32。他也可以输出无格式二进制

文件。他的语法设计的非常简单并且易于理解,同intel的非常相似但是没有那么复杂。它

支持Pentium,P6和MMX操作数,并且支持宏。

如果你的机器上没有NASM,可以从下述网站下载:

/pub/Linux/devel/lang/assemblers/

一个象emacs或者pico那样的文本编辑器。

1.1安装Netwide汇编器(NASM)

假定当前目录下存有nasm-0.97的压缩包,输入:

gunzip

tar -vxf

这将建立一个名为nasm-0.97的目录,进入这个目录,下一步我们将输入如下命令来编译这个

汇编器:

./configure

make

这将建立可执行文件nasm和ndisasm。你可以将这些文件复制到你的/usr/bin目录下,这样更

方便调用。现在你可以从你的计算机上删除目录nasm-0.97了。我一般会在RedHat linux 5.1

或者Slackware 3.1下编译,这样不会引起太多麻烦。

2,使用C语言生成第一个二进制文件

使用你的文本编辑器建立一个名为test.c的文件,输入如下内容:

intmain(){

}

输入如下命令进行编译:

gcc –c test.c

ld –o test –Ttext 0x0 –e main test.o

objcopy –R .note –R .comment –S –O binary test

这将建立我们的名为的二进制文件。我们可以使用ndisasm查看这个文件,需输入如

下命令:

ndisasm –b 32

这将生成如下输出:

00000000

00000001

00000003

00000004

指令本身。

55

89E5

C9

C3

push ebp

mov ebp,esp

leave

ret

我们看到3列。第一列是指令的内存地址,第二列是指令的字节代码,最后一行是对应的汇编