第4部分- Linux ARM汇编首个程序

首个64位汇编

我们先创建第一个AArch64上的首个汇编程序,这个64位代码是我在一个ARMv8服务器上运行的。有国产的华为鲲鹏/飞腾,非国产的也可以是安培或者Cavium。

first64.s

.arch armv8-a
.global _start
.text
_start:
	mov x8, 93
	svc 0

编译:

as -g -o first64.o first64.s

ld -o first64 first64.o

在armv8机器上可以运行,当然没有什么输出的,可以通过echo $?来观看执行结果。

首个32位汇编

以树莓派3b为环境,这个是一个32位的ARM处理器,后面32位的代码都在我这个树莓派中运行的。

第一个程序如下:

.global main /* 'main' is our entry point and must be global */
 
main:          /* This is main */
    mov r0, #2 /* Put a 2 inside the register r0 */
    bx lr      /* Return from main */
as -o first.o first.s
gcc -o first first.o

然后执行:

./first

通过echo查看执行结果

$echo $?

2

这里bx是branch and exchange。分支意味着我们将改变指令执行的流程。该指令只是离开了主要功能,从而有效地结束了我们的程序。

这个代码在amrv8上是不能编译通故宫的,找不到bx指令。

Makefile

为了后续编译方便制作Makefile如下:

# Makefile
all: first
 
first: first.o
	gcc -o $@ $+
 
first.o : first.s
	as -o $@ $<
 
clean:
	rm -vf first *.o