通用指令(汇编)
- 一、数据处理指令
- 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”持续浮出水面,它们不仅没有任何道德界限,更没有使用门槛,没有…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
