ARM指令集
算术运算指令
1.ADD指令
ADD{条件} {S} <dest>, <op_1>, <op_2>
1 | ADD R0, R1, R2 ; R0=R1+R2 |
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 | LDR{条件} Rd,<地址> |
1 | STR Rd, [Rbase] ;存储Rd到Rbase所包含的有效地址 |
2.多数据传送指令
多数据传送指令用于向内存装载和存储多个字节或字的数据。
xxM{条件}{类型} Rn{!}, <寄存器列表>{^}
其中,xx可以是LD,表示装载,也可以为ST,表示存储。多数据传送指令用于寄存器和内存中多个数据的复制。指令包括:
1 | LDMED LDMED ;装载前增加地址,相当于C中的++p |
ARM结构
寻址方式
1.立即寻址
立即寻址方式中操作数已经写在了指令里面,取出指令时会把操作数也取出来。这是最简单的寻址方式。
2.寄存器寻址
1 | MOV R1, R2 ;把R2的值赋给R1 |
3.寄存器偏移寻址
1 | MOV R0, R1, LSL #3 ;把R1的值左移三位写入R0 |
4.寄存器间接寻址
该方式把寄存器的值当做地址,然后从对应的内存中取出数据。
1 | LDR R0, [R1] ;把R1的值当做地址,从内存中取出数据存放到R0 |
5,基址寻址
该方式把寄存器的内容与指定的偏移相加,得到数据地址,然后从内存取得数据。
1 | LDR R0, [R1, #0xf] ;把R1的数值与0xf相加得到数据地址 |
6.多寄存器寻址
该方式允许一次可以传输多个寄存器的值。
1 | LDMIA R1!, {R2-R7,R12} ;把R1单元中的数据读出到R2~R7和R12,R1指定的地址自动加1 |
7.栈寻址
1 | STMFD SP!, {R0~R7, LR} ;把R0~R7的内容压入堆栈 |