ARM CORTEX A9 微处理器与嵌入式设计(三) 指令系统

目录

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指令状态
  • 功能: 跳转到指令中所指定的目标地址,实现状态切换,同时将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
在这里插入图片描述

发布了452 篇原创文章 · 获赞 271 · 访问量 73万+

猜你喜欢

转载自blog.csdn.net/qq_35608277/article/details/105123483