8.4. 汇编源程序实例文件 hello.S

学习任何程序设计语言时,入门示例通常都是编写一个输出“Hello World!”的程序。本章前面已经介绍了汇编器指令,以及如何在汇编源文件中定义变量和函数。下面通过编写一个完整汇编源程序,进一步了解汇编源程序的编写和编译过程。

汇编源程序示例文件hello.S内容如下:

.data
.LC0: 			#	本地标签,指定字符串"Hello World!\0"的地址
.ascii	"Hello World!\0"
.text
.align 	2
.global main
.type 	main,@function
main: 			#	本地标签,指定函数main的开始
	addi.d 		$sp, $sp, -8
	st.d 		$ra, $sp, 0
	la.local 	$r4, .LC0
	bl 			$plt(puts)
	li.w 		$a0, 0
	ld.d 		$ra, $sp, 0
	addi.d 		$sp, $sp, 8
	jr 			$ra
.size 	main, .-main
.section .note.GNU-stack,"",@progbits

这段程序展示了汇编源程序中的基本语法,包括汇编器指令和汇编指令。可以看到,汇编器指令通常以字符“.”开头。

示例中命令语句后的#表示行注释,不参与汇编器编译,也不占用目标文件地址空间。需要注意,不同架构对汇编源文件注释的规定可能不同。在LoongArch架构下,行注释符号与x86相同,都是#。汇编源文件也可以使用块注释,语法与C语言一致,即/*...*/

main函数内的汇编指令调用libc库的puts函数接口,完成字符串“Hello World!”的屏幕输出。

写好hello.S后,可以先用汇编器编译为可重定位目标文件hello.o,再由链接器与依赖的基础libc库链接生成可执行文件hello,命令如下:

$ as hello.S -o hello.o
$ ld hello.o -lc -o hello

这两个步骤也可以通过gcc一次完成:

$ gcc hello.S -o hello