ARM指令集

来源:互联网 发布:淘宝访客计算方式 编辑:程序博客网 时间:2024/06/08 01:17
1.跳转指令(B,BL,BLX,BX)
B 跳转指令:
格式:B 目标地址
直接跳转到目标地址执行

BL 带返回的跳转指令
格式:BL label;
将PC保存到R14中,然后跳转到label处执行

BLX 带返回和状态切换的跳转指令
格式:
从ARM指令集跳转到指令所指定的目标地址,并将工作状态由ARM切换到Thumb指令集,同时将PC保存到R14中。
(例如:当调用者使用的时ARM指令集而子程序使用的是Thumb指令集时,可以使用这条指令)

BX 带状态切换的跳转指令
格式:BX 目标地址
目标地址可以使ARM指令也可以时Thumb指令

2.数据处理指令(MOV,MVN,CMP,CMN,TST,TEQ,ADD,SUB,SBC,TSB,TSC,AND,ORR,EOR,BIC)
MOV 数据传送指令
格式:MOV {S} 目的寄存器, 源操作数;
从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器,其中S选项决定指令的操作是否影响CPSR中条件标志位的值,
没有S选项时不更新CPSR中条件标志位的值
例如:MOV R0, #0;

MVN 数据取反传送指令
格式:MVN{S} 目的寄存器, 源操作数;
同MOV相似,只是将取出的内容取反在送入目的寄存器
例如:MVN R0, #0;//将立即数0取反得-1放入R0
//1......1表示-1,例如char a = -127;其二进制原码为10000001,其反码为11111110,补码为11111111
//正数的原码反码补码均相同,均为原码的值,即原码、反码、补码是为了简化负数的计算引进的,对正数没有意义。
//补码 = 反码+1
//计算机中负数是以其补码的形式存在的

CMP 比较指令
格式:CMP 操作数1, 操作数2;
把操作数1和2相减,同时更新程序状态寄存器CPSR中条件标志位的值。

CMN 反值比较指令
格式:CMN 操作数1, 操作数2;
将操作数1和2相加,根据结果设置CPSR条件标志位

TST 位测试指令
格式:TST 操作数1, 操作数2;
将操作数2和操作数1进行位与,根据结果设置CPSR条件标志位。
操作数1是要测试的值,操作数2一般是一个寄存器或是一个位掩码,用来测试操作数中的某一位是否设置。
例如:TST R1, #%1;//%表示二进制

TEQ 相等测试指令
格式:TEQ 操作数1, 操作数2;
将操作数2和操作数1按位异或,根据结果设置CPSR条件标志位。即比较操作数1和2是否相等

ADD 加法指令
格式:ADD{S} 目的寄存器, 操作数1,操作数2;
将操作数1和2相加放入目的寄存器。

ADC 带进位的加法指令
格式:ADC{S} 目的寄存器, 操作数1,操作数2;
将操作数1和2相加再加上CPSR中的C条件标志位,将结果放入目的寄存器
例如:ADCS R0, R1, R2;

SUB 减法指令
格式:SUB{S} 目的寄存器, 操作数1,操作数2;
操作数1减去操作数2,将结果放入目的寄存器。

SBC 带借位的减法指令
格式:SBC{S} 目的寄存器, 操作数1,操作数2;
将操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果放入目的寄存器,并根据结果设置CPSR的条件标志位。
例如:SUBS R0, R1,R2;//R0 = R1 - R2 -!C;

RSB 逆向减法指令
格式:RSB{S} 目的寄存器, 操作数1,操作数2;
操作数2减去操作数1,其余同SUB。

RSC 带借位的逆向减法指令
格式:RSC{S} 目的寄存器, 操作数1,操作数2;
操作数2减去操作数1,其余同理SBC。

AND 逻辑与指令
格式:AND{S} 目的寄存器, 操作数1,操作数2;
将操作数1和操作数2进行逻辑与,将结果保存在目的寄存器中。

ORR 逻辑或指令
格式:ORR{S} 目的寄存器, 操作数1,操作数2;
将操作数1和操作数2进行逻辑或,将结果保存在目的寄存器中。

