当前位置: 首页 > news >正文

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 1616字节对齐填充
.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 条件执行后缀

操作码条件码助记符标志含义
0000EQZ=1相等
0001NEZ=0不相等
0010CS/HSC=1无符号数大于或等于
0011CC/LOC=0无符号数小于
0100MIN=1负数
0101PLN=0正数或零
0110VSV=1溢出
0111VCV=0没有溢出
1000HIC=1、Z=0无符号数大于
1001LSC=0、Z=1无符号数小于或等于
1010GEN=V有符号数大于或等于
1011LTN!=V有符号数小于
1100GTZ=0、Z=V有符号数大于
1101LEZ=1、Z!=V有符号数小于或等于
1110AL任意无条件执行(指令默认条件)
1111NV任意从不执行(不要使用)

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∑ai​i的取值,发现只和最后一次操作222的位置有关,于是递推O(n)O(n)O(n)解决。 赛后发现还有更神奇的结论 第二个结论是,第一次进行操作…...

一文读懂账号体系产品设计

一、账号体系的概念及价值账号体系是用户在各平台上的通行证。平台给与用户可持续的服务,用户在平台上获取价值,中间的媒介,便是账号体系。阿境将其理解为维系用户与平台之间的枢纽。注:本文中,账号账户,二…...

从“入门”到“专家”,一份3000字完整的性能测试体系的知识分享

随着科技的飞速发展,软件产品广泛应用于各个行业领域,人们对计算机和网络的依赖性越来越大,对新奇事物也越来越感兴趣,成千上万的用户活跃在庞大的网络系统中,这给提供服务的系统带来严重的负荷,"高并…...

构建对话机器人:Rasa3安装和基础入门

在开源对话机器人中,Rasa社区很活跃,在国内很多企业也在使用Rasa做对话机器人,有rasa开发经验的往往是加分项。 当年实习的时候接触到了Rasa,现在工作中也使用Rasa,因此,写写一些经验文档,有助后…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)&#xff…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...