ARM汇编:
指令
伪指令
符号
arm指令分类:
跳转指令
数据处理指令
数据传送指令
乘法指令
Load/Store(加载存储)指令
程序状态寄存器访问指令
通用寄存器和存储器内容交换指令
异常产生指令
协处理指令(暂时不讲)
信号量指令(暂时不讲)
其他扩展指令(暂时不讲)
指令寻址方式:
数据处理指令操作数寻址方式
内存访问指令寻址方式
几乎所有arm指令都能条件执行:
31 30 29 28 四位表示条件位,共16个条件。
Cpsr中的条件标志位NZCV的值来确定指令是否执行。
cond的16种条件:
shifter_operand(第二源操作数)的三种形式:
# 立即数
指令里面的立即数前面加#。
嵌入式一般用十六进制,前面加0x。
寄存器
寄存器移位9种:
逻辑左移:将Rm寄存器逻辑左移shift_imm(立即数)位或Rs(寄存器)位。
,LSL #/
逻辑右移:
,LSR #/
算术右移:
,ASR #/
循环右移
,ROR #/
扩展循环右移:
,RRX :Rm扩展的循环右移一位。
S标志位:
决定是否更新cpsr中的标志位;
如果S=1,更新cpsr标志位,当Rd不为R15,cpsr中的NZCV根据指令的执行结果设置,其他位不动;当Rd是R15,当前程序状态的spsr拷贝到cpsr。
如果S=0,不更新cpsr。
{}表示可选项.
-----------------------------------------
跳转指令:
B :跳转,用于死循环
BL :带返回的跳转,函数调用
BX :跳转并切换状态
BLX:带返回的跳转并切换状态
三种跳转形式:
1.跳转到标号处LABLE
2.跳转到绝对地址0xXXX
3.跳转到子程序func处
-----------
跳转(B)和带返回的跳转(BL)
B{L}{}
编码格式:
条件代码标识 控制位
31-28 24 23-0
NZCV 101 L 跳转的地址
L:L位,也就是寄存器的24位,bit【24】=1,指令存储返回地址到LR,bit【24】=0,不保存返回地址。
cond:指令执行的条件
target_address:指令跳转的目标地址;计算目标地址方法:
将24位带符号的补码立即数扩展为32位;
将扩展后的32位立即数左移两位;
将得到的值加到PC寄存器中即可。
----------
跳转并切换状态
BX{}
Rm的第0位拷贝到cpsr的T位,其他位移入PC。
编码格式:
条件代码标识
31-28 19-16 15-12 3-0
NZCV 00010010 SB0 SB0 0001 Rm
cond:指令执行条件
:包含跳转指令的目标地址;Rm的bit【0】=0,目标地址处指令为ARM指令;如果bit【1】=1,目标地址处指令为Thumb指令。
----------
带状态切换的连接跳转指令
BLX
编码格式:
条件代码标识
31-28 24 23-0
1111 101 H Rm
target_add:指令的跳转目标地址;计算方法:
将24位扩展为32位立即数;
将结果左移两位;
将H(bit【24】)加到结果地址的第一位bit【1】;
将结果累加进程序计数器pc中。
BLX{comd}
Rm的第0位拷贝到cpsr的T位,其他位移入PC。
编码格式:
条件代码标识
31-28 19-16 11-8 3-0
NZCV 00010010 SB0 SB0 0011 Rm
cond:指令执行条件
Rm:寄存器Rm指定转移目标,Rm的bit【0】=1,跳转时自动将cpsr的标志位T置位,就是解释为Thumb,否则解释为ARM。
-------------------------------------------
数据处理指令:
算数运算指令
ADD:加
ADC:带进位的加
SUB:减
RSB:翻转减
SBC:带进位的减
RSC:带进位的翻转减
测试与测试指令
TST:测试
TEQ:测试相等
CMP:比较
CMN:负数比较
逻辑指令
BIC:位清0
AND:逻辑加
ORR:逻辑或
EOR:逻辑异或
编码格式:
条件代码标识
31-28 25 24-21 20 19-16 15-12 11-0
NZCV 00 I opcode S Rn Rd shiter_operand
I:区分第二操作偶数是立即数还是寄存器
S:标志指令的条件域是否更新cpsr
Opcode:操作符
Rd:指示目的寄存器
Rn:指示第一源操作寄存器
Shifter_operand:指示第二源操作数,可以是立即数,寄存器,寄存器移位三种形式:
数据处理指令的语法格式分两种:
算术运算和逻辑运算的格式:
{}{S} ,,
比较和测试的格式(没有Rd; S=1)
{} ,
-----
算数运算指令
ADD{}{S} ,,
将shifter_operand加Rn,结果存到Rd中。
ADC{}{S} ,, 带进位的加法,处理大于32位的加法
将shifter_operand加Rn,再加cpsr中的C标志位,结果存到Rd。
SUB{}{S} ,,
将Rn减shifter_operand,结果保存到Rd中。
SBC{}{S} ,, 带进位的减法,处理大于32位的减法
Rn减去shifter_operand,再减去cpsr中的C标志位的反码,结果保存到Rd。
RSB{}{S} ,, 翻转减,处理负数
shifter_operand减去Rn,结果保存到Rd。
RSC{}{S} ,, 带进位的翻转减,处理大于32位的负数
shifter_operand减去Rn,再减去cpsr中的C标志位的反码,结果保存到Rd。
|