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,因此,写写一些经验文档,有助后…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
