ARM汇编语言(Assembly Language)是ARM CPU所能接受的最底层唯一语言(所有的高级语言最终都要转换成汇编语言然后汇编成processor instruction codes)。ARM汇编的核心是ARM指令集。理解ARM汇编有助于理解底层processor内部的工作原理,有助于对高级语言的优化。由于ARM汇编小、快的特点,经常被用在processor的初始化配置中(常见于bootloader、kernel的初始化代码)。
ARM Assembly Language(语法)不同于其他高级语言,汇编语言没有一个标准的语法格式,不同的assembler有着不同的语法,不同的processor有着不同的指令(instruction code)格式。机器所能执行的是raw instruction code,汇编语言使用人类易懂的mnemonics来代替instruction code,然后通过assembler汇编成二进制的raw instruction code。以下主要针对ARM处理器指令格式及GNU Assembler进行讲解。
语句格式(Layout)ARM汇编源文件是由每行一条语句顺序组成的文本文件。语句格式如下:
label: instruction @comment
每条语句由标签(label)、指令(instruction)、注释(comment)三项组成且每一项都是可选的:
Label
内存地址的标记,指向一个特定地址,常被跳转指令(branch instructions)用来跳转。
Instruction
ARM汇编指令(ARM assembly instruction)、所使用的汇编器指令(assembler directive)。
Comment
注释以@符号开始,但在有些现代汇编器如GAS(GNU Assember)中,也可以使用C语言风格 /**/。 指令格式(Instruction Format)<op>{cond}{flags} Rd, Rn, Operand2
<op>
使用easier-to-remember指令助记符(Opcode mnemonic)代替机器能理解但人类难理解的instruction code。
{cond}
可选的两个字母的条件码(condition code),使指令依此条件执行。condition code 的判断依据是CPSR寄存器的N、Z、C、V标记位(见ARM体系结构),使用比较指令或者在指令后加S(如ADDS,MOVS)可更新这些FLAGS。 CODEMEANINGFLAGSEQ EQual equals zero Z
NE Not Equal !Z
VS Overflow Set V
VC No overflow (oVerflow Clear) !V
MI MInus/negative N
PL PLus/positive or zero !N
CS Carry set/unsigned higher or same C
CC Carry clear/unsigned lower !C
HI Unsigned higher C and !Z
LS Unsigned lower or same !C or Z
GE Signed greater than or equal N == V
LT Signed less than N != V
GT Signed greater than !Z and (N == V)
LE Signed less than or equal Z or (N != V)
AL Always (default) Any
{flags}
可选的附加标记。
Rd
目的寄存器
Rn
第一个寄存器
Operand2
第二个寄存器或操作数 Addressing Modes(寻址方式)常见寻址方式:
ModeDescriptionExample立即数 hash加上整型 如#64,#0x1234
寄存器直接 寄存器中的数值作为操作数 ADD R0,R1,R2
寄存器间接 寄存器中的值作为地址,通过这个地址去取得操作数 LDR R0,[R1]
寄存器基址变址 间接寻址的扩展,地址组成改为寄存器基址+偏移量 形如[R1,#4]、[R1,R2]、[R1,#4]!、[R1],#4,后两种执行完R1值会自加4
GNU Assembler Directives(GNU汇编指令)
Assemblers reserve special keywords for instructing the assembler how to perform special functions as the mnemonics are converted to instruction codes.
All assembler directives have names that begin with a full-stop “.”.
.ascii Text string
.asciz Null-terminated text string
.byte Byte value
.double Double-precision floating-point number
.float Single-precision floating-point number
.int 32-bit integer number
.long 32-bit integer number (same as .int)
.octa 16-byte integer number
.quad 8-byte integer number
.short 16-bit integer number
.single Single-precision floating-point number (same as .float)
其他 DirectiveDescription
.include 类似C语言#include
.equ 类似C语言中的宏定义,使用时用&
.extern 类似C语言的extern声明
.global 声明全局变量
.rodata 只读数据段
.comm Declares a common memory area for data that is not initialized
.lcomm 同.comm,只是局部的不能被global
.align Insert 0-3 bytes of 0x00’s so that the next location will be on a 4-byte(word) boundary
.type 定义函数
.end 文件结束
ARM Assembly Instructions (ARM汇编指令)