通用指令(汇编)
- 一、数据处理指令
- 1)数学运算
- 数据运算指令的格式
- 数据搬移指令
- 立即数
- 伪指令
- 加法指令
- 带进位的加法指令
- 减法指令
- 带借位的减法指令
- 逆向减法指令
- 乘法指令
- 数据运算指令的扩展
- 2)逻辑运算
- 按位与指令
- 按位或指令
- 按位异或指令
- 左移指令
- 右移指令
- 位清零指令
- 3)比较指令
- 怎么影响到CPSR寄存器中的状(N, Z, C, V)
- 比较指令
- ARM指令的条件码
- 二、跳转指令
- 1)跳转指令
- 跳转指令
- 三、Load / Srore指令
- 1)内存访问指令
- 写内存
- 读内存
- 2)ARM指令的寻址方式
- 立即寻址
- 寄存器寻址
- 寄存器移位寻址
- 寄存器间接寻址
- 基址加变址寻址
- 基址加变址寻址的索引方式
- 多寄存器内存访问指令的寻址方式
- 3)栈的种类与使用
一、数据处理指令
数据处理指令(数学运算、逻辑运算)
1)数学运算
32位处理器什么意思:单次运算数据的能力,单次最大可处理32位的数据
数据运算指令的格式
《操作码》《目标寄存器》《第一操作寄存器》《第二操作数》
操作码: 表示执行哪种操作
目标寄存器: 表示存储运算的结果
第一操作寄存器: 存储第一个参与运算的寄存器(只能是寄存器)
第二操作数: 存储第二个参与运算的数据(寄存器、立即数都可以)
数据搬移指令
MOV R1, #1
MOV R2, R1 // R2 = R1
MOV PC, #7 // 可以更改PC的值,但是系统会默认把后两位改成0,7八进制>111系统会自动改成4>100
MVN R0, #0xFF // R0 = ~0xFF R0的内容就是0xFFFFFF00
立即数
立即数的本质是包含在指令当中的数,属于指令的一部分,这条执行是一起编译成机器码的
优点:
取值的时候就可以直接读取到CPU,不用单独去内存读取,速度快
缺点:
不能是任意的32位的数字,有局限性
MOV R1, #0x12345678 //不可以执行,因为数字太大
MOV R1, #0x12 //可以执行
伪指令
MOV R1, #0xFFFFFFFF
//当执行这条指令的时候显然这个数字太大,但是可以编译成功,是系统自动会将这条指令替换成 MVN R1, #0x00000000 这样就和MOV R1, #0xFFFFFFFF 指令执行的效果一样,这样的行为前提是两条指令要达到的效果相同
加法指令
ADD R1, R2, R3 //R1 = R2+R3
带进位的加法指令
ADC R5, R2, R4 // R5 = R2 + R4 + ‘CPSR->C’
1.编程实现使用32bit的ARM处理器实现两个128位的数据的加法运算。
注:
第一个数的bit[31:0]、bit[63:32]、bit[95:64]、bit[127:96]分别存储在R1、R2、R3、R4寄存器
第二个数的bit[31:0]、bit[63:32]、bit[95:64]、bit[127:96]分别存储在R5、R6、R7、R8寄存器
运算结果的bit[31:0]、bit[63:32]、bit[95:64]、bit[127:96]分别存储在R9、R10、R11、R12寄存器
@ 第一个数 0x00000004 00000002 FFFFFFFF 00000004MOV R1, #0xFFFFFFFFMOV R2, #0x00000002MOV R3, #0xFFFFFFFFMOV R4, #0x00000004@ 第二个数 0x00000005 00000004 00000003 00000002MOV R5, #0x00000002 MOV R6, #0x00000003MOV R7, #0x00000004MOV R8, #0x00000005@ 运算结果ADDS R9 , R1, R5 //加 'S' 可以影响到CPSR寄存器,高位运算时,可以看出低位有没有进位ADCS R10, R2, R6ADCS R11, R3, R7ADC R12, R4, R8
减法指令
SUB R1, R2, R3 //R1 = R2-R3
带借位的减法指令
SBC R5, R2, R4 // R5 = R2 - R4 - ‘~CPSR->C’ 取反
逆向减法指令
RSB R1, R2, #3 //R1 = 3-R2
乘法指令
MUL R1, R2, R3 //R1 = R2*R3 乘法指令只能是两个寄存器执行
数据运算指令的扩展
MOV R1, R2, LSL #1 //R1 = (R2<<1)
2)逻辑运算
按位与指令
AND R1, R2, R3 //R1 = R2&R3
按位或指令
ORR R1, R2, R3 //R1 = R2 | R3
按位异或指令
EOR R1, R2, R3 //R1 = R2 ^ R3
左移指令
LSL R1, R2, R3 //R1 = R2 << R3
右移指令
LSR R1, R2, R3 //R1 = R2 >> R3
位清零指令
MOV R2, #0xFF
BIC R1, R2, #0x0F
//第二操作数的哪一位为1,就把第一寄存器中的哪一位清零,然后将结果放入目标寄存器中
3)比较指令
怎么影响到CPSR寄存器中的状(N, Z, C, V)
数据运算指令对条件位CPSR寄存器中的状(N, Z, C, V)的影响
默认情况下数据运算不会对条件位产生影响,当在指令后加后缀‘S’后可以影响
MOV R2, #3
SUBS R1, R2, #5 //将会对 N 状态位产生影响
比较指令
CMP R1, R2
本质是一条(SUBS),只是没有将运算结果放入寄存器当中,是看CSPR寄存器状态位(N, Z, C, V)
== Z=1
!= Z=0
< C=0
<= C=0 或 Z=1
> C=1 且 Z=0
>= C=1
MOV R1, #1MOV R2, #2CMP R1, R2BEQ FUNC @ 执行逻辑:if(EQ){B FUNC} 本质:if(Z==1){B FUNC}BNE FUNC @ 执行逻辑:if(NE){B FUNC} 本质:if(Z==0){B FUNC}MOV R3, #3MOV R4, #4MOV R5, #5FUNC:MOV R6, #6MOV R7, #7@ ARM指令集中大多数指令都可以带条件码后缀MOV R1, #1MOV R2, #2CMP R1, R2MOVGT R3, #3@ 练习:用汇编语言实现以下逻辑int R1 = 9;int R2 = 15;START:if(R1 == R2){STOP();}else if(R1 > R2){ R1 = R1 - R2;goto START;}else{R2 = R2 - R1;goto START;}@ 练习答案:MOV R1, #9MOV R2, #15START:CMP R1,R2BEQ STOPSUBGT R1, R1, R2SUBLT R2, R2, R1B STARTSTOP: B STOP
ARM指令的条件码
ARM指令集中大多数指令都可以带条件码后缀(如:SUBEQ)
二、跳转指令
1)跳转指令
跳转指令
有三种方式
第一种方法:直接去修改PC的值(不建议使用,因为需要自己计算绝对地址)
MAIN:MOV R1, #1MOV R2, #2MOV PC, #0x16MOV R3, #3FUNC:MOV R4, #4MOV R5, #5MOV R6, #6
第二种方法:不带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下第一条指令的地址
MAIN:MOV R1, #1MOV R2, #2B FUNCMOV R3, #3FUNC:MOV R4, #4MOV R5, #5MOV R6, #6
第三种方法;带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下第一条指令的地址,同时将跳转指令的下一条指令的地址存储到LR
MAIN:MOV R1, #1MOV R2, #2BL FUNCMOV R3, #3FUNC:MOV R4, #4MOV R5, #5MOV R6, #6MOV PC, LR
三、Load / Srore指令
Load / Srore指令(访问(读写)内存)
1)内存访问指令
Load/Srore指令:访问(读写)内存 当LD开头的指令 内存读数据到CPU 当ST开头的指令 把CPU中的数据存到内存当中
写内存
@ MOV R1, #0xFFFFFFF1@ MOV R2, #0x40000000@ STR R1, [R2] 默认是写入一个字(四个字节)的数据@ STRB R1, [R2] 内存中写入'B'一个字节的数据'F1'@ STRH R1, [R2] 内存中写入'H'两个字节的数据'FFF1'@ R2->0x40000000内存空间 = R1的数据
读内存
@ MOV R1, #0xFFFFFFF1@ MOV R2, #0x40000000@ LDR R3, [R2] R3 = 默认内存读出一个字(四个字节)的数据@ LDRB R3, [R2] R3 = 内存读出一个字节的数据@ LDRH R3, [R2] R3 = 内存读出两个字节的数据@ R3 = R2->0x40000000内存空间的数据
2)ARM指令的寻址方式
寻址方式就是CPU去寻找操作数的方式
立即寻址
@ MOV R1, #1
@ ADD R1, R2, #1
寄存器寻址
@ ADD R1, R2, R3
寄存器移位寻址
@ MOV R1, R2, LSL #1
寄存器间接寻址
@ STR R1, [R2]
基址加变址寻址
@ MOV R1, #0xFFFFFFFF@ MOV R2, #0x40000000@ MOV R3, #4@ STR R1, [R2,R3]@ 将R1寄存器中的数据写入到R2+R3指向的内存空间@ STR R1, [R2,R3,LSL #1]@ 将R1寄存器中的数据写入到R2+(R3<<1)指向的内存空间
基址加变址寻址的索引方式
前索引
@ MOV R1, #0xFFFFFFFF@ MOV R2, #0x40000000@ STR R1, [R2,#8]@ 将R1寄存器中的数据写入到R2+8指向的内存空间@ LDR R2, [R2,#8]@ 将R2+8指向的内存空间的数据写入到R2寄存器中
后索引
@ MOV R1, #0xFFFFFFFF@ MOV R2, #0x40000000@ STR R1, [R2],#8@ 将R1寄存器中的数据写入到R2指向的内存空间,然后R2自增8@ LDR R1, [R2],#8@ 将R2+8指向的内存空间的数据写入到R2寄存器中,然后R1自增8
自动索引
@ MOV R1, #0xFFFFFFFF@ MOV R2, #0x40000000@ STR R1, [R2,#8]!@ 将R1寄存器中的数据写入到R2+8指向的内存空间,然后R2自增8@ LDR R6, [R2,#8]!@ 将R2+8指向的内存空间的数据写入到R6寄存器中,然后R6自增8
多寄存器内存访问指令的寻址方式
@ MOV R1, #1@ MOV R2, #2@ MOV R3, #3@ MOV R4, #4@ MOV R11,#0x40000020@ STMIA R11!,{R1-R4}@ 先存储数据,后增长地址@ STMIB R11!,{R1-R4}@ 先增长地址,后存储数据@ STMDA R11!,{R1-R4}@ 先存储数据,后递减地址@ STMDB R11!,{R1-R4}@ 先递减地址,后存储数据
3)栈的种类与使用
栈的概念
栈的本质就是一段内存,程序运行时用于保存一些临时数据如局部变量、函数的参数、返回值、以及程序跳转时需要保护的寄存器等
栈的分类
增栈:压栈时栈指针越来越大,出栈时栈指针越来越小
减栈:压栈时栈指针越来越大,出栈时栈指针越来越小
满栈:栈指针指向最后一次压入到栈中的数据,压栈时需要先移动栈指针到相邻位置然后再压栈
空栈:栈指针指向最后一次压入到栈中的数据的相邻位置,压栈时可直接压栈,之后需要将栈指针移动到相邻位置
栈分为空增(EA)、空减(ED)、满增(FA)、满减(FD)四种
ARM处理器一般使用满减栈
MOV R1, #1MOV R2, #2MOV R3, #3MOV R4, #4MOV R11,#0x40000020STMFD R11!,{R1-R4}LDMFD R11!,{R6-R9}@ 结果 R6 = 1, R7 = 2, R8 = 3, R9 = 4
栈的应用举例
1.叶子函数的调用过程举例
@ 初始化栈指针MOV SP, #0x40000020
MIAN:MOV R1, #3MOV R2, #5BL FUNCADD R3, R1, R2B STOPFUNC:@ 压栈保护现场STMFD SP!, {R1,R2}MOV R1, #10MOV R2, #20SUB R3, R2, R1@ 出栈恢复现场LDMFD SP!, {R1,R2}MOV PC, LR
2.非叶子函数的调用过程举例
MOV SP, #0x40000020
MIAN:MOV R1, #3MOV R2, #5BL FUNC1ADD R3, R1, R2B STOP
FUNC1:STMFD SP!, {R1,R2,LR}MOV R1, #10MOV R2, #20BL FUNC2SUB R3, R2, R1LDMFD SP!, {R1,R2,LR}MOV PC, LR
FUNC2:STMFD SP!, {R1,R2}MOV R1, #7MOV R2, #8MUL R3, R1, R2LDMFD SP!, {R1,R2}MOV PC, LR@ 执行叶子函数时不需要对LR压栈保护,执行非叶子函数时需要对LR压栈保护
相关文章:

