【嵌入式】Thumb指令集(学习笔记)

这篇具有很好参考价值的文章主要介绍了【嵌入式】Thumb指令集(学习笔记)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Thumb 指令集

Thumb指令集概述

ARM开发工具完全支持Thumb指令,应用程序可以灵活的将ARM和Thumb子程序混合编程以便在例程的基础上提高性能或代码密度。在编写Thumb指令时,先要用伪指令CODE16声明(ADS的编译环境下),而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。

Thumb指令集特点

	采用16位二进制编码,而ARM指令是32位的。
	Thumb是压缩指令,先动态解压缩,然后作为标准的ARM指令执行。
	由CPSR的T位决定指令流。T置位,执行Thumb指令流,T清0,执行ARM指令流
	由ARM模式进入Thumb模式时,是显式或隐式的进入;由Thumb进入ARM模式时,也是显式或隐式的进入。
	Thumb指令集没有协处理器指令、信号量指令、乘加指令、64位乘法指令以及访问CPSR和SPSR的指令,而且指令的第2操作数受到限制。
	除了分支指令B有条件执行功能外,其他指令均无条件执行。
	大多数Thumb数据处理指令采用2地址格式。

Thumb指令集编码如下:
【嵌入式】Thumb指令集(学习笔记)

Thumb状态切换

在任何时刻,CPSR的第5位(位T)决定了ARM微处理器执行的是ARM指令流还是Thumb指令流。当T置1,则认为是16位的Thumb指令流;当T清0,则认为是32位的ARM指令流。
• 进入Thumb模式
进入Thumb指令模式有两种方法:一种是执行一条交换转移指令BX,另一种方法是利用异常返回,也可以把微处理器从ARM模式转换为Thumb模式。
• 退出Thumb模式
退出Thumb指令模式也有两种方法:一种是执行Thumb指令中的交换转移BX指令可以显式的返回到ARM指令流。另一种是利用异常进入ARM指令流 。

编程模型

Thumb指令集是ARM指令集的一个子集,并只能对限定的ARM寄存器进行操作。
【嵌入式】Thumb指令集(学习笔记)
16位Thumb指令集是从32位ARM指令集提取指令格式的,每条Thumb指令有相同处理器模型所对应的32位ARM指令。

Thumb数据处理指令包括一组高度优化且相当复杂的指令,范围涵盖编译器通常需要的大多数操作。ARM指令支持在单条指令中完成一个操作数的移位及一个ALU操作,但Thumb指令集将移位操作和ALU操作分离为不同的指令。本部分从以下几个方面介绍:
• 数据处理指令的二进制编码
• 数据处理指令的分类
• ARM指令与Thumb指令比较

数据处理指令

【嵌入式】Thumb指令集(学习笔记)
按照数据处理指令的功能,可以将其分为以下几类:

	•	  算术运算指令,它又分为以下几类:
         	•	  ADD与SUB—低寄存器加法和减法
			•	  ADD—高或低寄存器
			•	  ADD与SUB—SP 
			•	  ADD—PC或SP相对偏移 
			•	  ADC,SBC和MUL
	•	  移位和循环移位操作(ASR,LSL,LSR和ROR)
	•	  比较指令(CMP和CMN)
	•	  传送和取负指令(MOV,MVN和NEG)
	•	  测试指令(TST)

算术运算指令

ADD与SUB--低寄存器加法和减法
句法:

op Rd,Rn,Rm
op Rd,Rn,#expr3
op Rd,#expr8

用法:
指令中Rd、Rn、Rm必须是低寄存器(R0~R7)。指令更新NZCV标志。

例子:

ADD R3,R1,R5	    	
ADD R9,R2,R6
SUB R0,R4,#5			
SUB R4,R5,#201

ADD--高或低寄存器
句法:
ADD Rd,Rm
用法:

Rd←Rd+Rm
Rd和Rm是低寄存器时,更新标志NZCV

例子:

ADD R12,R4
ADD R10,R11
ADD R2,R4

ADD与SUB--SP
句法:

ADD SP,#expr
SUB SP,#expr

用法:

SP←SP+expr
不影响条件标志码

例子:

ADD SP,#312

ADD--PC或SP偏移量
句法:

ADD Rd,Rp,#expr
Rp:SP或PC

用法:

Rd←Rp+#expr
不影响条件标志码

例子:

ADD R6,SP,#64
ADD R2,PC,#980

