单片机核心/RTOS必备 (ARM汇编)

ARM汇编概述

一开始,ARM公司发布两类指令集:

  1. ARM指令集,这是32位的,每条指令占据32位,高效,但是太占空间。
  2. 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上继续执行

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

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

相关文章

Python操作MySQL基础使用

Python操作MySQL基础使用 import pymysql# 链接数据库 conn pymysql.connect(host10.5.6.250,port3306,userroot,password******** )# 查看MySQL版本信息 print(conn.get_server_info()) # 5.5.27# 获取到游标对象 cursor conn.cursor()# 选择数据库 conn.select_db("…

《排错》Python重新安装后,执行yum命令报错

安装完新的python以后&#xff0c;发现yum命令没法用 以下是报错信息&#xff1a; [rootmaster ~]# yum There was a problem importing one of the Python modules required to run yum. The error leading to this problem was:No module named yumPlease install a packag…

8.MySQL内外连接

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 表的内连和外连 内连接 外连接 左外连接 右外连接 我们进行演示的表结构是这样的&#xff1a; 表的内连和外连 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的…

asp.net core webapi signalR通信

1.前端使用npm 导入signalR的包和jquery包 npm install jquery -y npm install micosoft/signalr -y <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

C语言之函数详解

目录 函数的定义 函数的调用 变量的存储类型 auto自动变量 extern外部变量 static静态变量 register寄存器变量 函数的定义 在C语言中&#xff0c;函数是一段可重复使用的代码块&#xff0c;用于执行特定的任务。函数的定义包括函数的声明和函数体两个部分。 函数的声…

Redis快速上手篇(三)(事务+Idea的连接和使用)

Redis事务 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的 所有命令都会序列化&#xff0c;按顺序地串行化执行而不会被其它命令插入&#xff0c;不许加塞。 单独的隔离的操作 官网说明 https://redis.io/docs/interact/transactions/ MULTI、EXEC、…

Python机器学习17——Xgboost和Lightgbm结合分位数回归(机器学习与传统统计学结合)

最近XGboost支持分位数回归了&#xff0c;我看了一下&#xff0c;就做了个小的代码案例。毕竟学术市场上做这种新颖的机器学习和传统统计学结合的方法还是不多&#xff0c;算的上创新&#xff0c;找个好数据集可以发论文。 代码实现 导入包 import numpy as np import pandas…

【转载】双亲委派模型

双亲委派模型是 Java 类加载器的一种工作模式&#xff0c;通过这种工作模式&#xff0c;Java 虚拟机将类文件加载到内存中&#xff0c;这样就保证了 Java 程序能够正常的运行起来。那么双亲委派模型究竟说的是啥呢&#xff1f;接下来我们一起来看。 1.类加载器 双亲委派模型针…

C++经典面试题:内存泄露是什么?如何排查?

1.内存泄露的定义&#xff1a;内存泄漏简单的说就是申请了⼀块内存空间&#xff0c;使⽤完毕后没有释放掉。 它的⼀般表现⽅式是程序运⾏时间越⻓&#xff0c;占⽤内存越多&#xff0c;最终⽤尽全部内存&#xff0c;整个系统崩溃。由程序申请的⼀块内存&#xff0c;且没有任何⼀…

FFmpeg -r 放在 -i 前后的区别

在 FFmpeg 中&#xff0c;-r 选项的位置对于帧率设置有所影响&#xff0c;具体取决于它是放在 -i 之前还是之后。 放在 -i 之前&#xff1a;如果将 -r 选项放在 -i 之前&#xff0c;则它将用于设置输入文件的帧率。这意味着它会告诉 FFmpeg 如何解析输入文件的帧率信息。例如&…

github.com/holiman/uint256 源码阅读

github.com/holiman/uint256 源码阅读 // uint256: Fixed size 256-bit math library // Copyright 2018-2020 uint256 Authors // SPDX-License-Identifier: BSD-3-Clause// Package math provides integer math utilities.package uint256import ("encoding/binary&…

HighCharts点击无响应问题

HighCharts 点击无响应问题 背景介绍 项目需要展示一个小时内日志设备的状态&#xff0c;由于数据量比较大&#xff0c;使用echarts效果不好。于是采用highcharts来处理显示。highcharts使用起来很方便&#xff0c;还有打印照片功能&#xff0c;相当满意。这里采用官网给的例…

产研团队必看!3款在线白板工具助你轻松改善工作!

随着科技的不断进步和团队协作的需求日益增加&#xff0c;产研团队在工作中常常面临各种挑战。例如&#xff0c;团队成员之间的沟通不畅、信息共享不便以及项目进度不明确等等。这些问题会导致团队的效率低下&#xff0c;影响整体工作质量。 为了解决这些问题&#xff0c;越来…

ExoPlayer架构详解与源码分析(7)——SampleQueue

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

可自由搭建的能源管理平台,轻松实现高效节能

随着科技的不断发展&#xff0c;能源问题越来越重要。为了提高能源的利用效率&#xff0c;减少能源浪费&#xff0c;能源用能企业纷纷开始注重能源管理工作&#xff0c;并想要一款可以进行高效管理的工具。智慧能源管理平台&#xff0c;是一款可自由搭建的能源管理平台&#xf…

app分发的一些流程2

应用分发的流程通常包括以下步骤&#xff1a; 开发应用程序&#xff1a;首先&#xff0c;您需要开发您的应用程序。这包括编写代码、设计用户界面、测试应用程序等等。确保您的应用程序符合各个应用商店的规范和要求&#xff0c;以确保顺利通过审核。 准备应用材料&#xff1…

Positive Technologies 在迪拜宣布与地区网络安全解决方案提供商开展合作

在中东最大的信息技术展 GITEX GLOBAL 2023 的间隙&#xff0c;Positive Technologies 同意与八家组织&#xff08;网络安全服务和解决方案提供商&#xff09;合作&#xff0c;在该地区开展合作&#xff0c;推广最先进的产品&#xff0c;并分享信息安全领域的经验。该公司强调了…

九方面解读国家数据局成立,可交易数据的五大特性探讨

​ 10月25日&#xff0c;国家数据局正式揭牌&#xff0c;标志着我国数据管理进入了新的阶段。国家数据局负责协调推进数据基础制度建设&#xff0c;统筹数据资源整合共享和开发利用&#xff0c;统筹推进数字中国、数字经济、数字社会规划和建设等&#xff0c;由国家发展和改革…

SENet 学习

ILSVRC 是一个比赛&#xff0c;全称是ImageNet Large-Scale Visual Recognition Challenge&#xff0c;平常说的ImageNet比赛指的是这个比赛。 使用的数据集是ImageNet数据集的一个子集&#xff0c;一般说的ImageNet&#xff08;数据集&#xff09;实际上指的是ImageNet的这个子…

容器类之QT

容器类之QT 顺序容器 关联容器 STL迭代容器 STL风格的反向迭代容器 QVariant类 QFlags类 QRandomGenerator类