微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 很好的 ARM指令集解析

很好的 ARM指令集解析

时间:11-21 来源:互联网 点击:

程序返回

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 <== [ R2 + R4(R4左移两位) ]

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】自动索引:自动索引也称为自动变址,有时为了修改基址寄存器的内容,使之指向数据

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top