ARM的汇编指令集
一、汇编指令
1.1 指令与伪指令
汇编的指令
指令是CPU机器指令的助记符,编译后会得到一串二进制机器码,由CPU执行
汇编的伪指令
伪指令本质上不是指令,它是编译器环境提供用来指导编译过程,编译后伪指令不会生成机器码
伪指令的意义在于指导编译过程
区别
经过编译后会不会生成二进制机器码
1.2 gun汇编中的符号
| 符号 | 作用 |
|---|---|
| @ | 用来做注释,可以在行首也可以在代码后面同一行直接跟,和C语言中 // 类似 |
| : | 以冒号结尾的是标号 |
| . | 点号在gnu汇编中表示当前指令的地址 |
| # | 立即数前面要加#或$,表示这是个立即数 |
1.3 gun汇编中的伪指令
1、ARM中有一个ldr指令,还有一个ldr伪指令,一般都使用ldr伪指令而不用ldr指令
2、adr与ldr:
① adr编译时会被sub或add指令替代,
② ldr编译时会被mov指令替代或者文字池方式处理
③ adr总是以PC为基准来表示地址,指令本身和运行地址有关,用来检测程序当前的运行地址在哪里
④ ldr加载的地址和链接时给定的地址有关,由链接脚本决定
| 符号 | 作用 |
|---|---|
| ldr | 大范围的地址加载 |
| adr | 小范围的地址加载 |
| adrl | 中等范围的地址加载 |
| nop | 空操作 |
| .global _start | 给_start外部链接属性 |
| .section .text | 指定当前段为代码段 |
| .align 4 | 以16字节对齐 |
| .balignl 16 | 16字节对齐填充 |
| .end | 标识文件结束 |
| .include | 头文件包含 |
| .arm / .code32 | 声明以下为arm指令 |
| .thumb / .code16 | 声明以下为thubm指令 |
| .ascii .byte .short .long | 定义数据 |
| .word.quad .float .string | 定义数据 |
二、不同风格的ARM指令
ARM官方的ARM汇编风格
指令一般用大写、 Windows中IDE开发环境(如ADS、MDK等)常用。
LDR R0, [R1]
GNU风格的ARM汇编
指令一般用小写字母、 linux中常用。
ldr r0, [r1]
三、ARM汇编的特点
3.1 LDR/STR架构
1、 ARM的CPU不能直接读取内存,需要先将内存加载到CPU通用寄存器中才能被CPU处理
2、 ldr(load register)指令将内存加载到通用寄存器
3、 str(store register)指令将寄存器内容保存到内存空间
4、 ldr/str组合用来实现 ARM CPU和内存之间数据的交换
3.2 8种寻址方式
| 寻址方式 | 例子 |
|---|---|
| 寄存器寻址 | mov r1, r2 |
| 立即寻址 | mov r0, #0xFF00 |
| 寄存器移位寻址 | mov r0, r1, lsl #3 |
| 寄存器间接寻址 | ldr r1, [r2] |
| 基址变址寻址 | ldr r1, [r2, #4] |
| 多寄存器寻址 | ldmia r1!, {r2-r7,r12} |
| 堆栈寻址 | stmfd sp!, {r2-r7, lr} |
| 相对寻址 | beq flag flag: |
3.3 指令后缀
汇编指令中,同一指令经常附带不同后缀,变成不同的指令
经常使用的后缀有:
1、B(byte)功能不变,操作长度变为8位
2、H(half word)功能不变,长度变为16位
3、S(signed)功能不变,操作数变为有符号
4、S(S标志)功能不变,影响CPSR标志位
// B H SB SH
ldr ldrb ldrh ldrsb ldrsh
//mov和movsmovs r0, #0
3.4 条件执行后缀
| 操作码 | 条件码助记符 | 标志 | 含义 |
|---|---|---|---|
| 0000 | EQ | Z=1 | 相等 |
| 0001 | NE | Z=0 | 不相等 |
| 0010 | CS/HS | C=1 | 无符号数大于或等于 |
| 0011 | CC/LO | C=0 | 无符号数小于 |
| 0100 | MI | N=1 | 负数 |
| 0101 | PL | N=0 | 正数或零 |
| 0110 | VS | V=1 | 溢出 |
| 0111 | VC | V=0 | 没有溢出 |
| 1000 | HI | C=1、Z=0 | 无符号数大于 |
| 1001 | LS | C=0、Z=1 | 无符号数小于或等于 |
| 1010 | GE | N=V | 有符号数大于或等于 |
| 1011 | LT | N!=V | 有符号数小于 |
| 1100 | GT | Z=0、Z=V | 有符号数大于 |
| 1101 | LE | Z=1、Z!=V | 有符号数小于或等于 |
| 1110 | AL | 任意 | 无条件执行(指令默认条件) |
| 1111 | NV | 任意 | 从不执行(不要使用) |
3.5 8种后缀
| 后缀 | 含义 |
|---|---|
| ia | 先传输,再地址+4 |
| ib | 先地址+4,再传输 |
| da | 先传输,再地址-4 |
| db | 先地址-4,再传输 |
| fd | 满递减堆栈 |
| ed | 空递减堆栈 |
| fa | 满递增堆栈 |
| ea | 空递增堆栈 |
3.6 4种栈
空栈:栈指针指向空位,存入时可直接存入然后指针移动一格;取出时需要先移动一格才能取出
满栈:栈指针指向栈中最后一格数据,每次存入时需要先移动栈指针一格再存入;取出时可以直接取出,然后再移动栈指针
增栈:栈指针移动时向地址增加的方向移动的栈
减栈:栈指针移动时向地址减小的方向移动的栈
注意:操作栈时使用相同的后缀就不会出错
四、ARM汇编的常用指令
4.1 数据处理指令
| 指令类型 | 指令 |
|---|---|
| 数据传输指令 | mov mvn |
| 算术指令 | add sub rsb adc sbc rsc |
| 逻辑指令 | and orr eor bic |
| 比较指令 | cmp cmn tst teq |
| 乘法指令 | mvl mla umull umlal smull smlal |
| 前导零计数 | clz |
4.2 CPSR访问指令
CPSR寄存器比较特殊,需要专门的指令进行访问
| 指令类型 | 指令 |
|---|---|
| mrs | 读取psr |
| msr | 写入psr |
4.3 跳转指令
| 指令 | 作用 |
|---|---|
| b | 直接跳转(跳转后不返回) |
| bl | 跳转前把返回地址放入lr中,用于函数调用返回 |
| bx | 跳转同时切换到ARM模式,用于异常处理的跳转 |
4.4 访存、软中断指令
ldr/str每周期只能访问4字节内存,如果需要批量读取、写入内存时太慢
stm/ldm每周期可以批量读取、写入内存
| 指令 | 作用 |
|---|---|
| ldr/str | 单个字/半字/字节访问 |
| ldm/stm | 多字批量访问 |
| swi(software interrupt) | 软中断指令,用来实现操作系统中系统调用 |
4.5 协处理器操作指令
1、SoC内部另一处理核心,协助主CPU实现某些功能,被主CPU调用执行一定任务
2、ARM设计上支持16个协处理器,一般SoC只实现其中的CP15
3、协处理器和MMU、 cache、 TLB等处理有关
4、功能上和操作系统的虚拟地址映射、cache管理等有关
| 指令 | 作用 |
|---|---|
| mrc | 用于读取CP15中的寄存器 |
| mcr | 用于写入CP15中的寄存器 |
五、ARM汇编符号的作用
5.1 ! 的作用
ldmia r0 , {r2 - r3}
ldmia r0! , {r2 - r3}
!的作用:
r0的值在ldm过程中发生的增加或者减少最后写回到r0去
也就是说ldm时会改变r0的值。
5.2 ^ 的作用
ldmfd sp!, {r0 - r6, pc}
ldmfd sp!, {r0 - r6, pc}^
^ 的作用:在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用于从异常模式返回
相关文章:
ARM的汇编指令集
一、汇编指令 1.1 指令与伪指令 汇编的指令 指令是CPU机器指令的助记符,编译后会得到一串二进制机器码,由CPU执行 汇编的伪指令 伪指令本质上不是指令,它是编译器环境提供用来指导编译过程,编译后伪指令不会生成机器码 伪指令…...
@font-face用法超详细讲解
文章目录font-face是什么font-face基本语法urlTTFOTFEOTWOFFSVGformatfont-face用法示例font字体下载ttf-to-eot 字体转换器https://blog.csdn.net/qq_37417446/article/details/106728725 https://developer.mozilla.org/zh-CN/docs/Web/CSS/font-face font-face是什么 font-…...
[oeasy]python0095_乔布斯求职_雅达利_atari_breakout_打砖块_布什内尔_游戏机_Jobs
编码进化 回忆上次内容 上次 我们回顾了 电子游戏的历史 从 电子游戏鼻祖 双人网球到 视频游戏 PingPong再到 街机游戏 Pong 雅达利 公司 来了 嬉皮士 捣乱?🤔 布什内尔 会如何 应对 呢?🤔 布什内尔 布什内尔 本身就有点 …...
全景极简印度史
转自:印度简史 - 知乎 (zhihu.com)印度是世界上最早出现文明的地区之一,印度河是其文明的发源地。古印度文明的疆域曾包括今印度共和国、巴基斯坦、孟加拉国、阿富汗斯坦南部部分地区和尼泊尔。史前时代200万年前,巴基斯坦北部的希瓦利克遗址…...
《设计模式》模板方法
《设计模式》模板方法 模板方法是一种行为型设计模式,用于定义一个算法的框架,而将一些步骤的实现留给子类来完成。模板方法在基类中定义了一个模板方法,该方法确定了算法的基本结构,然后将一些步骤的实现交给子类去完成。这个模…...
Linux环境内存管理——链表
我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Windows程序员如何学习Linux环境内存管理。由于很多程序在Windows环境下开发好后,还要部署到Linux服务器上去,所以作为Windows程序员有必要学习Linux环境的内存…...
String、StringBuffer、StringBuilder类
String类 由多个字符组成的一串数据,值一旦创建不可改变 private final char value[]; 一旦值改变,就会创建新的对象 String s "abc"; //char[] c {a,b,c}s"def"; // 并不是String的值改变,而是创建了一个新的对象s"gh";s"aaa"…...
在VScode中添加Linux中的Docker容器中的Python解释器
VScode编辑器在安装好Python插件之后会自动选择环境变量中排序最高的那一个解释器作为默认解释器,而想要额外添加新的Python解释器就需要自己设置。 VScode编辑器安装在本地电脑 支持Python的docker安装在远程服务器 第一步,在/usr/local/下新建pytho…...
无法将“django-admin”项识别为cmdlet,函数,脚本文件或可运行程序的名称问题
无法将“django admin”项识别为cmdlet,函数,脚本文件或可运行程序的名称问题 小提示:首先检查一下有没有拼写错误!!!没有的话请继续 我们要知道django装到哪里去了 pip show django 注意:3.0…...
乐友商城学习笔记(十五)
无状态登陆原理 在服务器端保存session 无状态不需要session,把登陆状态保存在cookie中 jwtrsa token:登陆时, jwt oath2 jwt:头信息(jwt) 载荷(用户信息,签发人,签发时…...
目标检测论文阅读:CBNet算法笔记
标题:CBNet: A Composite Backbone Network Architecture for Object Detection 期刊:TIP2022 论文地址:https://ieeexplore.ieee.org/document/9932281/ 官方代码:https://github.com/VDIGPKU/CBNetV2 作者单位:北京大…...
vue前端与Java后端进行跨域交互
1.后端的几种解决方法 1.在Controller上面加上CrossOrigin 2.写一个配置文件并且在Controller层加上注解CORSConfig package com.wolwo.langyage.base.util;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configurat…...
【设计模式】2.抽象工厂模式
抽象工厂模式 前面介绍的工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、传智播客只培养计算机软件专业的学生等。 这些工厂只生产同种类产品,同种类产品称为同等级产品,也就是说:工厂方法模式…...
Telnet 基础实验1: Telnet 实验
Telnet 基础实验1: Telnet 实验 拓扑图 配置命令 R1 的配置 undo ter mo sys sys R1 interface g0/0/0 ip address 192.168.1.1 255.255.255.0 qR2 的配置 undo ter mo system-view sysname R2 interface g0/0/0 ip address 192.168.1.2 255.255.255.0 q两台设…...
机器学习经典算法——决策树(Decision Tree)
决策树的基本原理 决策树是⼀种分⽽治之的决策过程。⼀个困难的预测问题,通过树的分⽀节点,被划分成两个或多个较为简单的⼦集,从结构上划分为不同的⼦问题。将依规则分割数据集的过程不断递归下去。随着树的深度不断增加,分⽀节…...
MySQl总结
文章目录MySQL数据库的常见考点1、ACID事务原理事务持久性事务原子性MVCC基本概念MVCC基本原理undo logundo log版本链readviewMVCC实现原理RC读已提交RR可重复读MVCC实现原理总结2、并发事务引发的问题3、事务隔离级别4、索引索引结构BTreeHash面试题索引分类思考题语法性能分…...
【学习笔记】NOIP爆零赛7
结论专场,结果被踩暴了 青鱼和序列 赛时的做法是,维护∑aii\sum a_i\times i∑aii的取值,发现只和最后一次操作222的位置有关,于是递推O(n)O(n)O(n)解决。 赛后发现还有更神奇的结论 第二个结论是,第一次进行操作…...
一文读懂账号体系产品设计
一、账号体系的概念及价值账号体系是用户在各平台上的通行证。平台给与用户可持续的服务,用户在平台上获取价值,中间的媒介,便是账号体系。阿境将其理解为维系用户与平台之间的枢纽。注:本文中,账号账户,二…...
从“入门”到“专家”,一份3000字完整的性能测试体系的知识分享
随着科技的飞速发展,软件产品广泛应用于各个行业领域,人们对计算机和网络的依赖性越来越大,对新奇事物也越来越感兴趣,成千上万的用户活跃在庞大的网络系统中,这给提供服务的系统带来严重的负荷,"高并…...
构建对话机器人:Rasa3安装和基础入门
在开源对话机器人中,Rasa社区很活跃,在国内很多企业也在使用Rasa做对话机器人,有rasa开发经验的往往是加分项。 当年实习的时候接触到了Rasa,现在工作中也使用Rasa,因此,写写一些经验文档,有助后…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
