ARM 汇编基础知识
1.为什么学习汇编?
2.GNU 语法
1.语法结构
label:instruction @ comment - label 即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意 label 后面的“:”,任何以“:”结尾的标识 符都会被识别为一个标号。
- instruction 即指令,也就是汇编指令或伪指令。@符号,表示后面的是注释,就跟 C 语言里面的“/*”和“*/”一样,其实在 GNU 汇编文件中我们也可以使用“/*”和“*/”来注释。
- comment 就是注释内容。
for example:
add: @标号
MOVS R0, #0X12 @指令:设置 R0=0X12 2.section 伪操作
.text 表示代码段。.data 初始化的数据段。.bss 未初始化的数据段。.rodata 只读数据段。
.section .testsection @定义一个 testsetcion 段 3.汇编程序入口
/*.global是伪操作,表示_start是全局标号*/
.global _start
_start:
ldr r0, =0x12 @r0=0x12 类似C语言,常见的伪操作有:
.byte 定义单字节数据,比如.byte 0x12 。.short 定义双字节数据,比如.short 0x1234 。.long 定义一个 4 字节数据,比如 .long 0x12345678 。.equ 赋值语句,格式为:.equ 变量名,表达式,比如 .equ num, 0x12 ,表示 num=0x12 。.align 数据字节对齐,比如: .align 4 表示 4 字节对齐。.end 表示源文件结束。.global 定义一个全局符号,格式为: .global symbol ,比如: .global _start 。
GNU 汇编同样也支持函数,函数格式如下:
函数名 :函数体返回语句 @GNU 汇编函数返回语句不是必须的
for example:
/* SVC 中断 */
SVC_Handler: @函数名ldr r0, =SVC_Handler @函数体 bx r0 @返回语句
3.Cortex-A7 常用汇编指令
3.1 处理器内部数据传输指令
常用:MOV、MRS 和 MSR

1.MOV指令
将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄 存器里面MOV R0,R1 @将寄存器 R1 中的数据传递给 R0,即 R0=R1 MOV R0, #0X12 @将立即数 0X12 传递给 R0 寄存器,即 R0=0X122.MRS指令
将特殊寄存器 ( 如 CPSR 和 SPSR) 中的数据传递给通用寄存器,要读取特殊寄存器的数据只能使用 MRS 指令!MRS R0, CPSR @将特殊寄存器 CPSR 里面的数据传递给 R0,即 R0=CPSR3.MSR指令
MSR 指令和 MRS 刚好相反, MSR 指令用来将普通寄存器的数据传递给特殊寄存器,也就是写特殊寄存器,写特殊寄存器只能使用 MSR。MSR CPSR, R0 @将 R0 中的数据复制到 CPSR 中,即 CPSR=R0
3.2 存储器访问指令
LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004LDR R1, [R0] @读取地址 0X0209C004 中的数据到 R1 寄存器中,offset为0 LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004LDR R1, =0X20000002 @R1 保存要写入到寄存器的值,即 R1=0X20000002STR R1, [R0] @将 R1 中的值写入到 R0 中所保存的地址中 3.3压栈和出栈指令
例如:将R0~R3、R12寄存器压栈操作,当前的 SP 指针指向 0X80000000,处理器的堆栈是向下增长的,使用的汇编代码如下:
PUSH {R0~R3, R12} @将 R0~R3 和 R12 压栈
压栈完成以后的堆栈如图 :

由于32位处理器,每个寄存器为32位,占用4个字节,这里5个寄存器占用20个字节,转换为十六进制是0x14,需要在堆栈上分配连续的地址空间长度为0x14,
故SP指针的位置变化为:0x800000 - 0x14 = 0x7FFFFFEC
对 LR 进行压栈完成以后的堆栈模型如图:

这里使用LR寄存器来存放程序的返回地址,同理, LR寄存器(备份寄存器R14)占4个字节,
SP变化:0x7FFFFFEC-0X04 = 0X7FFFFFE8
接下来作出栈操作:
POP {LR} @先恢复 LRPOP {R0~R3,R12} @ 在恢复 R0~R3,R12
PUSH 和 POP 的另外一种写法是“STMFD SP!”和“LDMFD SP!”。STM 和 LDM 就是多存储和多加载,可以连续的读写存储器中的多个连续数据。
3.4跳转指令
一般常用的还是 B、BL 或 BX
如果要在汇编中进行函 数调用使用的就是 B 和 BL 指令
_start : @入口标号ldr sp ,= 0X80200000 @ 设置栈指针b main @跳转到 main 函数 跳转到 C 文件以后再也不会回到汇编了。
3.5算术运算指令
3.6逻辑运算指令