ADC、SBC和MUL
(带进位位的加法、带进位位的减法、乘法)
句法:

op Rd,Rm

用法:

ADC:Rd←Rd+Rm+C
SBC: Rd ←Rd-Rm-(1-C)  借位
MUL:Rd ←Rd×Rm

限制:Rd和Rm必须是低寄存器(R0~R7)
ADC和SBC影响NZCV
MUL影响NZ

AND、ORR、EOR和BIC(按位逻辑操作)
句法:

op Rd,Rm

用法:

AND逻辑“与”操作
ORR逻辑“或”操作
EOR逻辑“异或”操作
BIC:Rd AND NOT Rm
必须是低寄存器,影响NZ标志

ASR、LSL、LSR和ROR(逻辑和循环位移)
句法:

op Rd,Rs
op Rd,Rm,#expr
Rd、Rs、Rm必须是R0~R7范围内的寄存器

例子:

ASR R3,R5
LSR R0,R2,#6
ROR R2,R7,#2
LSL R9,R1

CMP和CMN(比较和比较负值)
句法:

CMP Rn,#expr
CMP Rn,Rm
CMN Rn,Rm

用法:

只更新条件码标志,不存放结果
CMP:Rn-expr(或Rm)
CMN:Rm+Rn

其中:CMP Rn,Rm指令允许使用高寄存器
例子:

CMP R2,#255		CMP R9,#24
CMN R1,R5		CMN R0,R10

MOV、MVN和NEG(传送、传送非和取负)
句法:

MOV Rd,#expr
MOV Rd,Rm
MVN Rd,Rm
NEG Rd,Rm

用法:

MOV:Rd←#expr(或Rm)
MVN:Rd ←NOT Rm
NEG: Rd ←Rm×(-1)

TST(测试)
句法:

TST Rn,Rm

用法:

Rm AND Rn,丢弃结果,更新条件码标志NZ
Rn、Rm必须在R0~R7范围内

转移指令

转移指令的二进制编码如下:
【嵌入式】Thumb指令集(学习笔记)
转移指令分类如下:
• B-分支指令,Thumb指令集惟一可条件执行的指令。
• BL-带链接的长分支。
• BX-分支指令,并可选择地切换指令集。
• BLX-带链接分支,并可选地交换指令集。

B	<cond> <label>	    ;格式1	 目标为Thumb代码
B	<label>	            ;格式2	 目标为Thumb代码
BL	<label>	            ;格式3	 目标为Thumb代码
BLX	<label>	            ;格式3a	 目标为ARM代码
B{L}X  Rm		        ;格式4	 目标为ARM或Thumb代码

Thumb的数据存取指令又可以分为:
单寄存器数据存取指令(LDR和STR)
多寄存器数据存取指令 (LDM和STM)
【嵌入式】Thumb指令集(学习笔记)
汇编格式如下:

