嵌入式系统复习--Thumb指令集

文章目录

  • 上一篇
  • Thumb指令集概述
  • Thumb指令详细介绍
    • 数据处理指令
    • 数据存储指令
    • 转移指令
    • 异常中断指令
  • 下一篇

上一篇

嵌入式系统复习–ARM指令集(二)

Thumb指令集概述

在编写Thumb指令时,先要用伪指令CODE16声明(ADS的编译环境下),而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。

Thumb指令集特点:

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

在这里插入图片描述
Thumb指令与ARM指令的异同:

  • Thumb中也是采用Load/Store结构,有数据处理、数据传送及流控制指令
  • 大多数Thumb指令是无条件执行的(除转移指令B),而所有ARM指令都是条件执行。许多Thumb数据处理指令采用2地址格式,即目的寄存器与源寄存器相同,而大多数ARM数据处理指令采用的是3地址格式
  • 所有异常都会返回ARM模式状态,由于ARM微处理器字传送地址必须被4整除(字对准),半字传送地址必须可被2整除(即半字对准),但是Thumb是2个字节,所以进入异常Thumb的自然偏移与ARM不同

进入和退出Thumb模式的方式:

  • 进入方式:BX和利用异常返回到Thumb
  • 退出方式:BX和利用异常进入Thumb

Thumb指令详细介绍

数据处理指令

低寄存器指的是R0~R7, 高寄存器指的是R8 ~ R15
算术运算指令

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

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

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

  • ADD–高或低寄存器
    句法:

    ADD Rd, Rm
    

    用法:Rd <- Rd + Rm
    Rd和Rm是低寄存器时,更新标记NZCV

  • ADD与SUB–SP
    句法:

    ADD SP, #expr
    SUB SP, #expr
    

    用法:SP <- SP + expr
    不影响条件标志码

  • ADD – PC或SP偏移量
    句法:

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

    用法:Rd <- Rp + #expr
    不影响条件标志码

  • 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
    

    用法:EOR异或,BIC:Rd AND NOT Rm
    必须是低寄存器影响NZ标志

  • ASR、LSL、LSR、和ROR
    算术右移、逻辑左移、逻辑右移、循环右移
    句法:

    op Rd, Rs
    op Rd, Rm, #expr
    Rd、Rs、Rm必须是R0~R7范围内的寄存器
    
  • CMP和CMN(比较和比较负值)
    句法:

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

    用法:
    只更新条件码标志,不存放结果
    CMP: Rn - expr(或Rm)
    CMN:Rm + Rn
    其中:CMP Rn, Rm指令允许使用高寄存器

  • 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范围内

数据存储指令

  • 单寄存器数据存储指令(LDR和STR)
    汇编格式
    <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位
    
  • 多寄存器数据存储指令
    汇编格式:
    LDMIA Rn!, {<reg list>}
    STMIA Rn!, {<reg list>}
    POP {<reg list> {, PC}}
    PUSH {<reg list> {, LR}}
    

转移指令

汇编格式:

B <cond> <label> //目标为Thumb代码
B <label>        //目标为Thumb代码
BL <label>       //目标为Thumb代码
BLX <label>      //目标为ARM代码
B{L}X Rm         //目标为ARM或Thumb代码
  • B分支指令,Thumb中唯一可条件执行的指令
  • BL带链接的长分支
  • BX分支指令,并可选择地切换指令集
  • BLX带链接分支,并可选择地交换指令集

异常中断指令

  • Thumb软件中断指令
    汇编格式:
    SWI <8位立即数> //八位立即数为数学表达式取值为0~255内的整数
    
  • 断点中断
    汇编格式
    BKPT immed_8
    

下一篇

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/295407.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科研学习|论文解读——面向电商内容安全风险管控的协同过滤推荐算法研究

【论文完整内容详见知网链接】&#xff1a; 面向电商内容安全风险管控的协同过滤推荐算法研究 - 中国知网 (cnki.net) 面向电商内容安全风险管控的协同过滤推荐算法研究* 摘 要&#xff1a;[目的/意义]随着电商平台商家入驻要求降低以及商品上线审核流程简化&#xff0c;内容安…

Flutter笔记:Web支持原理与实践

Flutter笔记 Web支持原理与实践 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com CSDN&#xff1a;https://blog.csdn.net/qq_28550263/article/details/135037756 华为开发者社区…

TrustZone之可信操作系统

有许多可信内核&#xff0c;包括商业和开源的。一个例子是OP-TEE&#xff0c;最初由ST-Ericsson开发&#xff0c;但现在是由Linaro托管的开源项目。OP-TEE提供了一个功能齐全的可信执行环境&#xff0c;您可以在OP-TEE项目网站上找到详细的描述。 OP-TEE的结构如下图所示&…

软件体系结构复习

数据持久化 ORM基本概念 对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称ORM&#xff09;模式是为了解决面向对象和关系数据库存在的互不匹配的现象的技术。 换言之&#xff0c;ORM是通过使用描述对象和数据库之间映射的元数据&#xff0c;把程序中的对象…

使用python对windows/win11进行属性设置

有一个个人的需求&#xff0c;针对windows系统进行属性设置&#xff0c;这里以对鼠标的左右键主键进行切换为例&#xff0c;进行了研究&#xff0c;以当前win11系统为基础进行了更动。 首先是对于如果打开windows系统下的鼠标设置&#xff0c;有以下几种办法&#xff1a; 添加…

PySpark中DataFrame的join操作

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

使用for语句换行打印久久乘法表格

一、基本思想 思想来源于九九乘法表&#xff0c;使用*来表示乘法并进行乘法的运算&#xff0c;最大的思想就是双层for循环&#xff0c;最关键的思想是进行里面的第二次for循环时&#xff0c;第二次索引的变量要小于等于第一次索引的变量。 二、 相关代码 public class Jiujiu…

c# OpenCvSharp 检测(斑点检测、边缘检测、轮廓检测)(五)

在C#中使用OpenCV进行图像处理时&#xff0c;可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。 斑点检测边缘检测轮廓检测 一、斑点检测&#xff08;Blob&#xff09; 斑点检测是指在图像中找到明亮或暗的小区域&#xff08;通常表示为斑点&#xff09;&#…

聊聊kube-scheduler如何完成调度和调整调度权重

一、概述 Kube-scheduler作为k8s集群的默认调度器&#xff0c;它监听&#xff08;watch机制&#xff09;kube-apiserver&#xff0c;查询还未调度的pod&#xff0c;根据调度策略将pod调度至集群内最适合的Node 二、调度流程 首先我们通过API或者kubectl工具创建pod&#xff0c;…

Spring IoCDI

文章目录 前言什么是Spring1. 什么是 IoC 容器1.1 什么是容器1.2 什么是 IoC 2. 什么是DI IoC & DI 的使用IoC详解Bean的存储Controller注解如何获取Bean1. 根据Bean的名称获取Bean2. 根据Bean类型获取Bean3. 根据Bean名和Bean类型获取Bean Service注解Repository注解Compo…

数值分析期末复习

第一章 科学计算 误差 解题步骤 先求绝对误差: ∣ x − x ∗ ∣ |x - x^*| ∣x−x∗∣求相对误差限: ∣ x − x ∗ ∣ x ∗ \frac{|x\,\,-\,\,x^*|}{x^*} x∗∣x−x∗∣​求有效数字 ∣ x − x ∗ ∣ 需要小于它自身的半个单位 |x-x^*|\text{需要小于它自身的半个单位} ∣…

pycharm git 版本回退

参考 https://blog.csdn.net/qq_38175912/article/details/102860195 yoyoketang 悠悠课堂