大家好,欢迎来到IT知识分享网。
ARM指令集可以分为6类,即跳转指令、数据处理指令、程序状态寄存器PSR传输指令、Load/Strore指令、协处理器指令和异常中断指令。
一、跳转指令:
在ARM中,有两种方式可以实现程序的跳转:一种是跳转指令;另一种是直接向PC寄存器(R15)中写入目标地址值;
通过向PC寄存器写入目标地址值,可以实现4GB的空间任意跳转,这种跳转称为长跳转。如果在长跳转之前使用 MOV LR, PC,可以
保存将来返回的地址值,就实现了在4GB的地址空间中的子程序调用;
ARM的跳转指令可以从当前指令向前或者向后32MB的地址空间跳转,这类跳转指令有如下4种:
1、B(跳转指令)及BL(带返回的跳转指令)
B指令和BL指令均可以跳转到指令中的目标地址,这两个指令和目标地址处的指令都属于ARM指令集,二者都可以根据CPSR中条件标志位的值
和指令中的执行条件决定是否执行跳转操作,二者的不同之处在于B指令仅仅执行跳转操作,BL指令同时还将PC寄存器的值保存到LR寄存器中;
2、BLX指令:
BLX指令从ARM指令集跳转到指令中制定的目标地址,并将程序状态切换为Thumb状态,该指令同时将PC寄存器的内容
复制到LR寄存器中。当子程序为Thumb指令集,而调用者为ARM指令集时,可以通过BLX指令实现子程序调用和程序状态的
切换,子程序的返回可以通过将LR寄存器的值复制到PC寄存器中来实现。
3、BX指令:
二、数据处理指令:
数据处理指令可以分为3类:数据传送指令如MOV;算术逻辑运算指令如ADD、SUB和AND;比较指令如TST
1、MOV指令:
MOV指令可以完成以下功能:
1)、将数据从一个寄存器传送到另一个寄存器;
2)、将一个常数传送到一个寄存器中;
3)、实现单纯的移位操作;
4)、当PC寄存器作为目标寄存器时,可以实现程序跳转。
5)、当PC寄存器作为目标寄存器且指令中S位被设置时,指令在执行跳转操作的同时,将当前处理器模式的SPSR寄存器内容复制到
CPSR中,这样指令MOVS PC,LR可以实现从某些异常中断中返回。
2、MVN指令:
MVN指令有如下用途;
1)、响寄存器中传送一个负数;
2)、生成位掩码;
3)、求一个数的反码;
3、ADD加法指令:
ADD加法指令主要是显示两个操作数进行相加操作,
4、SUB减法指令:
5、AND逻辑与指令:
AND指令将shifter_operand表示的数值与寄存器Rn的值按位做逻辑与操作,并把结果保存到目标寄存器Rd中,
同时根据操作的结果更新CPSR中相应的条件标志位。
6、ORR逻辑或指令:
ORR指令将shifter_operand表示的数值与寄存器Rn的值按位做逻辑或操作,并把结果保存到目标寄存器Rd中,
同时根据操作的结果更新CPSR中相应的条件标志位。
7、EOR逻辑异或指令:
EOR指令将shifter_operand表示的数值与寄存器Rn的值按位做逻辑或操作,并把结果保存到目标寄存器Rd中,
同时根据操作的结果更新CPSR中相应的条件标志位。
8、BIC位清除指令:
BIC指令将shifter_operand表示的数值与寄存器Rn的值的反码按位做逻辑与操作,并把结果保存到目标寄存器Rd中,
同时根据操作的结果更新CPSR中相应的条件标志位。
9、CMP比较指令:
CMP指令从寄存器Rn中减去shifter_operand表示的数值,根据操作的结果更新CPSR中相应的条件标志位,
后面的指令就可以根据CPSR中相应的条件标志位来判断是否执行了。CMP指令与SUBS指令的区别在于
CMP指令不保存操作结果。
10、CMN基于相反数的比较指令:
11、TST位测试指令:
TST指令将shifter_operand表示的数值与寄存器Rn中的值按位做逻辑与操作,根据操作的结果更新CPSR
中相应的条件标志位。
12、TEQ相等测试指令:
TEQ指令将shifter_operand表示的数值与寄存器Rn中的值按位做逻辑异或操作,根据操作的结果更新CPSR
中相应的条件标志位。
三、乘法指令:
四、杂类的算术运算:
1、状态寄存器访问:
ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据,关于状态寄存器,注意几点:
1)、状态寄存器有些位当前没有使用,但是ARM将来的版本可能使用这些位;
2)、程序不能通过直接修改CPSR中的T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令
完成程序状态的切换;
3)、通常修改寄存器是通过读取-修改-写回的操作顺序来实现的;
4)、状态寄存器访问指令包括以下两条:
MRS:状态寄存器到通用寄存器的传送指令;
MSR:通用寄存器到状态寄存器的传送指令;
2、Load/Store内存访问指令:
Load指令用于从内存中读取数据放入到寄存器中,Store指令用户将寄存器中的数据保存到内存,
1)、LDR字数据读取指令:
LDR指令用于从内存中将一个32位的字读取到指令的中目标寄存器中。
2)、LDRB(字节数据读取指令)
LDRB指令用于从内存中将一个8位的字节数据读取到指令中的目标寄存器中,并将寄存器中的高24位清0操作。
3)、LDRBT(用户模式的字节数据读取指令)
LDRB指令用于从内存中将一个8位的字节数据读取到指令中的目标寄存器中,并将寄存器中的高24位清0操作。
当在特权级的处理器模式下使用本指令时,内存系统将改操作当做一般用户模式下的内存访问操作。
4)、LDRH(半字数据读取指令)
LDRH指令用于从内存中将一个16位的半字数据读取到指令中的目标寄存器中,并将寄存器的高16位清0.如果
指令中的内存地址不是半字对齐的,将会产生不可预知的结果。
5)、LDRSB(有符号的字节数据读取指令)
LDRB指令用于从内存中将一个8位的字节数据读取到指令中的目标寄存器中,并将寄存器中的高24位设置成该字节数据的符号位的值。
6)、LDRSH(有符号的半字数据读取指令)
LDRH指令用于从内存中将一个16位的半字数据读取到指令中的目标寄存器中,并将寄存器中的高16位设置成该字节数据的符号位的值。.如果
指令中的内存地址不是半字对齐的,将会产生不可预知的结果。
7)、LDRT(用户模式的字数据读取指令)
LDRB指令用于从内存中将一个32位的字节数据读取到指令中的目标寄存器中。
当在特权级的处理器模式下使用本指令时,内存系统将改操作当做一般用户模式下的内存访问操作。
8)、STR字数据写入指令
STR指令将一个32位的字数据写入到指令中指定的内存单元中。
9)、STRB(字节数据写入命令)
STRB指令用于将一个8位的字节数据写入到指令中指定的内存单元,改字节数据为指令中存放源操作数的寄存器的低8位。
10)、STRH(半字数据写入指令)
STRH指令用于将一个16位的半字数据写入到指令指定的内存单元,该半字数据为指令中存放源操作数的寄存器的低16位。
11)、STRT(用户模式的字数据写入指令)
STRT指令用于将一个32位的子数据写入到指令指定的内存单元
当在特权级的处理器模式下使用本指令时,内存系统将改操作当做一般用户模式下的内存访问操作。
12)、STRBT(用户模式的字节数据写入指令)
STRBT指令用于将一个8位的字节数据写入到指令指定的内存单元。
当在特权级的处理器模式下使用本指令时,内存系统将改操作当做一般用户模式下的内存访问操作。
3、批量Load/Store内存访问指令:
批量Load内存访问指令可以一次连续的内存单元中读取数据,传送到指令中的内存列表中的各个寄存器中。
批量Store内存访问指令可以将指令中寄存器列表中的各个寄存器值写入到内存中,内存的地址由指令中的须知模式确定。
五、信号量操作指令
信号量用于进程间的同步和互斥,对信号量的操作通常要求是一个原子操作,即在一条指令中完成信号量的读取和修改操作,
ARM提供一下两条指令来完成信号量的操作。
1)、SWP:交换指令;
SWP指令用于将一个内存字单元的内容读取到一个寄存区Rd中,同时将另一个寄存器Rm的内容写入到改内存单元中,如果
Rd和Rm为同一个寄存器时,指令交换该寄存器和内存单元的内容。
2)、SWBP:字节交换指令;
SWP指令用于将一个内存字单元的内容读取到一个寄存区Rd中,寄存器的高24位设置为0,同时将另一个寄存器Rm的内容
低8位数据值写入到改内存单元中,如果Rd和Rm为同一个寄存器时,指令交换该寄存器低8位和内存单元的内容。
六、异常中断产生指令
ARM有两条异常中断产生指令:
1、SWI:软中断指令,SWI用于产生SWI异常中断,ARM正式通过这种机制实现在用户模式中对操作系统特权模式的程序的调用;
2、BKPT:断点中断指令,主要用于产生软件断点,共调试使用。
七、协处理器指令
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/32201.html