单片机核心/RTOS必备 (ARM汇编)
ARM汇编概述
一开始,ARM公司发布两类指令集:
- ARM指令集,这是32位的,每条指令占据32位,高效,但是太占空间。
- Thumb指令集,这是16位的,每条指令占据16位,节省空间。
要节省空间时用Thumb指令,要效率时用ARM指令。
一个CPU既可以运行ARM指令,也可以运行Thumb指令。
怎么区分当前指令是Thumb还是ARM指令呢?
程序状态寄存器中有一位,名为“T”,它等于1时表示当前运行的是Thumb指令。
假设函数A是使用Thumb指令下的,函数B是使用ARM指令写的,怎么调用A/B?
我们可以往PC寄存器里写入函数A或B的地址,就可以调用A或B。
但是怎么让CPU在执行A函数时进入Thumb状态,在执行B函数时进入ARM状态?
做个手脚:
调用函数时A时,让PC寄存器的BIT0等于1,即PC=函数A地址+(1<<0);
调用函数时B时,让PC寄存器的BIT0等于0,即PC=函数B地址;
引入Thumb2指令集,支持16位指令、32位指令混合编程。
ARM公司推出了:Unified Assembly Language UAL,统一汇编语言,不需要去区分这些指令集。
UAL汇编格式为:
Operation {cond} {S} Rd, Rn, Operand2
- Operation表示各类汇编指令,比如ADD、MOV。
- cond表示condition,即该指令执行的条件。
- S表示该指令执行后,会修改程序状态寄存器。
- Rd为目的寄存器,用来存储运算的结果。
- Rn、Operand2是两个源操作数。
立即数
MOV R0,#VAL
意思是把VAL这个值存入R0寄存器。
VAL可以是任意值吗?
不可以,必须是立即数。
假设VAL可以任意数,“MOV R0,#VAL”本身16位或32位,哪来的空间保存任意数值的VAL,所以VAL必须符合某些规定。

