嵌入式系统复习--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.mzph.cn/news/240694.shtml

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

相关文章

程序设计的思想

程序设计思想是指在程序设计过程中所采用的一种思维方式&#xff0c;它是程序设计的灵魂和基础。程序设计思想的正确与否直接关系到程序的质量和可维护性。在实际的程序设计中&#xff0c;我们需要遵循一定的程序设计思想&#xff0c;以确保程序的正确性、可读性和可维护性。 …

序列化和反序列化对比分析,序列化和反序列化输出十个学生信息截图

序列化和反序列化是数据处理中的两个相对的概念&#xff0c;通常用于对象的存储和传输。下面是对这两个过程的对比分析&#xff1a; 序列化&#xff08;Serialization&#xff09; 定义 目的&#xff1a; 将对象的状态信息转换成可以存储或传输的形式&#xff08;如XML, JSO…

【表的内连和外连】

目录&#xff1a; 前言表的内外连接内连接显示Amanda Jackson的名字和部门名称 外连接左外连接查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 右外连接对stu表和exam表联合查询&#xff0c;把所有的成绩都显示出来&#xff0c;…

windows vs cmake项目+vcpkg

官方文档地址: vs中使用vcpkgcmake 官方文档地址&#xff1a;配置 CMake 调试会话 调整到CMake 目标视图&#xff0c;在对应的exe下右键选择“添加调试配置”切换回文件夹视图&#xff0c;在.vs下找到launch.vs.json文件&#xff0c;然后可以写调试使用的命令行参数 args&…

循环渲染ForEach

目录 1、接口说明 2、键值生成规则 3、组件创建规则 3.1、首次渲染 3.2、非首次渲染 4、使用场景 4.1、数据源不变 4.2、数据源组项发生变化 4.3、数据源数组项子属性变化 5、反例 5.1、渲染结果非预期 5.2、渲染性能降低 Android开发中我们有ListView组件、GridVi…

linux:IP地址、修改主机名、域名解析、虚拟机配置固定IP

一:IP地址 1、每一台联网的电脑都会有一个地址&#xff0c;用于和其它计算机进行通讯 2、IP地址主要有2个版本,V4版本和V6版本(V6很少用暂不涉及) 3、IPv4版本的地址格式是:a.b.c.d,其中abcd表示0~255的数字,如192.168.88.101就是一个标准的IP地址 4、可以通过命令:ifconfi…

视频监控技术经历了哪些发展阶段?视频监控技术未来趋势展望

随着城市经济的发展和进步&#xff0c;视频监控也已经应用在人们衣食住行的方方面面&#xff0c;成为社会主体的一个重要组成部分。随着视频监控的重要性越来越凸显&#xff0c;大家对视频监控技术的发展也非常关注。今天我们来简单阐述一下&#xff0c;视频监控技术经历的几个…

【delphi11】delphi进阶【九、自定义组件】

在 Delphi 中创建和使用自定义组件是一种扩展应用功能和重用代码的有效方法。自定义组件可以是可视化&#xff08;如按钮、编辑框&#xff09;或非可视化的&#xff08;如数据库连接、计时器&#xff09;。以下是一个详细介绍如何在 Delphi 中创建和使用自定义组件的指南&#…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)ChannelMap 模块的实现

&#xff08;三&#xff09;ChannelMap 模块的实现 这个模块其实就是为Channel来服务的&#xff0c;前面讲了Channel这个结构体里边它封装了文件描述符。假如说我们得到了某一个文件描述符&#xff0c;需要基于这个文件描述符进行它对应的事件处理&#xff0c;那怎么办呢&…

C++_类和对象基础操作(创建对象)

介绍 本文 主要介绍用类去创建一个现实中基本对象的 实例化操作 1.创建一个Dog&#xff0c;属性有姓名&#xff0c;犬龄&#xff0c;品种&#xff0c;毛色(不可以外部直接设置).行为有进食&#xff0c;奔跑&#xff0c;睡觉。 2.创建一个对象数组&#xff0c;存放4个学生(学号&…

