很好的 ARM指令集解析
程序返回
MOV R1,R0,LSL #3 ;将寄存器R0的值左移3位后传送到R1
MOV R0,#5 ;将立即数5传送到寄存器R0
MVN R0,#0 ;将立即数0按位取反后传送到寄存器R0中,完成后R0 = -1
MVN R1,R2 ;将R2按位取反后,结果存到R1
3、移位指令:LSL、LSR、ASR、ROR、RRX
MOV R0,R1,LSL #1 ;寄存器R1左移一位后传送到R0
MOVS R0,R1,LSL #1 ;寄存器R1左移一位后传送到R0,并更新状态标志位
MOVS R0,R1,LSR #1 ;寄存器R1右移一位后传送到R0,并更新状态标志位
MOVS R0,R1,ASR #1 ;寄存器R1算术右移一位后传送到R0,并更新状态标志位
;算术右移,第一位符号位不变
MOV R0,R1,ROR #1 ;寄存器R1循环右移一位后传送到R0
MOVS R0,R1,RRX ;寄存器R1循环右移一位后传送到R0,用C标志位作为最高位扩展
4、算术指令:ADD、ADC、SUB、SBC、RSB、RSC
ADD R0,R1,R2 ;寄存器R1和R2的值相加后传送到R0
ADD R0,R1,#5 ;寄存器R1的值加上5后传送到R0
ADD R0,R1,R2,LSL #2 ;寄存器R2左移两位后与R1相加,得到的结果传送到R0
ADD R0,R1,R2,LSL R3 ;寄存器R2左移R3后与R1相加,得到的结果传送到R0
ADDS R0,R2,R4 ;64位加,低位放在R0
ADC R1,R3,R5 ;64位加,高位放在R1,注意要加上低位的进位
SUB R0,R1,R2 ;寄存器R1和R2的值相减后传送到R0
SUB R0,R1,#6 ;寄存器R1的值减6后传送到R0
SUB R0,R1,R2,LSL #1 ;R1与寄存器R2左移一位后的值相减,得到的结果传送到R0
SUBS R0,R2,R4 ;64位减,低位放在R0
SBC R1,R3,R5 ;64位减,高位放在R1,注意要减去低位的借位
RSB R0,R1,R2 ;寄存器R2和R1的值相减后传送到R0,注意是R2-R1,方向相反
RSB R0,R1,#6 ;6与寄存器R1的值相减后传送到R0
RSB R0,R1,R2,LSL #1 ;寄存器R2左移一位后与R1相减,得到的结果传送到R0
RSC R0,R1,R2 ;寄存器R2和R1的值相减,再减去借位后传送到R0
5、逻辑运算指令:AND、ORR、EOR、BIC
AND R0,R0,#0xF ;R0的值与0xF相位与后的值传送到R0
ORR R0,R0,#9 ;R0的值与9相位与后的值传送到R0
EOR R0,R0,#0xF ;R0的值与0xF相异或后的值传送到R0
BIC R0,R0,#9 ;位清除指令R0的第0位和第3位清零
6、比较指令:CMP、CMN、TST、TEQ
CMP R1,#10 ;将寄存器R1的值与10相减,并设置CPSR标志位
ADDGT R0,R0,#5 ;如果R1>10,则执行ADDGT指令,将R0加5
CMN R0,R1 ;R0 - (-R1),反值比较,影响CPSR标志位
CMN R0,#10 ;R0 - (-10),反值比较,影响CPSR标志位
TST R1,#3 ;检查R1中第0位和第1位是否为1,根据结果更新条件标志位
TEQ R1,R2 ;将寄存器R1的值与寄存器R2的值进行按位异或,
;并根据结果设置CPSR的标志位
7、乘法指令:MUL、MLA、SMULL、SMLAL、UMULL、UMLAL
MUL R0,R1,R2 ;R1和R2相乘的结果发送到R0
MULS R0,R1,R2 ;R1和R2相乘的结果发送到R0,同时设置CPSR的相关条件标志位
MLA R0,R1,R2,R3 ;R1和R2相乘的结果再加上R3后发送到R0
MLAS R0,R1,R2,R3 ;R1和R2相乘的结果再加上R3后发送到R0,更新CPSR标志位
SMULL R0,R1,R2,R3 ;R2和R3相乘的结果的低32位放在R0,高32位放在R1
SMLAL R0,R1,R2,R3 ;R2和R3相乘的结果的低32位加上R0后放在R0,
;高32位加上R1后放在R1
UMULL R0,R1,R2,R3 ;无符号数相乘,结果与SMULL类似
UMLAL R0,R1,R2,R3 ;无符号数乘加,结果与SMLAL类似
ARM数据加载和存储指令:
1、数据加载和存储的方向。寄存器到存储器方向:Store;从存储器到寄存器方向:Load
数据加载和存储指令共有三种类型:单寄存器加载和存储指令,多寄存器加载和存储指令 和 交换指令
2、数据加载与存储器指令寻址
LDR R5,[R6,#0x08] ;R6寄存器加0x08的和的地址值内的数据传送到R5
STR R6,[R7],#-0x08 ;R6寄存器的数据传送到R7存储的地址值指向的存储空间,
;同时更新R7寄存器的内容为R7-0x08
LDR R5,[R6,R3] ;R6寄存器加R3的和的地址值内的数据传送到R5
STR R6,[R7],-R8 ;R6寄存器的数据传送到R7存储的地址值指向的存储空间,
;同时更新R7寄存器的内容为R7-R8
LDR R3,[R2,R4,LSL #2] ;R3 <== [
LDR R3,[R2],-R4,LSR #3 ;R3 <== [ R2 ],R2 = R2-R4(R4右移三位)
LDR R4,START ;将标号START标定的空间的数据加载到R4中
3、地址索引:前索引、自动索引、后索引
1】前索引:前索引也称为前变址,这种索引是在指令执行前把偏移量和基址相加减,得到的值作为变量的地址。如:
LDR R5,[R6,#0x04]
STR R0,[R5,-R8]
2】自动索引:自动索引也称为自动变址,有时为了修改基址寄存器的内容,使之指向数据
ARM指令集解 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)