ARM指令集

1 、LDR 和 STR

加载/存储字和无符号字节指令,使用单一数据传送指令(STR 和 LDR)来装载和存储,单一字节或字的数据从/到内存LDR指令用于从内存中读取数据放入寄存器中,STR指令用于将寄存器中的数据保存到内存。

指令格式如下:

LDR{cond}{T}   Rd,<地址>				;加载指定地址上的数据(字),放入 Rd 中 

STR{cond}{T}   Rd,<地址>				;存储数据(字)到指定地址的存储单元,要存储的数据在 Rd 中 

LDR{cond}B{T}  Rd,<地址>				;加载字节数据,放入 Rd 中,即 Rd 最低字节有效,高 24 位清零 

STR{cond}B{T}  Rd,<地址>				;存储字节数据,要存储的数据在 Rd,最低字节有效 

2、LDM 和 STM

批量加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数,LDM 为加载多个寄存器,STM 为存储多个寄存器,允许一条指令传送 16 个寄存器任何子集或所有寄存器。LDM /STM 的主要用途是现场保护、数据复制、参数传送等。

指令格式如下:

LDM{cond}<模式>   Rn{!},reglist{^} 
STM{cond}<模式>   Rn{!},reglist{^} 

LDMIA   R0!,{R3-R9}    				;加载 R0 指向的地址上的多字数据,保存到 R3~R9 中,R0 值更新 
STMIA   R1!,{R3-R9}    				;将 R3~R9 的数据存储到 R1 指向的地址上,R1 值更新 
STMFD   SP!,{R0-R7,LR} 				;现场保存,将 R0~R7、LR 入栈 LDMFD   SP!,{R0-R7,PC}^;恢复现场,异常处理返回 

3、 SWP

寄存器和存储器交换指令,SWP 指令用于将一个内存单元(该单元地址放在寄存器Rn 中)的内容读取到一个寄存器 Rd 中,同时将另一个寄存器 Rm 的内容写入到该内存单元中。

指令格式如下: SWP{cond}{B} Rd,Rm,[Rn]、

其中,B 为可选后缀,若有B,则交换字节,否则交换 32 位字;Rd 为数据从存储器加载到的寄存器;Rm 的数据用于存储到存储器中,若 Rm 与 Rn 相同,则为寄存器与存储器内容进行交换;Rn 为要进行数据交换的存储器地址,Rn 不能与 Rd 和 Rm 相同.

SWP 指令举例如下:

SWP      R1,R1,[R0]    	;将 R1 的内容与 R0 指向的存储单元的内容进行交换 

SWP      R1,R2,,[R0]    ;将R0指向的存储单元内容读取一字节数据到R1中(高24 位清零),并将R2的内容写入到该内存单元中(最低字节有效)

数据传送指令

4、MOV

数据传送指令,将 8 位图立即数或寄存器(operant2)传送到目标寄存器 Rd,可用于移位运算等操作。

指令格式如下:

MOV{cond}{S} Rd,operand2

MOV 指令举例如下:

MOV    R1#0x10         ;R1=0x10 
MOV    R0,R1           ;R0=R1 
MOVS   R3,R1,LSL #2    ;R3=R1<<2,并影响标志位 
MOV    PC,LR           ;PC=LR ,子程序返回 

5、MVN

数据非传送指令,将8 位图立即数或寄存器(operand2)按位取反后传送到目标寄存器(Rd),因为其具有取反功能,所以可以装载范围更广的立即数。

指令格式如下:

MVN{cond}{S} Rd,operand2

MVN 指令举例如下:

 MVN      R1,#0xFF  ;R1=0xFFFFFF00 
 MVN      R1,R2      ;将 R2 取反,结果存到 R1

算术逻辑运算指令

6、ADD

加法运算指令,将 operand2 数据与 Rn 的值相加,结果保存到 Rd 寄存器。

指令格式如下:

ADD{cond}{S} Rd,Rn,operand2

ADD 指令举例如下:

ADDS      R1,R1,#1       ;R1=R1+1 
ADD       R1,R1,R2       ;R1=R1+R2 
ADDS      R3,R1,R2,LSL #2 ;R3=R1+R2<<2

7、SUB

减法运算指令,用寄存器 Rn 减去 operand2.结果保存到 Rd 中。

指令格式如下:SUB{cond}{S} Rd,Rn,operand2

SUB 指令举例如下:

 SUBS    R0,R0,#1         ;R0=R0-1 
 SUBS    R2,R1,R2         ;R2=R1-R2 
 SUB     R6,R7,#0x10      ;R6=R7-0x10 

8、RSB

逆向减法指令,用寄存器 operand2 减法 Rn,结果保存到 Rd 中。

指令格式如下:RSB{cond}{S} Rd,Rn,operand2

RSB 指令举例如下:

 RSB   R3,R1,#0xFF00    	;R3=0xFF00-R1 
 RSBS  R1,R2,R2,LSL #2   	;R1=R2<<2-R2=R2×3 
 RSB   R0,R1,#0         	;R0=-R1

9、ADC

带进位加法指令,将 operand2 的数据与 Rn 的值相加,再加上 CPSR 中的 C 条件标志位,结果保存到 Rd 寄存器。

指令格式如下; ADC{cond}{S} Rd,Rn,operand2 ADC

指令举例如下:

ADDS   R0,R0,R2   
ADC    R1,R1,R3   ;使用 ADC 实现 64 位加法,(R1、R0)=(R1、R0)+(R3、R2) 

10、SBC

带进位减法指令。用寄存器 Rn 减去 operand2,再减去 CPSR 中的 C 条件标志位的非(即若 C 标志清零,则结果减去 1),结果保存到 Rd 中。

指令格式如下: SCB{cond}{S} Rd,Rn,operand2

SBC 指令举例如下:

 SUBS   R0,R0,R2 
 SBC    R1,R1,R3    ;使用 SBC 实现 64 位减法,(R1,R0)-(R3,R2)

11、RSC

带进位逆向减法指令。用寄存器 operand2 减去 Rn,再减去 CPSR 中的 C 条件标志位,结果保存到 Rd 中。

指令格式如下:RSC{cond}{S} Rd,Rn,operand2

RSC 指令举例如下:

RSBS     R2,R0,#0 
RSC      R3,R1,#0   ;使用 RSC 指令实现求 64 位数值的负数

12、AND

逻辑与操作指令,将 operand2 值与寄存器 Rn 的值按位作逻辑与操作,结果保存到Rd 中。

指令格式如下: AND{cond}{S} Rd,Rn,operand2

AND 指令举例如下:

ANDS     R0,R0,#x01  ;R0=R0&0x01,取出最低位数据 
AND      R2,R1,R3    ;R2=R1&R3 

13、ORR

逻辑或操作指令,将operand2的值与寄存器Rn的值按位作逻辑或操作,结果保存到Rd 中。

指令格式如下:ORR{cond}{S} Rd,Rn,operand2 ORR

指令举例如下:

ORR     R0,R0,#x0F    			;将 R0 的低 4 位置 1 
MOV     R1,R2,LSR #4 
ORR     R3,R1,R3,LSL #8 		;使用 ORR 指令将近 R2 的高 8 位数据移入到 R3 低 8 位 中 

14、 EOR

逻辑异或操作指令。将operand2的值与寄存器Rn的值按位作逻辑异或操作,结果保存到 Rd 中。

指令格式如下: EOR{cond}{S} Rd,Rn,operand2

EOR 指令举例如下

EOR     R1,R1,#0x0F 		;将 R1 的低 4 位取反 
EOR     R2,R1,R0    		;R2=R1^R0 
EORS    R0,R5,#0x01 		;将 R5 和 0x01 进行逻辑异或,结果保存到 R0,并影响标志位
console.log("公众号:虫术")
console.log("wx:spiderskill")
console.log("博客:https://404nofoundx.github.io/")
posted @ 2021-09-07 14:51  FalsePlus  阅读(79)  评论(0)    收藏  举报