具体案例再补充。
参考:
《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.6》
相关文章:
ARM 汇编基础知识
1.为什么学习汇编? 我们在进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编,因为 Cortex-A 芯片一 上电 SP 指针还没初始化, C 环境还没准备好,所以肯定不能运行 C 代码,必须先用汇编语言设置好 C 环境…...
CRM 自动化如何改善销售和客户服务?
许多 B2B 和 B2C 公司都使用 CRM 系统来组织业务流程,使复杂的任务更容易完成。企业可以使用 CRM 自动化来自动化工作流程,让团队有更多的时间来执行高价值的任务,而不是陷于一堆琐碎事情中。 什么是CRM自动化? CRM 自动化是指 C…...
Bean 的六种作用域
目录 一、作用域是什么? 1、singleton(单例作用域) 2、prototype(原型作用域) 3、request(请求作用域) 4、session(回话作用域) 5、application(全局作用域&a…...
go语言--锁
锁的基础,go的锁是构建在原子操作和信号锁之上的 原子锁 原子包实现协程的对同一个数据的操作,可以实现原子操作,只能用于简单变量的简单操作,可以把多个操作变成一个操作 sema锁 也叫信号量锁/信号锁 核心是一个uint32值&#…...
再见,CSDN
从我2018年1月31日加入CSDN,到现在已经5年多的时间了。在这5年里,陆陆续续在CSDN上发布了很多论文阅读笔记、教程、技术文章等等,记录了我从大四到研究生再到工作这段时间的学习和成长轨迹。 我一直有备份个人资料的习惯,尤其是耗…...
MySQL总复习
目录 登录 显示数据库 创建数据库 删除数据库 使用数据库 创建表 添加数据表数据 查询表 添加数据表多条数据 查询表中某数据 增insert 删delete 改update 查select where like 编辑 范围查找 order by 聚合函数 count max min sum avg g…...
桌面平台层安全随手记录
声明 本文是学习桌面云安全技术要求. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 桌面平台层安全 桌面接入安全 用户标识 一般要求 本项要求包括: a) 系统应为用户提供唯一的身份标识,同时将用户的身份标识与该用户的所…...
【Docker】 08-Dockerfile
什么是Dockerfile Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的教程,主要作用是用来构建docker镜像的构建文件。 Dockerfile解析过程 Dockerfile的保留命令 保留字作用FROM当前镜像是基于哪个镜像的 第一个指令必须是FROMMA…...
【二等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「Aries」解题思路
第十届CCF大数据与计算智能大赛(2022 CCF BDCI)已圆满结束,大赛官方竞赛平台DataFountain(简称DF平台)正在陆续释出各赛题获奖队伍的方案思路,欢迎广大数据科学家交流讨论。 本方案为【大规模金融图数据中…...
Github 下载指定文件夹(git sparse-checkout)
比如要下载这里的 data_utils 步骤 1、新建空文件夹,并进入新建的空文件夹。 2、git init 初始化 3、git remote add origin 添加远程仓库 4、git config core.sparsecheckout true 允许稀疏检出 5、git sparse-checkout set 设置需要拉取的文件夹(可…...
蚂蚁集团SQLess 开源,与内部版有何区别?
当我们使用关系型数据库时,SQL 是联系起用户和数据库的一座桥梁。 SQL 是一种高度非过程化的语言,当我们在编写SQL 时,表达的是想要什么数据,而不是怎么获取数据。因此,我们往往更关心SQL 有没有满足业务逻辑ÿ…...
An Efficient Memory-Augmented Transformer for Knowledge-Intensive NLP Tasks
本文是LLM系列文章,针对《An Efficient Memory-Augmented Transformer for Knowledge 一种用于知识密集型NLP任务的高效内存增强转换器 摘要1 引言2 相关工作3 高效内存增强Transformer4 EMAT的训练流程5 实验6 分析7 结论局限性 摘要 获取外部知识对于许多自然语言…...
Java项目中jar war pom包的区别
1、pom:用在父级工程或聚合工程中,用来做jar包的版本控制,必须指明这个聚合工程的打包方式为pom。 <project ...> <modelVersion>4.0.0</modelVersion> <groupId>com.wong.tech</groupId> <artifactI…...
整理mongodb文档:分页
个人博客 整理mongodb文档:分页 个人博客,求关注,如果文章不够清晰,麻烦指出。 文章概叙 本文主要讲下在聚合以及crud的find方法中如何使用limit还有skip进行排序。 分页的情况很经常出现,这也是这篇博客诞生的理由。 数据准备…...
社区团购新玩法,生鲜蔬菜配货发货小程序商城
在当前的电商市场中,生鲜市场具有巨大的潜力和发展空间。为了满足消费者的需求,许多生鲜店正在寻找创新的方法来提高销售和客户满意度。其中,制作一个个性且功能强大的生鲜小程序商城是一个非常有效的策略。以下是在乔拓云平台上制作生鲜小程…...
shell bash中设置命令set
1 Preface/Foreword set命令用于shell脚本在执行命令时候,遇到异常的处理机制。 2 Usage 2.1 set -e 当执行命令过程中遇到异常,那么就退出脚本,不会往下执行其它命令。 #!/bin/bash #set -eroot GIT_TAG${CI_BUILD_TAG-NOTAG} GIT_REV…...
机器学习---预剪枝、后剪枝(REP、CCP、PEP、)
1. 为什么要进行剪枝 横轴表示在决策树创建过程中树的结点总数,纵轴表示决策树的预测精度。 实线显示的是决策树 在训练集上的精度,虚线显示的则是在⼀个独⽴的测试集上测量出来的精度。 随着树的增⻓,在 训练样集上的精度是单调上升的&…...
Python 爬虫—scrapy
scrapy用于从网站中提取所需数据的开源协作框架。以一种快速、简单但可扩展的方式。 该爬虫框架适合于那种静态页面, js 加载的话,如果你无法模拟它的 API 请求,可能就需要使用 selenium 这种使用无头浏览器的方式来完成你的需求了 入门 imp…...
ABB机器人20032转数计数器未更新故障报警处理方法
ABB机器人20032转数计数器未更新故障报警处理方法 ABB的机器人上面安装有电池,需要定期进行更换(正常一年换一次),如果长时间不更换,电量过低,就会出现转数计数器未更新的报警,各轴编码器的位置就会丢失,在更换新电池后,需要更新转数计数器。 具体步骤如下: 先用手动…...
C# 记事本应用程序
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System...
从按键消抖到I2C总线:一个上拉电阻,在STM32 GPIO配置里到底有多少种玩法?
从按键消抖到I2C总线:一个上拉电阻,在STM32 GPIO配置里到底有多少种玩法? 第一次接触STM32开发板时,看到GPIO配置选项里的"上拉输入"、"开漏输出"这些专业术语,相信不少初学者和我当初一样感到困惑…...
AutoUnipus学习效率工具:提升在线学习体验的智能辅助方案
AutoUnipus学习效率工具:提升在线学习体验的智能辅助方案 【免费下载链接】AutoUnipus U校园脚本,支持全自动答题,百分百正确 2024最新版 项目地址: https://gitcode.com/gh_mirrors/au/AutoUnipus 在数字化学习环境中,学生常面临在线课程任务繁重…...
如何进行 SEO 网站建设的链接优化
如何进行 SEO 网站建设的链接优化 在当今的数字化时代,搜索引擎优化(SEO)无疑是任何网站建设项目中不可或缺的一部分。尤其是在百度这样的主要搜索引擎上,SEO的重要性更是不言而喻。如何进行 SEO 网站建设的链接优化呢࿱…...
从无线通信到国防测试:基于6U VPX国产载板的快速原型开发实战
6U VPX国产载板在高性能实时处理系统中的实战应用 在无线通信、国防电子和测试测量等对实时性要求极高的领域,系统架构师们常常面临一个核心挑战:如何快速搭建一个既能处理复杂算法又能满足严苛环境要求的硬件验证平台。传统方案往往需要在性能、灵活性和…...
3种突破限制方案让窗口尺寸控制效率提升60%
3种突破限制方案让窗口尺寸控制效率提升60% 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否曾遇到这样的困扰:重要的应用程序窗口被固定尺寸无法调整,…...
保姆级教程:在ROS Melodic下,用TEB局部规划器搞定阿克曼小车Gazebo自主导航(附避坑指南)
阿克曼小车Gazebo仿真与TEB局部规划器深度实战指南 当你在Gazebo中看到阿克曼转向结构的小车优雅地绕过障碍物,精准停靠在目标点时,那种成就感是难以言喻的。不同于差速驱动机器人,阿克曼结构的运动学特性为导航栈配置带来了独特挑战。本文将…...
Qwen3-ASR-0.6B高性能优化:CNN加速语音特征提取
Qwen3-ASR-0.6B高性能优化:CNN加速语音特征提取 语音识别技术正在快速融入我们的日常生活,从智能助手到实时字幕,都离不开高效的语音转文本能力。Qwen3-ASR-0.6B作为一款轻量级语音识别模型,在保证识别准确率的同时,更…...
对AI提供信息的不理解或不信任常常会导致误解的积累
对AI提供信息的信任若缺乏审慎验证容易导致误解,因为AI本质上是基于统计概率的"模式匹配机器",而非具备事实判断能力的"知识权威",其输出内容可能包含虚构事实、过时信息或逻辑偏差,而用户往往因AI的"自…...
StructBERT文本相似度-中文-通用模型效果展示:电商商品描述语义聚类案例
StructBERT文本相似度-中文-通用模型效果展示:电商商品描述语义聚类案例 1. 项目概述 StructBERT中文文本相似度模型是一个基于百度深度学习技术的高精度语义理解工具,专门用于计算中文句子之间的语义相似度。这个模型能够理解中文语言的深层语义&…...
TensorRT加速HY-Motion:NVIDIA推理性能提升方案
TensorRT加速HY-Motion:NVIDIA推理性能提升方案 1. 项目背景与价值 HY-Motion 1.0作为业界领先的文生3D动作生成模型,凭借其十亿级参数的Diffusion Transformer架构,在动作生成质量和指令遵循能力方面达到了新的高度。然而,如此…...