通用指令(汇编)
一、数据处理指令1)数学运算数据运算指令的格式数据搬移指令立即数伪指令加法指令带进位的加法指令减法指令带借位的减法指令逆向减法指令乘法指令数据运算指令的扩展 2)逻辑运算按位与指令按位或指令按位异或指令左移指令右移指令位清零指令 3ÿ…...
苏宁数据治理实战方法论和三字经
随着移动互联网和大数据的蓬勃发展,“数据即资产”的理念深入人心。大数据已发展成为具有战略意义的生产资料,在各行各业发挥着极其重要的作用,而大数据也给很多企业带来了前所未有的自豪感和自信感。 但是,大数据真的是越“大”越…...
创建型设计模式:3、单例模式(C++实现实例 线程安全)
目录 1、单例模式(Singleton Pattern)的含义 2、单例模式的优缺点 (1)优点: (2)缺点: 3、C实现单例模式的示例(简单) 4、C实现单例模式的示例ÿ…...
JavaWeb学习笔记
Maven:自动导入配置jar包。 Maven项目架构管理工具:核心思想:约定大于配置 Maven:环境优化 1.修改web.xml为最新的 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee&…...

ad+硬件每日学习十个知识点(24)23.8.4(时序约束,SignalTap Ⅱ)
文章目录 1.建立时间和保持时间2.为什么要建立时序约束?3.SignalTap Ⅱ4.SignalTap Ⅱ使用方法5.HDL的仿真软件(modelsim)6.阻抗匹配 1.建立时间和保持时间 答: 2.为什么要建立时序约束? 答: 3.Sign…...