LDR伪指令
去判断一个VAL是否是立即数,麻烦,并且就是想把任意数值赋给R0,怎么办?
可以使用伪指令:LDR R0,=VAL
伪指令就是假的,不存在的指令。
LDR作为伪指令时,指令中有一个=,否则它就是真的LDR指令了。
编译器会把伪指令替换成真实的指令,比如:
LDR R0,=0x12
0x12是立即数,那么替换为 MOV R0,#0x12
LDR R0,=0x12345678
0x12345678不是立即数,替换为
Label DCD 0x12345678 //编译器在程序某个地方保存这个值
LDR R0,[PC,#offser] //使用Load Register读内存指令读出值,offset是链接程序时确定的。
ADR伪指令
用来读某个标号的地址
ADR R0,LoopLoopADD R0,R0,#1
它是伪指令,会被转换成某条真实的指令。
ARM编译器与GCC编译器语法差异

低位存放在低地址,小字节序(little endian)。
高位存在低地址,大字节序(big endian)。
程序处理的4个步骤

main.c经过预处理后生成main.i,经过编译后形成汇编文件.s
汇编文件经过汇编后得到目标文件,多个目标文件链接生成.elf可执行程序(含有机器码),可执行程序再经过反汇编后生成汇编代码.dis。
汇编:把汇编文件转换成目标文件(里面是机器码)
反汇编:把可执行文件(目标文件,里面是机器码),转换成汇编文件
KEIL下怎么反汇编?
在 KEIL的User选项中,添加这两项:

上电后:
设置栈:CPU会从0x08000000读取值,用来设置SP
跳转:CPU会从0x08000004得到地址值,根据它的BIT0切换到ARM状态或者Thumb状态,然后跳转。
对于Cortex M3/M4,仅支持Thumb状态,所以0x08000004上的值bit0必定是1。
0x08000004上的值 = Reset_Handler+1
从Reset_Handler上继续执行
相关文章:
单片机核心/RTOS必备 (ARM汇编)
ARM汇编概述 一开始,ARM公司发布两类指令集: ARM指令集,这是32位的,每条指令占据32位,高效,但是太占空间。Thumb指令集,这是16位的,每条指令占据16位,节省空间。 要节…...
2023/10/25
如果你越来越冷漠 你以为你成长了 但其实没有 长大应该是变得温柔 对全世界都温柔...
如何做一个无符号数识别程序
1.状态分析 我们可以把无符号数分为:整数,带小数,带指数部分三种形式。以此构建一个DFA。首先需识别输入是整数还是小数点,若是整数部分输入然后还要再循环识别一次是否有小数点,最后识别是否有指数部分,指…...
C++初阶:C/C++内存管理
一.C/C内存分布 先来回顾一下C语言内存分区示意图如下: 代码区: 程序执行代码一般存放在代码区,字符串常量以及define定义的常量也可能存放在代码区。 常量区: 字符串,数字等常量以及const修饰的全局变量往往存放在…...
新成果展示:AlGaN/GaN基紫外光电晶体管的设计与制备
紫外光电探测器被广泛应用于导弹预警、火灾探测、非可见光通信、环境监测等民事和军事领域,这些应用场景的实现需要器件具有高信噪比和高灵敏度。因此,光电探测器需要具备响应度高、响应速度快和暗电流低的特性。近期,天津赛米卡尔科技有限公…...
Ivs+keepalived:高可用集群
Ivskeepalived:高可用集群 keepalived为lvs应运而生的高可用服务。lvs的调度器无法做高可用,keepalived这个软件就是为了实现调度器的高可用。 注意:keepalived不是专门为lvs集群服务的,也可以做其他代理服务器的高可用。 lvs的高可用集群&a…...
win10安装spark
一、进入spark下载页面 连接 Downloads | Apache Spark 二、解压下载后的.tgz文件 直接解压即可 三、运行 运行bin目录下的 spark-shell.cmd 提示 Did not find winutils.exe: java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.hom…...
基于Spring Boot 的毕业生实习就业管理系统(绿色)
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot 的毕业生实习就业管理系…...
1600*C. Remove Adjacent(贪心字符串)
Problem - 1321C - Codeforces 解析: 贪心,从z到a遍历,每次循环减去符合题意的字符。 #include<bits/stdc.h> using namespace std; signed main(){int n;string s;cin>>n>>s;for(char iz;i>a;i--){for(int j0;j<s.…...
CRC校验码2018-架构师(六十一)
以下关于串行总线的说法中,正确的是()。 串行总线一般都是双全工总线,适宜于长距离传输数据串行总线传输的波特率是总线初始化时预先定义好的,使用中不可改变串行总线是按位(BIT)传输数据的&am…...
CSS设置超出范围滚动条和滚动条样式
CSS设置超出范围滚动条和滚动条样式 效果展示 当块级内容区域超出块级元素范围的时候,就会以滚动条的形式展示,你可以滚动里面的内容,里面的内容不会超出块级区域范围。 未设置超出隐藏,显示滚动条 超出隐藏,显示滚动…...
EtherCAT从站转CclinkIE协议网关应用案例
远创智控的YC-ECT-CCLKIE网关,一款具有强大功能的ETHERCAT通讯网关。 它可以将ETHERCAT网络和CCLINK IE FIELD BASIC网络无缝连接起来。作为ETHERCAT总线中的从站,本网关可以接收来自ETHERCAT主站的数据,并将其传输到CCLINK IE FIELD BASIC网…...
腾讯云 AI 绘画:文生图、图生图、图审图 快速入门
腾讯云 AI 绘画是腾讯云推出的一款基于人工智能的图像生成和编辑产品,能够根据输入的图片或描述文本,智能生成与输入内容相关的图片,支持多样化的图片风格选择。 在本文中,我们将介绍如何使用腾讯云 AI 绘画的三项主要功能&#…...
前端项目中,强缓存和协商缓存的配置
前端缓存分为HTTP缓存和浏览器缓存 HTTP缓存(本文重点) 强缓存协商缓存 浏览器缓存 比较熟悉的 cookie,localstorage sessionstorage indexDB…或者cacheStorage 请求的缓存,如果本地有取本地的 这里主要笔记http缓存 先说总结的内容 webpack配置&am…...
【LeetCode】2. 两数相加
题目链接 文章目录 Python3方法: 模拟 ⟮ O ( n ) 、 O ( 1 ) ⟯ \lgroup O(n)、O(1)\rgroup ⟮O(n)、O(1)⟯ C Python3 方法: 模拟 ⟮ O ( n ) 、 O ( 1 ) ⟯ \lgroup O(n)、O(1)\rgroup ⟮O(n)、O(1)⟯ # Definition for singly-linked list. # cl…...
springBoot与Vue共同搭建webSocket环境
欢迎使用Markdown编辑器 你好! 这片文章将教会你从后端springCloud到前端VueEleementAdmin如何搭建Websocket 前端 1. 创建websocket的配置文件在utils文件夹下websocket.js // 暴露自定义websocket对象 export const socket {// 后台请求路径url: ,websocketCo…...
【Python】collections.Counter
Python内置模块collections中的Counter是字典子类。Counter不是字典,但很像字典。 Counter具有字典的键和值,键是各个元素,值为该元素出现的次数。 Counter相当于计数器。常用于哈希映射(哈希表)。 from collection…...
【Elasticsearch】es脚本编程使用详解
目录 一、es脚本语言介绍 1.1 什么是es脚本 1.2 es脚本支持的语言 1.3 es脚本语言特点 1.4 es脚本使用场景 二、环境准备 2.1 docker搭建es过程 2.1.1 拉取es镜像 2.1.2 启动容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 2.2 docker搭建kibana过程 2.2.1 拉取ki…...
Synchronized 关键字
在Java中,线程同步使用最多的方法是使用synchronized关键字。每个Java对象都隐含有一把锁,这里称为Java内置锁(或者对象锁、隐式锁)。使用synchronized(syncObject)调用相当于获取 syncObject 的内置锁,所以可以使用内置锁对临界区代码段进行…...
Maven系列第8篇:大型Maven项目,快速按需任意构建
本篇涉及到的内容属于神技能,多数使用maven的人都经常想要的一种功能,但是大多数人都不知道如何使用,废话不多说,上干货。 需求背景 我们需要做一个电商项目,一般都会做成微服务的形式,按业务进行划分&am…...
为什么数据质量成为人工智能领域最重要的问题
简而言之:传统的基于人工编写规则和被动检查的数据质量体系,从未针对智能体人工智能进行设计。到2026年,当自主代理处理错误数据时,没有人会介入以发现问题。那些在人工智能领域取得成功的组织,并非从更好的模型入手&a…...
DocRes:统一文档图像修复任务的通用模型技术解析
DocRes:统一文档图像修复任务的通用模型技术解析 【免费下载链接】DocRes [CVPR 2024] DocRes: A Generalist Model Toward Unifying Document Image Restoration Tasks 项目地址: https://gitcode.com/gh_mirrors/do/DocRes 文档图像修复不再需要多个专用模…...
C++ 自动微分引擎:基于模板元编程的静态反向传播梯度流构建
C 自动微分引擎:基于模板元编程的静态反向传播梯度流构建尊敬的各位专家、同行,大家好。今天,我们将深入探讨一个兼具理论深度与工程实践价值的主题:如何利用 C 的模板元编程(Template Metaprogramming)技术…...
【可分离架构物理信息神经网络:破解维度灾难的分离变量方法论】第2章 SPINN:可分离物理信息神经网络架构
目录 (Chapter 2: SPINN: Separable Physics-Informed Neural Networks) 2.1 SPINN的架构设计原理 2.1.1 按坐标轴的体网络(Body Networks)设计 2.1.2 特征融合机制与参数效率 2.2 前向模式自动微分与计算优化 2.2.1 前向自动微分在分离架构中的优势 2.2.2 超大规模配…...
终极Redis可视化工具:Another Redis Desktop Manager完全使用指南
终极Redis可视化工具:Another Redis Desktop Manager完全使用指南 【免费下载链接】AnotherRedisDesktopManager 🚀🚀🚀A faster, better and more stable Redis desktop manager [GUI client], compatible with Linux, Windows, …...
Ubuntu纯键盘操作全攻略:从入门到精通(附常用快捷键速查表)
Ubuntu纯键盘操作全指南:释放效率革命的终极手册 在数字工作流中,每一次伸手去摸鼠标都意味着思维的中断和效率的流失。Ubuntu作为最受欢迎的Linux发行版之一,其键盘操作体系之丰富远超多数用户的想象——从简单的窗口切换到底层系统调试&…...
3个步骤突破微信小程序渲染瓶颈:pixi-miniprogram的WebGL性能革新实践
3个步骤突破微信小程序渲染瓶颈:pixi-miniprogram的WebGL性能革新实践 【免费下载链接】pixi-miniprogram 一个可运行于微信小程序的PIXI引擎,通过模拟window环境,有些功能小程序无法模拟,就直接修改了PIXI引擎代码,最…...
语言的边界,与软件的命运
. GIF文件结构 相比于 WAV 文件的简单粗暴,GIF 的结构要精密得多,因为它天生是为了网络传输而设计的(包含了压缩机制)。 当我们用二进制视角观察 GIF 时,它是由一个个 数据块(Block) 组成的&…...
效率革命:用快马AI生成即用代码模块,替代海量opencode搜索与整合
效率革命:用快马AI生成即用代码模块,替代海量opencode搜索与整合 最近在开发一个电商后台管理系统时,遇到了一个很常见的需求:需要一个功能完善的商品数据表格组件。按照传统做法,我大概会经历以下痛苦流程࿱…...
深入解读XDMA驱动:从/dev节点看透RK3588与FPGA的PCIe数据流(H2C/C2H通道详解)
深入解读XDMA驱动:从/dev节点看透RK3588与FPGA的PCIe数据流(H2C/C2H通道详解) 当你在RK3588开发板上执行ls /dev/xdma0_*命令时,那些神秘的字符设备节点背后隐藏着一套精密的PCIe通信体系。作为连接ARM SoC与FPGA的高速数据通道&…...
