ARM指令集

算术运算指令

1.ADD指令

ADD{条件} {S} <dest>, <op_1>, <op_2>

1
2
ADD   R0, R1, R2	; R0=R1+R2
ADD R0, R1, $256 ; R0=R1+256

2.ADC指令

用于带进位的加法运算

ADC{条件}{S} <dest>, <op_1>, <op_2>

1
ADCS   R0,R2,R3   ;带进位加,结果保存在R0和R1寄存器

3.SUB命令

减法运算

SUB{条件}{S} <dest>, <op_1>, <op_2>

4.SBC指令

用于带借位的减法运算

SBC{条件}{S} <dest>, <op_1>, <op_2>

逻辑运算指令

1.AND指令

AND{条件}{S} <dest>, <op_1>, <op_2>

2.EOR指令

异或运算

EOR{条件}{S} <dest>, <op_1>, <op_2>

3.MOV指令

MOV可以在两个操作数之间复制数据

MOV{条件}{S} <dest>, <op_1>

分支指令

B指令

B指令可以根据设置的条件跳转带指定的代码位置

B{条件} <地址>

数据传送指令

1.单一数据传送指令

单一数据传送指令用于向内存转载和存储一个字节或者一个字长的数据。

1
2
3
4
LDR{条件}   Rd,<地址>
STR{条件} Rd,<地址>
LDR{条件}B Rd,<地址>
STR{条件}B Rd,<地址>
1
2
3
STR   Rd, [Rbase]          ;存储Rd到Rbase所包含的有效地址
STR Rd, [Rbase, Rindex] ;存储到Rd到Rbase+Rindex缩合成的有效地址
STR Rd, [Rbase, $index] ;存储到Rd到Rbase+index所合成的有效地址

2.多数据传送指令

多数据传送指令用于向内存装载和存储多个字节或字的数据。

xxM{条件}{类型} Rn{!}, <寄存器列表>{^}

其中,xx可以是LD,表示装载,也可以为ST,表示存储。多数据传送指令用于寄存器和内存中多个数据的复制。指令包括:

1
2
3
4
5
6
7
8
LDMED    LDMED    ;装载前增加地址,相当于C中的++p
LDMFD LDMIA ;装载后增加地址,相当于C中的p++
LDMED LDMED ;装载前减小值,相当于C中的++*p
LDMED LDMED ;装载后减小值,相当于C中的*p++
STMFA STMIB ;存储前增加地址
STMEA STMIA ;存储后增加地址
STMFD STMDB ;存储前增加值
STMED STMDA ;存储后增加值

ARM结构

寻址方式

1.立即寻址

立即寻址方式中操作数已经写在了指令里面,取出指令时会把操作数也取出来。这是最简单的寻址方式。

2.寄存器寻址

1
2
MOV R1, R2     ;把R2的值赋给R1
SUB R0, R1, R2 ;把R1-R2的值写给R0

3.寄存器偏移寻址

1
2
MOV R0, R1, LSL #3       ;把R1的值左移三位写入R0
ANDS R0, R1, R2, LSL #R3 ;把R2的值左移R3位,然后与R1做与操作,结果写入R0

4.寄存器间接寻址

该方式把寄存器的值当做地址,然后从对应的内存中取出数据。

1
2
LDR R0, [R1]        ;把R1的值当做地址,从内存中取出数据存放到R0
SWP R0, R0, [R1] ;把R1的值当做地址,从内存中取出数据与R0交换

5,基址寻址

该方式把寄存器的内容与指定的偏移相加,得到数据地址,然后从内存取得数据。

1
2
LDR R0, [R1, #0xf]      ;把R1的数值与0xf相加得到数据地址
STR R0,[R1, #-2]

6.多寄存器寻址

该方式允许一次可以传输多个寄存器的值。

1
2
LDMIA R1!, {R2-R7,R12}   ;把R1单元中的数据读出到R2~R7和R12,R1指定的地址自动加1
STMIA R0, {R3-R6,R10} ;把R3~R6和R10中的数据保存到R0指向的地址,R0的地址自动加1

7.栈寻址

1
2
STMFD SP!, {R0~R7, LR}     ;把R0~R7的内容压入堆栈
LDMFD SP!, {R0,R7, LR} ;从堆栈中取出数据到R0~R7和LR