11.6 编写第一个程序
请为我们第一个程序 理所当然的 Hello, World! 做好准备。
1: %include 'system.inc' 2: 3: section .data 4: hello db 'Hello, World!', 0Ah 5: hbytes equ $-hello 6: 7: section .text 8: global _start 9: _start: 10: push dword hbytes 11: push dword hello 12: push dword stdout 13: sys.write 14: 15: push dword 0 16: sys.exit
它的工作如下: 第1行,它包含了 system.inc 中的定义、宏和代码。
第3-5行是数据段: 数据段从第3行开始。第4行中包含了字符串 "Hello, World!" 和一个换行符 (0Ah
)。 第5行中,我们建立了一个常量来表示第四行字符串中包含字节的数目。
第7-16行是代码段。 请注意 FreeBSD 对可执行文件使用 elf 格式, 这需要每个程序从标签 _start
开始执行, 或者更准确地说,是连接器对程序的要求。 这个标签需要是全局的。
第10-13行,程序将把 字符串 hello
中的 hbytes
个字符写到标准输出 stdout
中。
第15-16行,程序将结束并返回 0
。 系统调用 SYS_exit
没有返回值,所以程序在这里结束。
注意: 如果你以前有 MS-DOS® 汇编程序的背景, 你可能习惯直接对显示硬件进行写操作。 在 FreeBSD, 或者其它 UNIX® 中,你也不用担心。 到目前为止,你所要关心地是向一个叫 stdout 的文件进行写操作。这个叫 stdout 的文件, 可以是显示器,或者是一个 telnet 终端,或者是一个真实的文件,甚至可能是对另外一个程序的输入。
11.6.1 汇编你的代码
在编辑器里输入这些代码 (不包括那些行号), 然后保存为名叫 hello.asm 的文件。 现在你需要做的是使用 nasm 对代码进行汇编。
11.6.1.1 安装 nasm
如果你没有 nasm,请输入:
% su Password:your root password # cd /usr/ports/devel/nasm # make install # exit %
如果你不想保留 nasm 的代码,你可以使用 make install clean 来代替上面提到的 make install。
不过通过任何一种方法, FreeBSD 将自动从互联网上下载 nasm 的代码, 编译它, 并将它安装在你的系统上。
注意: 如果您的系统不是 FreeBSD, 则需要从 nasm 的 主页 来获得它。 在其他系统上这个程序也能够汇编针对 FreeBSD 的代码。
现在你可以汇编,连接,运行代码了:
% nasm -f elf hello.asm % ld -s -o hello hello.o % ./hello Hello, World! %