EOR 逻辑异或指令
格式:EOR{S} 目的寄存器, 操作数1,操作数2;
将操作数1和操作数2进行逻辑异或,将结果保存在目的寄存器中。

BIC 位清除指令
格式:BIC{S} 目的寄存器, 操作数1,操作数2;
用于清楚操作数1的某些位,并将结果放入目的寄存器。
例如:BIC R0,R0,#%1011;//将0、1、3位清零,其余位保留

3.乘法指令和乘加指令(MUL,MLA,SMULL,SMLAL,UMULL,UMLAL)
!!所有的操作数只能位通用寄存器且目的寄存器不能和操作数1相同。

MUL 32位乘法指令
格式:MUL{S} 目的寄存器, 操作数1,操作数2;
1乘2放入目的寄存器。


MLA 32位乘加指令
格式:MLA {S} 目的寄存器, 操作数1,操作数2, 操作数3;
1乘2加3放入目的寄存器;

SMULL 64位有符号数乘法指令
格式:SMULL{S} 目的寄存器Low, 目的寄存器High, 操作数1, 操作数2;
1乘2,低32位放Low,高32位放High;

SMLAL 64位有符号数乘加指令
格式:SMLAL{S} 目的寄存器Low, 目的寄存器High, 操作数1, 操作数2;
1乘2,低32位和Low相加放入Low,高32位和High相加放入High;

UMULL 64位无符号数乘法指令
格式:UMULL{S} 目的寄存器Low, 目的寄存器High, 操作数1, 操作数2;
同理;
UMLAL 64位无符号数乘加指令
格式:UMLAL{S} 目的寄存器Low, 目的寄存器High, 操作数1, 操作数2;
同理;

4.程序状态寄存器访问指令(MRS, MSR)
MRS 程序状态寄存器到通用寄存器的数据传送指令
格式:MRS{条件} 通用寄存器, 程序状态寄存器(CPSR或SPSR)
一般适用于要(修改程序状态寄存器的内容时,读出到通用寄存器,修改再写回;)
(在异常处理或进程切换时,保存程序状态寄存器的值;)

MSR 通用寄存器到程序状态寄存器的数据传送指令
格式:MSR 程序状态寄存器(CPSR或SPSR)_<域>, 操作数;
32位程序状态寄存器可分为4个域:
位[32:24]为条件标志位域,用f表示
位[23:16]为状态位域,用s表示
位[15:8]为扩展位域,用x表示
位[7:0]位控制位域,用c表示
例如:MSR CPSR, R0;
 MSR CPSR_C, R0;//仅修改控制域位;

5,加载/存储指令(LDR,LDRB,LDRH,STR,STRB,STRH)
LDR 字数据加载指令
格式:LDR 目的寄存器, <储存器地址>;
从储存器中将一个32位的字数据传送到目的寄存器中。
当目的寄存器为PC是,跳到该地址执行。
储存器地址参考寻址方式,十分灵活;

LDRB  字节数据加载指令
格式:LDRB 目的寄存器, <存储器地址>;
从存储器中将一个8位的字节数据传送到目的寄存器,同时将高 24位清零。
当目的寄存器为PC是,跳到该地址执行。

LDRH 半字数据加载指令
格式:LDRH 目的寄存器, <存储器地址>;
从存储器中将一个16位的半字数据传送到目的寄存器,同时将高 16位清零。
当目的寄存器为PC是,跳到该地址执行。

STR  字数据存储指令
格式:STRB 源寄存器, <存储器地址>;
从源寄存器中将一个32位的字数据传送到存储器地址。

STRB  字节数据存储指令
格式:STR 源寄存器, <存储器地址>;
从源寄存器中将一个8位的字节数据传送到存储器地址。

STRH  半字数据存储指令
格式:STRH 源寄存器, <存储器地址>;
从源寄存器中将一个16位的半字数据传送到存储器地址。