windos/ubuntu20.4下UE4.27.2像素流送

windows/ubuntu20.4下UE4.27.2像素流送 像素流送技术可以将服务器端打包的虚幻引擎应用程序在客户端的浏览器上运行&#xff0c;用户可以通过浏览器操作虚幻引擎应用程序&#xff0c;客户端无需下载虚幻引擎&#xff0c;本文实现两台机器通过物理介质网线实现虚幻引擎应用程序…

企业出海-如何保护客户账户安全?

近年来国内企业竞争日益激烈&#xff0c;许多企业在这般环境下难以持续发展。那么该如何获得业务的可持续性增长&#xff0c;如何获取更多的客户的同时开阔公司的视野&#xff1f;出海便是如今帮助国内企业能快速发展壮大的潮流之一&#xff0c;摆脱了局限于国内发展的束缚奔向…

单调栈分类、封装和总结

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 通过枚举最小&#xff08;最大&#xff09;值不重复、不遗漏枚举所有子数组 C算法&#xff1a;美丽塔O(n)解法单调栈左右寻找第一个小于maxHeight[i]的left,right&#xff0c;[left,right]直接的高度都是maxHeight[i] 可以…

第十二章 异常-Exception

一、异常的概念&#xff08;P444&#xff09; Java 语言中&#xff0c;将程序执行中发生的不正常情况称为“异常”。&#xff08;开发过程中的语法错误和逻辑错误不是异常&#xff09; 执行过程中所发生的异常事件可分为两大类 &#xff08;1&#xff09;Error&#xff08;错误…

OpenCV-Python(19):Canny边缘检测

目录 学习目标 Canny 边缘检测原理 1.噪声抑制(噪声去除) 2.梯度计算 3.非极大值抑制 4.双阈值检测(滞后阈值) 5.边缘连接 Canny 边缘检测步骤 Canny 边缘检测的OpenCV实现 不同阈值的边缘检测效果 学习目标 了解Canny边缘检测的概念学习掌握函数cv2.Canny()的用法 …

【星海出品】Keepalived 使用基础案例 (二)

keepalived 使用 [rootmaster ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs { //全局配置notification_email { //定义报警收件人邮件地址acassenfirewall.locfailoverfirewall.locsysadminfirewall.loc}notification_…

laravel 对接支付,本地穿透问题

本地穿透有好多工具&#xff0c;参考链接&#xff1a;https://zhuanlan.zhihu.com/p/339923535 我这边是用的 NATAPP 官网&#xff1a;https://natapp.cn/ 客户端下载&#xff1a;https://natapp.cn/# NATAPP1分钟快速新手图文教程&#xff1a;https://natapp.cn/article/n…

内部FLASH模拟EPPROM

本例程基于STM32F103ZET6 FLASH大小为512K。 介绍FLASH 不同型号的 STM32&#xff0c;其 FLASH 容量也有所不同&#xff0c;最小的只有 16K 字节&#xff0c;最大的则达到了 1024K 字节。我们的精英 STM32 开发板选择的是 STM32F103ZET6 的 FLASH 容量为 512K 字节&#xff0…

【INTEL(ALTERA)】 quartus 在 F-Tile 以太网多速率英特尔® FPGA IP同时启用了自动协商和链路训练时生成严重警告

说明 由于英特尔 Quartus Prime 专业版软件版本 23.4 存在问题&#xff0c;包含启用 ANLT 的 F-Tile 以太网多速率英特尔 FPGA IP的动态重新配置项目将生成严重警告。 这些警告的形式如下所示&#xff1a; 严重警告 &#xff08;22976&#xff09;&#xff1a;IP 或 IP 缺少动…

记录 | ubuntu安装jsoncpp

两种方式&#xff0c;一种是源码编译&#xff0c;另一种是 apt 安装 源码编译 # 下载源码包 git clone https://github.com/open-source-parsers/jsoncpp.gitcd jsoncppmkdir build cd build# 编译安装 cmake .. make -j32 make install apt 安装 sudo apt update sudo apt…