<op> Rd,[Rn,<#off5>]	;<op> = LDR|LDRB|STR|STRB
<op> Rd,[Rn,<#off5>]	;<op> = LDRH| STRH 
<op> Rd,[Rn,Rm]	;
<op> =LDR|LDRH|LDRSH|LDRB|LDRSB|STR|STRH|STRB
<op> Rd,[PC,<#off8>] 
<op> Rd,[SP,<#off8>]	;<op> = LDR| STR//该两条指令偏移量为8位

多寄存器数据存取指令
【嵌入式】Thumb指令集(学习笔记)
汇编格式如下:

LDMIA Rn!,{}
STMIA Rn!,{}
POP {{,PC}}
PUSH {{,LR}}

异常中断指令

Thumb软件中断指令

Thumb软件中断指令的二进制编码如下
【嵌入式】Thumb指令集(学习笔记)
Thumb软件中断指令的汇编格式如下:
SWI <8位立即数>;<8位立即数>为数字表达式,其取值为0~255范围内的整数。

Thumb断点指令

Thumb断点指令的二进制编码如下:
【嵌入式】Thumb指令集(学习笔记)
Thumb断点指令的汇编格式如下:
BKPT immed_8文章来源地址https://www.toymoban.com/news/detail-421385.html

到了这里,关于【嵌入式】Thumb指令集(学习笔记)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式学习笔记汇总

    本文整理STM32、STM8和uCOS-III的所有文章链接。 源码:mySTM32-learn STM32学习笔记(1)——LED和蜂鸣器 STM32学习笔记(2)——按键输入实验 STM32学习笔记(3)——时钟系统 STM32学习笔记(4)——NVIC中断优先级管理和外部中断EXTI STM32学习笔记(5)——系统定时器SysTick STM32学习笔

    2023年04月20日
    浏览(73)
  • 嵌入式学习笔记——SPI通信

    之前已经介绍了STM32的ADC、DMA、EXTI、TIME、NVIC、USART以及普通IO模式,此系列笔者还打算写最后三个大的内容,分别是SPI通信、IIC通信以及看门狗,后面就看大家的需求了,需要什么可以留在评论区,本文首先来介绍SPI的有关知识。 在通信协议分类的介绍中,提到过SPI,它是一

    2023年04月09日
    浏览(48)
  • 嵌入式学习笔记——IIC通信

    本文接着之前的M4系列介绍,对另外一个十分常见的通信总线进行一个介绍,就是IIC总线。 首先,还是找个免费劳动力来做一个官方的介绍,下面这一段话非常全面的介绍了IIC的各个特征,用之前提到的通信特征来总结,IIC是一种串行,同步,半双工,板级有线通信。与SPI对

    2024年02月06日
    浏览(77)
  • 嵌入式学习笔记——SysTick(系统滴答)

    上一篇中,介绍了关于STM32F407的时钟系统,在了解了系统的时钟后,最重要的内容就是搞定定时器的操作,本文从最基本的定时器,也是内核里面自带的一个定时器——SysTick(系统滴答)来进行介绍。旨在搞清楚什么是系统滴答,系统滴答有什么用,系统滴答怎么用。 SysTick这

    2024年01月21日
    浏览(46)
  • 【嵌入式算法】学习笔记(一):数字滤波算法

    最近在做直流电机的毕设中,由于需要采集转速,电流,电压,温度等参数,常规的采集容易受到干扰,所以特意复习了一下关于数字滤波有关的知识,并作出相应的整理。 本文对数字滤波进行简单介绍,讲解七种常用的滤波算法并用C语言实现,并比较其优缺点 。由于篇幅

    2023年04月22日
    浏览(97)
  • 嵌入式学习笔记(16)反汇编工具objdump

    2.4.1反汇编的原理为什么要用反汇编 arm-linux-objdump -D led.elf led_elf.dis objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf格式的可执行程序反过来得到汇编源代码 -D表示反汇编 左边的是elf可执行程序(反汇编的源) 右边的是反汇编生成的反汇编程序 反汇编的原因有以

    2024年02月09日
    浏览(46)
  • 嵌入式学习笔记(17)代码重定位实战 上篇

    3.5.1任务:在iSRAM中将代码从0xd0020010重定位到0xd0024000 注解:本练习对代码本身运行无实际意义,我们做这个重定位纯粹是为了练习重定位技能。但是某些情况重定位就是必须的,譬如在uboot中。 3.5.2思路 (1)通过链接脚本将代码链接到0xd0024000(链接地址) (2)使用dnw下载时将

    2024年02月09日
    浏览(42)
  • 嵌入式学习笔记——PWM与输入捕获(下)

    上一篇介绍了通用定时器的输出比较部分,这一篇再来介绍一下输入捕获的相关内容。 输入捕获,见名知意,就用来对输入信号进行捕获的,说到捕获输入信号,之前介绍过一个叫做外部中断的片上外设,它的作用也是捕获输入;它们的不同在于,外部中断捕获的只是边沿,

    2024年02月06日
    浏览(45)
  • 嵌入式学习笔记——STM32的时钟树

    在之前的所有代码编程的过程中,似乎每次都绕不开一个叫做时钟使能的东西,当时我们是在数据手册上直接看其挂接在那条时钟线上的,那么STM32内部的时钟到底是怎么一个构型呢,本文来对此做一个介绍。 老规矩,一个新的名词出现,首先需要搞清楚它是个啥,下图中对

    2024年02月02日
    浏览(58)
  • 嵌入式学习笔记(20) SoC时钟系统简介

    什么是时钟,SoC为什么需要时钟 (1)时钟同步工作系统的同步节拍 (2)SoC内部有很多器件,譬如CPU、DRAM控制器、串口、GPIO等内部外设,这些东西要彼此协调工作,需要一个同步的时钟系统来指挥。这个就是SoC的时钟系统。 时钟一般如何获得? (1)外部直接输入时钟信号

    2024年02月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包