FortiGate防火墙日志审计运维
环境介绍 CPU:8核,内存:16GB,硬盘:100GB 操作系统版本:CentOS-7-x86_64-DVD-2003 平台版本:鸿鹄2.7.0 安装组件 安装环境支持确认 鸿鹄计算引擎使用了 AVX2 高级指令集做向量计算加速…...
基于yolo v5与Deep Sort进行车辆以及速度检测与目标跟踪实战
项目实验结果展示: 基于yolo v5与Deep Sort进行车辆以及速度检测与目标跟踪实战——项目可以私聊 该项目可以作为毕业设计,以及企业级的项目开发,主要包含了车辆的目标检测、目标跟踪以及车辆的速度计算,同样可以进行二次开发。 …...

以指标驱动,保险、零售、制造企业开启精益敏捷运营的新范式
近日,以“释放数智生产力”为主题的 Kyligence 用户大会在上海前滩香格里拉大酒店成功举行。大会包含上午的主论坛和下午的 4 场平行论坛,并举办了闭门会议、Open Day 等活动。来自金融、零售、制造、医药等行业的客户及合作伙伴带来了超过 23 场主题演讲…...

MyBatis-动态SQL-foreach
目录 标签有以下常用属性: 小结 <froeach> <foreach>标签有以下常用属性: collection:指定要迭代的集合或数组的参数名(遍历的对象)。item:指定在迭代过程中的每个元素的别名(遍历…...

VUE框架:vue2转vue3全面细节总结(3)路由组件传参
大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人_python人工智能视觉(opencv)从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了: https://blog.csdn.net/lbcy…...

音视频技术开发周刊 | 305
每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 大神回归学界:何恺明宣布加入 MIT 「作为一位 FAIR 研究科学家,我将于 2024 年加入麻省理工学院(MIT)电气工程与计算机科学…...
vue 图片base64转化
import html2canvas from ‘html2canvas’ html2canvas(canvasDom, options).then(canvas > { //此时的图片是base64格式的,我们将图片格式转换一下 let type ‘png’; let imgData canvas.toDataURL(type); // 照片格式处理 let _fixType function(type) { …...
TS学习03-类
类 calss A {name: stringconstructor(name:string) {this.name name}greet() {return hello, this.name} } let people new A(RenNing)继承 子类是一个派生类,他派生自父类(基类),通过 extends关键字 派生类通常被称作 子类…...

FastAPI(七)应用配置
目录 一、在apps下新建文件夹config 二、新建配置文件app_conf.py 一、在apps下新建文件夹config 二、新建配置文件app_conf.py from functools import lru_cachefrom pydantic.v1 import BaseSettingsclass AppConfig(BaseSettings):app_name: str "Windows10 插件&qu…...

eclipse Java Code_Style Code_Templates
Preferences - Java - Code Style - Code Templates Eclipse [Java_Code_Style_Code_Templates_ZengWenFeng] 2023.08.07.xml 创建一个新的工程,不然有时候不生效,旧项目可能要重新导入eclipse 创建一个测试类试一试 所有的设置都生效了...

01《Detecting Software Attacks on Embedded IoT Devices》随笔
2023.08.05 今天读的是一篇博士论文 论文传送门:Detecting Software Attacks on Embedded IoT Devices 看了很长时间,发现有一百多页,没看完,没看到怎么实现的。 摘要 联网设备的增加使得嵌入式设备成为各种网络攻击的诱人目标&…...

APP外包开发的学习流程
学习iOS App的开发是一项有趣和富有挑战性的任务,是一个不断学习和不断进步的过程。掌握基础知识后,不断实践和尝试新的项目将使您的技能不断提升。下面和大家分享一些建议,可以帮助您开始学习iOS App的开发。北京木奇移动技术有限公司&#…...
第0章 环境搭建汇总
mini商城第0章 环境搭建汇总 本文是整个mini商城的前置文档,所有用到的技术安装都在本篇文档中有详细描述。所有软件安装不分先后顺序,只是作为一个参考文档,需要用到什么技术软件,就按照文档安装什么软件,切不可一上来全部安装一遍。 文章中有些截图中服务器地址是192.16…...

大数据培训课程-《机器学习从入门到精通》上新啦
《机器学习从入门到精通》课程是一门专业课程,面向人工智能技术服务,课程系统地介绍了Python编程库、分类、回归、无监督学习和模型使用技巧以及算法和案例充分融合。 《机器学习从入门到精通》课程亮点: 课程以任务为导向,逐步学…...
暗黑版GPT流窜暗网 降低犯罪门槛
随着AIGC应用的普及,不法分子利用AI技术犯罪的手段越来越高明,欺骗、敲诈、勒索也开始与人工智能沾边。 近期,专为网络犯罪设计的“暗黑版GPT”持续浮出水面,它们不仅没有任何道德界限,更没有使用门槛,没有…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...