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/")
|