竹笋

首页 » 问答 » 灌水 » ARM汇编入门指南
TUhjnbcbe - 2022/2/15 14:05:00

本篇文章的目的是希望以一个例子的方式,能够不那么枯燥的的给大家简单介绍一下Android或iOS这些移动终端上ARM架构的CPU是如何执行ARM汇编指令的。如果说程序员在学习任何一门语言的起点都是从学习写helloworld程序开始的,那么本篇文章希望的就是成为你学习ARM汇编的那第一篇入门教程,手把手的带着你用ARM汇编手写一个helloworld程序。

Hello,ARM

首先我们这里是准备用GNUARM汇编来手写一个ARM64架构的helloworld程序,那么需要先准备如下几个东西:

一个文本编辑器,这里我们用vim.一个ARM64的编译器,这里我们用的是AndroidNDK里面自带的clang.伪指令

以上准备好了,我们就可以开始新建一个文件名为main.S的纯文本文件,然后用任意自己最心爱的文本编辑器(对于我而言它永远是vim)来打开它,咱们先来起个头:

.text.file"main.c".globlmain//--Beginfunctionmain.p2align2

这里我们使用是GNUARM汇编,其中以.开头的是汇编指令(AssemblerDirective)又或被称为伪指令(Pseudo-operatio),因为它们不属于ARM指令,因此被称为伪指令,这里我们先尽量忽略它们,因为我们的主要学习目的是学习真正的ARM汇编指令,而不是这些伪东西,如果想了解它们可以参考文末的附录(伪指令参考表),这里只需要看懂其中的一句伪指令即可:

.globlmain

这一句伪指令它定义了最重要的事情:在我们这个文件里面有一个叫做main名称的导出函数,它就是我们helloworld程序的入门函数。

main函数

然后我们就可以来书写我们的helloworld程序的main函数:

.typemain,

functionmain://

main//%bb.0:subsp,sp,#32//=32stpx29,x30,[sp,#16]//16-byteFoldedSpilladdx29,sp,#16//=16movw8,wzrsturwzr,[x29,#-4]adrpx0,.L.straddx0,x0,:lo12:.L.strstrw8,[sp,#8]//4-byteFoldedSpillblprintfldrw8,[sp,#8]//4-byteFoldedReloadmovw0,w8ldpx29,x30,[sp,#16]//16-byteFoldedReloadaddsp,sp,#32//=32ret

在GNUARM汇编里面所有以:结尾的都会视为标签(label),在这里我们定义一个叫做main的标签,并且使用.type伪指令定义这个标签的类型是一个函数(function),到此我们就定义了我们的main函数。

汇编指令

上面这一段ARM汇编目前就和天书一样,你不认识它,它不认识你,没关系,接下来我们会一行一行的来学习它们究竟是什么意思,在看完这篇文章后,当你再看到它们时,它们会和你学过的任何一门语言的helloworld一样简单的。

下面我们先窥视一下第一行写得是什么东西:

subsp,sp,#32

这里我们需要先了解一下ARM汇编的格式,ARM指令使用的是三地址码,它的格式如下:

opcode{cond}{S}Rd,Rn,shifter_operand

其中我们目前只需

1
查看完整版本: ARM汇编入门指南