6,批量数据加载/存储指令(LDM,STM)
LDM 批量数据加载指令
格式:LDM(或STM){类型} 基址寄存器{!}, 寄存器列表{^};
多用于将多个寄存器的内容入栈或出栈。
类型:
IA 每次传送后地址加1
IB 每次传送前地址加1
DA 每次传送后地址减1
DB 每次传送前地址减1
FD 满递减堆栈
ED 空递减堆栈
FA 满递增堆栈
EA 空递增堆栈
{!}加上的话将最后的地址写入基址寄存器
{^}加上的话,当指令位LDM,且寄存器列表中包含R15时,除了正常的数据传送外还将SPSR复制到CPSR。
同时还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

7,数据交换指令(SWP,SWPB)
SWP 字数据交换指令
格式:SWP 目的寄存器, 源寄存器1, [源寄存器2]
将源寄存器2所指向的存储器中的字数据传送到目的寄存器中,同时源寄存器1中的字数据传送到源寄存器2所指向的存储器中。
显然,当源寄存器1和目的寄存器是同一个寄存器时。该指令为交换数据。
例如: SWP R0,R0,[R3];

SWPB 字节数据交换指令
格式:SWP{条件}B 目的寄存器, 源寄存器1, [源寄存器2]
存储器中的字节数据传送到目的寄存器会将目的寄存器的高24位清零,其余同理;

8,移位指令(LSL,ASL,LSR,ASR,ROR,RRX)
LSL 逻辑左移
格式:通用寄存器, LSL(或ASL) 操作数;
例如:MOV R0, R1, LSL#2;//将R1左移两位后传送到R0中;
补0;

LSR 逻辑右移
格式:通用寄存器, LSR(或ASR) 操作数;
(算术右移,如果最高位为1,则补1,否则补0, 如将10000000算术右移7位,应该变成11111111,
 而逻辑右移7位,则不考虑符号位,变为00000001,这点就是算术右移和逻辑右移的区别。)

ROR 循环右移
格式:通用寄存器, ROR 操作数;
移出的低位补高位;
操作数可以为寄存器也可以为立即数;

RRX 带扩展的循环右移
格式:通用寄存器,RRX 操作数;
右移时,左端用仅为标志位C来填充;


9,协处理器指令(CDP,LDC,STC,MCR ARM MRC)
CDP 协处理器数操作指令
格式:CDP 协处理器编码, 协处理器编码1, 目的寄存器, 源寄存器1,源寄存器2, 协处理器编码2;
用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。
协处理器编码1和2时协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,不涉及ARM处理器的寄存器和存储器。
例如:CDP P3, 2, C12, C3, 4;//该指令完成且处理器P3的初始化;

LDC 协处理器数据加载指令
格式:LDC{L} 协处理器编码, 目的寄存器, [源寄存器];
将源寄存器中所指向的存储器中的字数据传送到目的寄存器,若协处理器不能成功执行传送操作,则产生未定义指令异常;
例如:LDC P3, C4, [R0];//将ARM处理器的寄存器R0所指向的存储器中的字数据传送到协处理器P3的寄存器C4中;

STC 协处理器数据存储指令
格式:STC{L} 协处理器编码,源寄存器, [目的寄存器]
将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成特定的操作,则产生未定义指令异常。

MCR ARM处理器寄存器到协处理器寄存器的数据传送指令
格式:MCR 协处理器编码,协处理器操作码1,源寄存器, 目的寄存器1,目的寄存器2, 协处理器操作码2;
将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成特定的操作,则产生未定义指令异常。
协处理器编码1和2是协处理器将要执行的操作,源寄存器位ARM处理器的寄存器,目的寄存器1和2为协处理器的寄存器
例如:MCR P3, 3, R0,C4,C5, 6;//将R0中的数据传送到协处理器P3中的寄存器C4和C5中;

MRC 协处理器寄存器到ARM处理器寄存器的数据传送指令
格式:MRC 协处理器编码,协处理器操作码1,目的寄存器, 源寄存器1,源寄存器2, 协处理器操作码2;
同理

































原创粉丝点击