一.概念:
指令集指一个微处理器所有指令的集合。处理器的指令集可以分为CISC(复杂指令集)和RISC(精简指令集),ARM处理器使用RISC。
处理器支持ARM和Thumb两种指令集:ARM指令集工作在32位模式下,指令长度都是32b;Thumb指令集工作在16位模式下,指令长度都是16b。
二.指令集种类
1.算术运算指令
1.1.ADD指令
ADD指令用与普通的加法运算。
格式:ADD{条件} {S} <dest>, <op_1>, <op_2>
//dest是目的寄存器,op_1和op_2是操作数dest=op_1+op_2
ADD指令把两个操作数op_1和op_2相加的结果存放到目的寄存器dest中,操作数op_1和op_2可以是寄存器或者是一个立即数。
例:
ADD R0, R1,R2 ; R0=R1+R2
ADD R0, R1,#256 ; R0=R1+256
ADD R0, R1,R3,LSL#1 ; R0=R1+(R3<<1)
1.2.ADC指令
ADC指令用于带进位的加法运算。
格式:ADC{条件} {S} <dest>, <op_1>, <op_2>
//dest是目的寄存器,op_1和op_2是操作数dest = op_1 + op_2 + carry
ADC指令把两个操作数op_1和op_2相加的结果存放到目的寄存器dest中。ADC指令使用一个进位标志位,可以进行大于32位的加法操作。
例:
;64位数结果:存放在寄存器R0和R1
;两个32位数:存放在寄存器R2和R3
ADCS R0,R2,R3 ;带进位加,结果保存在R0和R1寄存器
1.3.SUB指令
格式:SUB{条件} {S} <dest>, <op_1>, <op_2>
//dest是目的寄存器,op_1和op_2是操作数dest=op_1-op_2
SUB指令把两个操作数op_1和op_2相减的结果存放到目的寄存器dest中,操作数op_1和op_2可以是寄存器或者是一个立即数。
例:
SUB R0, R1,R2 ; R0=R1-R2
SUB R0, R1,#256 ; R0=R1-256
SUB R0, R1,R3,LSL#1 ; R0=R1-(R3<<1)
1.4.SBC指令
格式:SBC{条件} {S} <dest>, <op_1>, <op_2>
//dest是目的寄存器,op_1和op_2是操作数dest = op_1 - op_2 -! Carry
SBC指令把两个操作数op_1和op_2相减的结果存放到目的寄存器dest中.SBC指令支持借位标志,故可以支持大于32位的减法操作。
2.逻辑运算指令
2.1.AND指令
AND指令求连个操作数的逻辑与的结果
格式:AND{条件} {S} <dest>, <op_1>, <op_2>
//dest是目的寄存器,op_1和op_2是操作数dest=op_1 AND op_2
AND指令在两个操作数op_1和op_2做逻辑与操作,结果存放到目的寄存器dest中,AND指令常用于屏蔽寄存器中的某一位。op_1是寄存器,op_2可以是寄存器或者是一个立即数。
例:
AND R0, R0,#3 ;R0的第0位和第1位保持不变,其他位清零
2.2.EOR
EOR指令对两个操作数做异或运算。
格式:EOR{条件} {S} <dest>, <op_1>, <op_2>
//dest是目的寄存器,op_1和op_2是操作数dest=op_1 EOR op_2
EOR指令在两个操作数op_1和op_2做逻辑异或操作,结果存放到目的寄存器dest中,常用于设置某个特定反转。EOR指令中,op_1是寄存器,op_2可以是寄存器或者是一个立即数。
例:
EOR R0, R0,#3 ;R0的第0位和第1位被反转
3.MOV指令
MOV指令在两个操作数之间复制数据。
格式:MOV{条件} {S} <dest>, <op_1>
//dest是目的寄存器,op_1是操作数dest=op_1
MOV指令的作用是把另一个寄存器中,支持操作数的移位操作。
例:
MOV R0,R0 ;R0 = R0相当于没有操作
MOV R0,R0,LST#3 ;R0 = R0 * 8 LST寄存器左移3位,相当于乘8
4.分支指令
B指令可以根据设置的条件跳转到指定的代码地址。
格式; B{条件} <地址>
B指令是分支跳转指令。程序中遇到B指令会立即跳转到指定地址,然后继续从新的地址开始运行程序。
5.数据传送指令
数据传送指令用于CPU和存储器之间的数据传送,是ARM处理器唯一能与外部存储器交换数据的一类指令。
5.1.单一数据传送指令
单一数据传送指令用于内向存储。
格式:
LDR{条件} Rd;<地址>
STR{条件} Rd;<地址>
LDR{条件}B Rd;<地址>
STR{条件}B Rd;<地址>
单一数据传送指令STR和LDR可以在内存和寄存器之间装载或者存储一个或多个字节的数据,并提供了;灵活的寻址方式。Rd是要操作的数值,地址可以是基址寄存器Rbase和变址寄存器Rindex指定的地址。在条件后加入标志B代表一次传送1字节数据。
常见寻址方式:
STR Rd, [Rbase] ;存储Rd到Rbase所包含的有效地址
STR Rd, [Rbase,Rindex] ;存储Rd到Rbase+Rindex所合成的有效地址
STR Rd, [Rbase,#index] ;存储Rd到Rbase+index所合成的有效地址,index是立即数
5.2.多数据传送指令
多数据传送指令用于向内存装载和存储多个字节或字的数据。
格式; xxM{条件} {类型} Rn{!}, <寄存器列表>{^}
其中,xx可以是LD(装载),也可以是ST(存储).多数据传送指令用于寄存器和内存之间多个数据的复制。
指令包括:
LDMED LDMIB ;装载前增加地址,相当于C语言的++p
LDMFD LDMIA ;装载前增加地址,相当于C语言的p++
LDMEA LDMDB ;装载前增加地址,相当于C语言的++*p
LDMFA LDMDA ;装载前增加地址,相当于C语言的*p++
STMFA STMIB ;存储前增加地址
STMEA STMIA ;存储后增加地址
STMFD STMDB ;存储前增加值
STMED STMDA ;存储后增加值
附:
ARM处理器支持的移位操作:
LSL 逻辑左移 寄存器的二进制位从右往左移动,空出的位补0
LSR 逻辑右移 寄存器的二进制位从左往右移动,空出的位补0
ASR 算术右移 移位过程中符号位不变,即如果源操作数是正数,则字的高端空出的位补0否则补1
ROR 循环右移 寄存器的低端移出的位填入字的高端空出的位
RRX 带扩展的循环位移 操作数右移一位,高端空出的位用原C标志值填充
标签:总结,操作数,R0,dest,指令,指令集,寄存器,ARM,op From: https://blog.51cto.com/u_15834920/5767607