目录
- 1 指令系统
- 2 寻址方式
- 2 ARM指令
- 2.1 ARM 指令代码格式
- 2.2 ARM 指令集
- 3 Thumb指令集
- 2.4 ARM处理器支持的汇编伪指令
- PLUS
1 指令系统
1.1 基本概念
指令:指示计算机执行某种操作的命令
指令码:表示指令的二进制代码
指令格式:指令码的编码规则。操作码+操作数(地址码)
- 操作码:指明指令的操作性质和功能
- 操作数: 指令涉及的操作数有关信息
指令系统:机器包含的全部指令
机器字长:计算机能直接处理的二进制数据位数。
指令长度
- 单字长指令
- 半字长指令
- 双字长指令
原则:尽可能短;字节整数倍
1.2分类
6种类型(53种主要助记符) :
数据处理指令(22种主要助记符)
跳转指令(4种主要助记符)
Load/Store指令(16种主要助记符)
程序状态寄存器指令(2种主要助记符)
协处理器指令(5种主要助记符)
软件中断指令 (2种主要助记符)
机器字长:word
1.3 指令格式
不同的处理器指令长度、支持的操作码数量不同。由厂家设计
操作码
规整型和非规整型
通常在指令的最高位
地址码
参与操作的数据(地址),来源,去处
根据地址数,可分为
零地址指令,一地址指令,二地址指令,三地址指令,多地址指令
1)零地址指令
2)1地址指令
3)2地址指令
ADD R0,R1 R0 R1寄存器内容加,存到R1
ADD ( R0 ),R1 ()表示取内容,类似*
4)3地址指令
eg
64KB存储器,寻址
存储单元为1Byte , 16bits 地址码,16根地址线寻址
存储单元为4Bytes , 14bits 地址码
1.4 指令类型
(1)数据传输类
(2)数据运算类
3、 移位运算
(3)程序控制类
(4)输入输出类
(5)字符串处理类
(6)处理机控制类
(6)特权指令类
常用的操作数符号
2 寻址方式
根据指令给的地址码字段,寻找真实操作数地址的方式
形式地址:指令中给出的地址
有效地址:操作数的真正地址(物理地址)
1 立即寻址
一般立即数以常数形式出现的。常数可以是二进制数、十进制数、十六进制数、字符串。
(1)地址字段给出的可以立即使用的操作数实际值
MOV R0,#5 ;R0=5
2 寄存器寻址
通用寄存器(GR)用以存放操作数、操作数的地址或中间结果;
指令寄存器(IR)用以存放当前正在执行的指令,以便在指令执行的过程中,控制完成一条指令的全部功能。
AX 寄存器称为累加器,常用于存放算术、逻辑运算中的操作数或结果。另外,所有的I/O指令都要使用累加器与外设接口传递数据。
BX 寄存器称为基址寄存器,常用来存放访问内存时的地址。
CX 寄存器称为计数寄存器,在循环、串操作指令中用作计数器。
DX 寄存器称为数据寄存器,在寄存器间接寻址中的I/O指令中存放I/O端口的地址。
编号,存着操作数
寄存器移位寻址
3直接寻址
形式地址等于有效地址
在通常情况下,操作数存放在数据段中。所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址(偏移)直接形成。若使用段前缀,则操作数从段前缀指定的段读取。
物理地址=(DS)×16+EA
例如: MOV AX, [2000H] ; DS=3000H;内存单元32000H的值为5030H。
4寄存器间接寻址
5 间接寻址
6基址寻址
7变址寻址
基址寻址与变址比较
基址: 基址值(大)+形式地址(小)=有效地址
变址:变址值(小)+形式地址(大)=有效地址
8 相对寻址
9多寄存器寻址(块拷贝寻址)
10堆栈寻址
堆栈等价
11 复合寻址
ref
https://www.cnblogs.com/lilongjiang/category/304646.html
2 ARM指令
2.1 ARM 指令代码格式
对应前述,为三地址码指令
条件代码域[31:28]
助记符后缀可放在指令后面
0000 EQ 执行条件
B 意味着条件域是AL 1110,arm指令默认无条件执行
加上S的影响CPSR,有进位计算标志的影响
eg
使用第二个操作数
8bits 常熟循环移位偶数位得到
支持的寻址方式
7种
总的就是搞清楚谁是基地址,谁是偏移量,谁是目的地
把某个寄存器当做基地址寄存器
把PC的值作为基地址,指令中地址作为偏移量
2.2 ARM 指令集
(53种主要助记符)
2.2.1 跳转指令
用于控制程序的执行流程、程序跳转、指令的特权等级和在ARM代码与Thumb代码之间进行转换;
(1) B
指令格式
B {cond} label
- cond表示指令执行条件
- label表示有符号地址,相对当前PC偏移量
功能
跳转到指定地址执行,地址范围限制在当前指令的±32MB范围
eg
BACKWARD CMP R1,#0 ;比较R1和0
BEQ FORWARD ;若=0跳转到FORWARD
SUB R1,R2,#3
FORWARD ADD R1,R2,#4
B BACKWARD ;跳转到BACKWARD
(2) BL
指令格式:BL{cond} label
- cond表示指令执行条件
- Label表示有符号地址,相对当前PC偏移量
- 功能:带链接的跳转指令。指令将下一条指令的地址复制到R14(即LR)链接寄存器中,然后跳转到指定地址运行程序
BL FUNC ;保护断点,跳转到子程序
ADD R1,R2,#2 ;子程序调用后返回执行的语句
…
FUNC ;子程序
… ;子程序代码
MOV R15,R14 ;复制返回地址到PC,实现子程序的返回
(3) BX
指令格式:BX{cond} Rm
- cond表示指令执行条件
- Rm 寄存器,值是绝对地址值,不是偏移量,在指令执行后,Rm中的地址值被复制到程序计数器PC
Rm[0]为1时,强制程序从ARM指令状态跳转到Thumb指令状态
Rm[0]为0时,强制程序从Thumb 指令状态跳转到ARM指令状态 - 功能: 跳转到指令中所指定的目标地址,并实现状态切换
CODE32 ;32位编码
ARM1 LDR R0,=Thumb1+#1 ;把Thumb地址赋给R0,末位置1
MOV LR,PC ;设置返回地址
BX R0 ;跳转,切换状态
ADD R1,R2,#2
CODE16 ;16位编码
Thumb1 ADD R1,R3,#1 ;Thumb程序
…
BX LR ;跳转到返回地址,状态切换
(4) BLX
指令格式:BLX{cond} label|Rm
-
cond表示指令执行条件
-
label表示有符号地址,相对当前PC偏移量
- Rm 寄存器,值是绝对地址值,不是偏移量,在指令执行后,Rm中的地址值被复制到程序计数器PC
Rm[0]为1时,强制程序从ARM指令状态跳转到Thumb指令状态
Rm[0]为0时,强制程序从Thumb 指令状态跳转到ARM指令状态
- Rm 寄存器,值是绝对地址值,不是偏移量,在指令执行后,Rm中的地址值被复制到程序计数器PC
-
功能: 跳转到指令中所指定的目标地址,实现状态切换,同时将R15的值保存到R14中
2.2.2存储器访问指令
用于控制在存储器和寄存器之间的数据传输、交换、加载/存储
ARM只有两种数据传送:
- 数据从寄存器到存储器的传送称作存储
- 数据从存储器到寄存器的传送称作加载
常用的加载/存储指令分为三类:
- 单寄存器存取指令LDR和STR
单寄存器的存取指令传送的数据可以是8位字节、16位的半字或是32位字; - 多数据传送指令LDM和STM
用于进程的进入和退出、保存和恢复工作寄存器以及复制存储器中的一块数据; - 数据交换指令SWP和SWPB
存储器和寄存器之间的数据交换
(1) 单寄存器存取指令
LDR和STR
根据传送数据的类型不同,单寄存器存取指令可分为两种形式:
-
单字
-
半字
-
字节
1)LDR
包括
2)LDRB
3)LDRH
4)STR
5)STRB
6)STRH
(2) 批量数据存取指令
1)LDM
出栈
2)STM
入栈
堆栈操作
1)建栈
2)进/出栈
(3) 数据交换指令
1)SWP
2)SWPB
2.2.3 数据处理指令
用于操作片上的ALU、桶型移位器、乘法器以完成在31个32位的通用寄存器之间的高速数据处理
(22种主要助记符)
只能对寄存器的内容进行操作,一般不用R15
比较指令CMP、CMN、TST和TEQ不需要后缀S,它们会直接影响状态标志。
所有ARM数据处理指令均可选择使用S后缀,以影响状态标志。
(1) 数据传送指令
用在寄存器之间进行数据和数据取反传送,也用在寄存器与第二操作数之间进行数据和数据取反传送。2
1)MOV
2)MVN
(2) 算术和逻辑运算指令
1)ADD
2)SUB
3) ADC
4)SBC
5)RSB
6)RSC
7)AND
8)ORR
9)EOR
10)BIC
(3) 比较测试指令
4
1)CMP
功能:比较指令。把Rn寄存器的内容和另一个操作数operand2作减法比较,同时更新CPSR中条件标志位的值,但不存储结果,只是刷新CPSR条件标志位,表示两个操作数大小关系
2)CMN
功能:取反比较指令。把Rn寄存器的内容和另一个操作数operand2作取反后比较,同时更新CPSR中条件标志位的值,但不存储结果,只是刷新CPSR条件标志位
3)TEQ
功能:相等测试指令。用于把寄存器的内容与第二操作数进行按位异或运算,不保留结果,但更新CPSR条件标志位,常用来比较操作数1和操作数2是否相等
4)TST
功能:位测试指令。把寄存器Rn与第2操作数按位进行逻辑与运算,不保留结果,刷新CPSR条件标志位,常用来测试指定位
TST R1,#3 ;测试R1值第0位和1位是否为1
(4) 乘法指令
6个,分为两类,分别是32位和64位
乘法指令不支持第2操作数为立即数
Rd、RdHi、RdLo不能与Rm为同一寄存器
RdHi、RdLo不能为同一寄存器
避免将R15定义为任一操作数或结果寄存器
CPSR状态寄存器的设置是任意的,在指令中被S位所控制
结果寄存器不能与第一源寄存器相同
指令中的所有操作数、目标寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目标寄存器和操作数1必须是不同的寄存器。
只保留32位结果的乘法指令,不需要区分有无符号数,因为无论是否有符号,结果的最低有效32位是一样的。
1)MUL
功能:32位乘法指令,将Rm和Rs中的值相乘,结果的低32位保存到Rd中 ,
即Rd←Rm*Rs (Rd≠Rm)
MULS R0,R1,R2;R0=R1*R2,同时设置CPSR中相关条件标志
2)MLA
功能:32位乘加指令,将Rm和Rs相乘,再将乘积加上第3个操作数Rn,结果的低32位保存到Rd中
MLA R0,R1,R2,R3 ;R0=R1*R2+R3
MLAS R0,R1,R2,R3 ;R0=R1*R2+R3,且设置标志位
3)UMULL
功能:无符号数64位长乘指令。将Rm与Rs相乘,结果的低32位放置到目标寄存器RdLo中,高32位放置到目标寄存器RdHi中
UMULL R0,R1,R2,R3;R0=(R2*R3)低32位
;R1=(R2*R3)高32位
4)UMLAL
功能:无符号数64位长乘加指令。将Rm与Rs相乘,再加上64位原目标寄存器值,结果的低32位放置到目标寄存器RdLo中,高32位放置到目标寄存器RdHi中
UMLAL R0,R1,R2,R3 ;R0=(R2×R3)的低32位+R0,
R1=(R2×R3)的高32位+R1
5)SMULL
功能:有符号数64位长乘指令。将Rm与Rs相乘,结果的低32位放置到目标寄存器RdLo中,高32位放置到目标寄存器RdHi中
6)SMLAL
功能:有符号数64位长乘加指令。将Rm与Rs相乘,结果再分别加上目标寄存器值,低32位放置到目标寄存器RdLo中,高32位放置到目标寄存器RdHi中
(5)移位指令
6
1)LSL ASL
功能:逻辑左移,将Rm寄存器值按opl所指定的数量向左逻辑移位,末位填0。每左移一位相当于无符号乘以2
逻辑左移与算术左移功能是一样的,所以ASL指令等价于LSL指令。
2)LSR
功能:逻辑右移,将Rm寄存器值按opl所指定的数量向右逻辑移位,空出的高位填0。每右移一位相当于无符号除以2
3)ASR
功能:算术右移,将Rm寄存器值按opl所指定的数量向右算术移位,空出的高位用符号位填空,每右移一位相当于有符号除以2
4)ROR
功能:循环右移,将Rm寄存器值按opl所指定的数量向右循环移位
5)RRX
功能:带进位标志循环右移,将Rm寄存器值按opl所指定的数量向右循环移位,高位由原进位标志值填入,低位移出的值进入进位标志
(4)程序状态指令
(1)MRS指令
(2)MSR指令
(5)协处理器指令
用于控制外部的协处理器,以开放统一的方式用于片外功能指令集
对于协处理器指令,如果没有协处理器接受到这一条指令,则产生未定义指令异常;如果协处理器不能成功地应答这些指令,也将产生未定义指令异常。
(1)CDP指令
功能:协处理器数据操作指令。ARM处理器通过CDP指令通知ARM协处理器执行特定的操作。该操作由协处理器完成,即对命令参数的解释与协处理器有关,指令的使用取决于协处理器。若协处理器不能成功地执行该操作,将产生未定义指令异常中断
(2)LDC 指令
LOAD /STORE
LDC与STC统称为协处理器数据传送指令,用来在存储器与协处理器之间进行数据传送操作,对协处理器一方,要指明对哪个协处理器操作和对协处理器的哪个寄存器操作,对另一方,要指明寄存器的地址,这与地址的寻址方法相同。
功能:LDC协处理器数据读取指令。LDC指令从某一连续的内存单元将数据读取到协处理器的寄存器中。协处理器数据的传送,由协处理器来控制传送的字数。若协处理器不能成功地执行该操作,将产生未定义指令异常中断
(3)STC指令
功能:STC协处理器数据写入指令。将协处理器寄存器数据写入到某一连续的内存单元中,协处理器的数据传送,由协处理器来控制传送的字数。若协处理器不能成功地进行操作,将产生未定义指令异常中断
(4)MCR指令
MRC与MCR指令统称为协处理器寄存器传送指令。在ARM和协处理器寄存器之间传送数据有时是有用的,这些协处理器寄存器传送指令使得协处理器中产生的整数能直接传送到ARM寄存器或者影响ARM的条件码标志位。
功能:ARM寄存器到协处理器寄存器的数据传送指令,将ARM处理器寄存器数据传送到协处理器寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中断
(5)MRC指令
功能:将协处理器寄存器的数据传送到ARM寄存器,若协处理器不能成功地执行该操作,将产生未定义指令异常中断
(6)软件中断指令
SWI实现软件中断,可以访问用户模式下受限制的资源
(1)SWI指令
功能:SWI指令用于产生软中断,以便用户程序能调用操作系统的系统例程,操作系统在SWI异常处理程序中提供相应的系统服务
1)可实现用户模式变换到管理模式,中断后会改变程序状态寄存器中的相关标志位,CPSR保存到管理模式的SPSR中,执行转换到SWI向量。
其它模式下也可使用SWI指令,处理器同样地切换到管理模式
2)中断处理后把相关例程入口地址赋给PC,并把中断处地址保存在LR中,把CPSR保存在SPSR中 SWI_number向中断服务程序传递一个参数,不需要传递参数时,应把表达式写作0
当指令中24位立即数被忽略时,用户程序调用系统例程的类型由通用寄存器R0决定,同时参数通过其它寄存器传递
(2)BKPT指令
3 Thumb指令集
3.1 简介
与ARM指令区别
2.4 ARM处理器支持的汇编伪指令
2.4.1 数据定义
2.4.2 符号定义
2.4.3 汇编控制
2.4.4 其他
2.5 汇编语音程序设计
2.5.1 顺序结构
2.5.2 分支结构
2.5.3 循环结构
2.5.4 子程序调用结构
PLUS
题目
https://wenku.baidu.com/view/24bde135b90d6c85ec3ac6b4.html?rec_flag=default