ARM中汇编语言的学习(加法、乘法、除法、左移、右移、按位与等多种命令操作实例以及ARM的 N、Z、C、V 标志位的解释)

汇编概述

  • 汇编需要学习的大致框架如下:
    @ 汇编中的符号
    @ 1.指令;能够北嘁肷梢惶?2bit机器码,并且能够被cpui识别和执行
    @ 2.伪指令:本身不是指令,编译器可以将其替换成若干条指令
    @ 3.伪操作:不会生成指令,只在编译阶段告诉编译器怎么编译
    @ ARM指令集
    @ 1.数据处理指令:进行数学运算、逻辑运算
    @ 2.跳转指令:实现程序的眺转,本质就是修改PC寄存器
    @ 3.Load/Score指令:访问(读写)内存
    @ 4.状态寄存器传送指令:用于访问(读写)CPSR寄存器
    @ 5.软中断指令:触发软中断
    @ 6.协处理器指令:协处理器可以处理的指令
    .text @表示当前为代码段
    .global _start @将_start定义成全局符号
    _start: @汇编入口
    MOV R1,#1 @汇编指令
    stop: @死循环,防止程序跑飞
    B stop
    .end @汇编的结束

汇编数据处理指令

  • MOV指令的实例操作
    @ 1.指令:能够编译生成一条32位的机器码,且能被cpu识别和执行
    @ 1.1 数据处理指令:数学运算、逻辑运算
    @ 数据搬移指令
    @ MOV R1,#1
    @ R1 = 1
    @ MOV R2,R1
    @ R2 = R1
    @MVN R0,#0xFF
    @ R0 = ~0xFF
    @MOV R0,#0
    @MOV R1,#0
    @MOV R1,#1
    @MVN R0,#0
    @ 立即数:编译通过的是立即数,否则不是
    @ 立即数的本质就是包含在指令当中的数,属于指令的一部分,变量则是单独占一个空间
    @ 立即数的优点
    @ 取值的时候就是可以将其读取到CPU,不用单独去内存读取,速度快
    @ 立即数的缺点
    @ 不能是任意的32的数字,有局限性
    @ MOV R0,#0x12345678
    @ 因为12345678太大了,所以编译报错,指令本身还有其他数而12345678本身就占了32位
    @MOV R0, #0x12
    @ MOV R0, #0xFFFFFFFF
    @ 上述相当于伪指令,执行时替换成等价的CPU能认识的指令
  • 数据运算指令格式操作实例(ADD、SUB等指令)
    @ 数据运算指令的格式
    @ 《操作吗》《目标寄存器》《第一操作寄存器》《第二操作数》
    @ 操作码:表示执行哪种操作
    @ 目标寄存器:用于存储运算的结果
    @ 第一操作寄存器:存储第一个参与运算的数据(只能写寄存器)
    @ 第二操作数:第二个参与运算的数据(可以是寄存器也可以是立即数)
    @ 加法指令
    @MOV R2,#5
    @MOV R3,#3
    @ADD R1,R2,R3
    @ R1 = R2 + R3
    @ADD R1,R2,#5
    @ ADD R1,#5 R1这个形式的不行
    @ ADD 不能计算两个值,例如:ADD R1,#2,#5,也不能是以下格式:ADD R1 #2,R2
    @ 减法指令
    @SUB R1,R2,R3
    @ R1 = R2 - R3
    @SUB R1,R2,#3
    @ R1 = R2 - 3
    @ 逆向减法指令,针对例如这种格式:R1 = #2 - R2
    @RSB R1,R2,#3
    @ R1 = 3 - R2
    @ 乘法指令
    @MUL R1,R2,R3
    @ R1 = R2 * R3
    @ 乘法必须是两个寄存器相乘
    @ 按位与指令
    @AND R1,R2,R3
    @ R1 = R2 & R3
    @ 按位与指令
    @ORR R1,R2,R3
    @ R1 = R2 | R3
    @ 按位异或指令,相同为0,相异则1
    @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,则将第一操作寄存器中的哪一位清0,然后将结果放入目标寄存器
    @ 数据运算指令的格式扩展
    @MOV R1,R2,LSL #1
    @ R1 = (R2 << 1)
    @ 数据运算指令对条件位(N、Z、C、V)的影响
    @ 默认情况下数据运算不会对条件位产生影响,当在指令后加后缀“s『罂梢杂跋毂
    @ MOV R1,#3
    @ SUBS R2,R1,#5
    @ 两个64位的数据做加法运算
    @ 第一个数的低32位放在R1
    @ 第一个数的高32位放在R2
    @ 第二个数的低32位放在R3
    @ 第二个数的高32位放在R4
    @ 第一个数
    @ 0x00000001 FFFFFFFF
    @ 第二个数
    @ 0x00000002 00000005
    @ MOV R1,#0xFFFFFFFF
    @ MOV R2,#0x00000001
    @ MOV R3,#0x00000005
    @ MOV R4,#0x00000002
    @ ADC带进位的加法,如果有进位的话C置为1,且ADC实际上为R2 + R4 + C(1)
    @ ADDS R5,R1,R3
    @ ADC R6,R2,R4
    @ 第一个数
    @ 0x00000002 00000001
    @ 第二个数
    @ 0x00000001 00000005
    MOV R1,#0x00000001
    MOV R2,#0x00000002
    MOV R3,#0x00000005
    MOV R4,#0x00000001
    @ SBC本质上是:R2 - R4 -‘!C’,为什么减去取反的C,由于CPSR寄存器减法时,28位上置1
    SUBS R5,R1,R3
    SBC R6,R2,R4
  • 跳转指令
    @ 1.2 跳转指令:实现程序的眺转,本质就是修改了PC寄存器
    @ 方式一:直接去修改PC寄存器的值(不建议使用,需要我们自己去计算绝对地址)
    @ MAIN:
    @ MOV R1,#1
    @ MOV R2,#2
    @ MOV R3,#3
    @ MOV PC,#0x18
    @ MOV R4,#4
    @ MOV R5,#5
    @ FUNC:
    @ MOV R6,#6
    @ MOV R7,#7
    @ MOV R8,#8
    @ 方式二:不带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下第一条指令的地址,同时将跳转指令下一 条指令的地址存储到LR
    MAIN:
    MOV R1,#1
    MOV R2,#2
    MOV R3,#3
    BL FUNC
    MOV R4,#4
    MOV R5,#5
    FUNC:
    @ 必须将LR地址给PC,然后程序就能返回了
    MOV R6,#6
    MOV R7,#7
    MOV R8,#8
    MOV PC,LR
  • ARM指令的条件码
    @ 比较指令
    @ CMP的本质是一条减法指令(SUBS),只是没有将运算的结果存入寄存器
    MAIN:
    MOV R1,#1
    MOV R2,#2
    CMP R1,R2
    @ BEQ本质就是判断R1和R2是否相等,相等的话就跳转,否则就不跳转
    @ BEQ FUNC
    BNE FUNC @ if(NQ)(B FUNC)本质:if(z==0)(B FUNC)
    MOV R3,#3
    MOV R4,#4
    MOV R5,#5
    FUNC:
    MOV R6,#6
    MOV R7,#7
    @ ARM指令集大多数都可以带条件码后缀如下:
    @MOV R1,#1
    @MOV R2,#2
    @CMP R1,R2
    @MOVGT R3,#3
    条件码如下:
    在这里插入图片描述
  • 条件码的案例代码
    @ 练习
    @ int R1 = 9;
    @ int R2 = 15;
    @START:
    @ if(R1 == R2)
    @ STOP();
    @ else(R1>R2)
    @ {
    @ R1 = R1-R2;
    @ goto START;
    @ }
    @ else
    @ {
    @ R2 = R2 - R1;
    @ goto START;
    @ }
    @ 汇编编写
    MOV R1,#9
    MOV R2,#15
    START:
    CMP R1,R2
    BEQ STOP
    SUBGT R1,R1,R2
    SUBGT R2,R2,R1
    B START
    STOP:
    B STOP
  • 内存读写案例代码:
    @Load/Srore指令:访问(读写)内存
    @ 写内存
    @ MOV R1,#0xFF000000
    @ MOV R2,#0x40000000
    @ STR R1,[R2]
    @将R1寄存器中的数据存储到R2指向的内存空间
    @ 读内存
    @ LDR R3,[R2]
    @ 将内存中R2指向的内存空间的数据读取到R3寄存器
    @ MOV R1,#0xFFFFFFFF
    @ MOV R2,#0x40000000
    @ STRB R1,[R2] @ B代表一个字节,往内存存取低一个字节的数据
    @ STRH R1,[R2] @ H代表两个字节
    @ STR R1,[R2] @ 默认为四个字节
    @ LDR指令同样支持以上后缀
  • ARM指令的寻址方式
    @ 寻址方式就是CPU去寻找一个操作数的方式
    @ 立即寻址
    @ MOV R1,#1
    @ ADD R1,R2,#1
    @ 寄存器寻址
    @ ADD R1,R2,R3
    @ 寄存器移位寻址,寄存器先做移位然后再用寄存器
    @ MOV R1,R2,LSL #1
    @ 寄存器间接寻址,R2作为一个地址间接的去访问内存里面的内容
    @ STR R1,[R2]
    @。。。。
    @ 基址加变址寻址
    @MOV R1,#0xFFFFFFFF
    @MOV R2,#0x40000000
    @MOV R3,#4
    @ STR R1,[R2,R3]
    @ 将R1寄存器中的数据写入到R2+R3指向的内存空间
    @ 将R1寄存器中的数据写入到R2+(R1<<1)指向的内存空间
    @ STR R1,[R2,R3,LSL #1]
    @ 基址加变址寻址的索引方式
    @ 前索引
    @ MOV R1,#0xFFFFFFFF
    @ MOV R2,#0x40000000
    @ STR R1,[R2,#8]
    @ 将R1寄存器中的数据写入到R2+8指向的内存空间
    @ 后索引
    @ MOV R1,#0xFFFFFFFF
    @ MOV R2,#0x40000000
    @ STR R1,[R2],#8
    @ 将R1寄存器中的数据写入到R2指向的内存空间,然后R2自增8
    @ 自动索引
    MOV R1,#0xFFFFFFFF
    MOV R2,#0x40000000
    STR R1,[R2,#8]!
    @ 将R1寄存器中的数据写入到R2+8指向的内存空间,然后R2自增8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/443054.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一分钟了解遥感中卫星、传感器、波段及数据之间的关系

感是利用卫星、飞机或其他载具上的传感器对地球表面进行观测和测量的科学技术。以下是一些常见的遥感相关术语: 卫星(Satellite):在遥感中,卫星是指绕地球轨道运行的人造卫星,其主要任务是携带各种传感器从空间中对地球表面进行观测。 传感器(Sensor):传感器是安装在卫…

语音模块学习——LSYT201B模组(实际操作篇)

目录 一、定制词条 二、直接用串口通信 三、使用单片机通信 理论篇在这&#xff0c;依旧是深圳雷龙发展的语音模块。 http://t.csdnimg.cn/2SzJL 一、定制词条 因为我想后面加到我的毕设上加个语音模块&#xff0c;所以定制的词条都是和芯测相关的。 动作词条播报串口输…

2.4_2 死锁的处理策略——预防死锁

2.4_2 死锁的处理策略——预防死锁 &#xff08;一&#xff09;破坏互斥条件 互斥条件&#xff1a;只有对必须互斥使用的资源的争抢才会导致死锁。 如果把只能互斥使用的资源改造为允许共享使用&#xff0c;则系统不会进入死锁状态。比如&#xff1a;SPOOLing技术。操作系统可以…

惬意上手MySQL

大家好&#xff0c;我又来写博客了&#xff0c;今天给大家介绍一下MySQL,如果你只想让MySQL作为自己的辅助开发工具&#xff0c;那这一篇文章就够了&#xff0c;如果想作为一门语言来学习&#xff0c;那你可以看此文章了解一些基础。 MySQL介绍 数据库可分为关系型数据库和非关…

Elasticsearch 通过索引阻塞实现数据保护深入解析

Elasticsearch 是一种强大的搜索和分析引擎&#xff0c;被广泛用于各种应用中&#xff0c;以其强大的全文搜索能力而著称。 不过&#xff0c;在日常管理 Elasticsearch 时&#xff0c;我们经常需要对索引进行保护&#xff0c;以防止数据被意外修改或删除&#xff0c;特别是在进…

java IO 02 IO接口,字节流和字符流,节点流和处理流

01.定义 02.IO中的输入和输出的划分 03.流的分类 IO流的所有类中&#xff0c;最先分野的是字节流和字符流。 字节流包括&#xff1a;输入流和输出流 InputStream public abstract class InputStream implements Closeable { }OutputStream public abstract class OutputSt…

专业140+总分430+西南交通大学924信号与系统考研经验电子信息与通信工程,真题,大纲,参考书

今年报考西南交通大学&#xff0c;考研分数专业课924信号与系统140&#xff0c;总分430&#xff0c;各门分数都还是比较均衡&#xff0c;经过一年的复习&#xff0c;有得有失&#xff0c;总结一下自己的复习经历&#xff0c;希望给大家有点帮助&#xff0c;在复习中做的更好&am…

初始安装RabbitMQ

文章目录 1. RabbitMQ 概念2. RabbitMQ 四大核心概念3. RabbitMQ 核心部分4. RabbitMQ 名词解释5. RabbitMQ 安装 1. RabbitMQ 概念 RabbitMQ 是一个消息中间件&#xff1a;它接受并转发消息。 可以把它当做一个快递站点&#xff0c;当你要发送一个包裹时&#xff0c;你把你的…

IntelliJ IDEA自定义关闭当前文件的快捷方式

前言 idea中关闭当前标签页的默认快捷键是CtrlF4,这个组合键在键盘上操作起来很是不方便&#xff0c;我们可以在设置中自定义自己习惯的快捷方式。 自定义步骤 要在 IntelliJ IDEA 中将关闭当前文件的快捷方式设置为 Alt Q&#xff0c;请按照以下步骤操作&#xff1a;打开 …

计算机软件文档编制规范GB_T 8567-2006

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 计算机软件文档编制规范概述 计算机软件文档编制规范&#xff08;Specification for computer software documentation&#xff09; 由TC28&#xff08;全国信息技术标准化技…

【Node.js从基础到高级运用】二、搭建开发环境

Node.js入门&#xff1a;搭建开发环境 在上一篇文章中&#xff0c;我们介绍了Node.js的基础概念。现在&#xff0c;我们将进入一个更实际的阶段——搭建Node.js的开发环境。这是每个Node.js开发者旅程中的第一步。接下来&#xff0c;我们将详细讨论如何安装Node.js和npm&#…

ChatGPT Plus 支付出现「您的银行卡被拒绝/your card has been declined」怎么办?

ChatGPT Plus 支付出现「您的银行卡被拒绝/your card has been declined」怎么办&#xff1f; 在订阅 ChatGPT Plus 或者 OpenAI API 时&#xff0c;有时候会出现已下报错 &#xff1a; Your card has been declined. 您的银行卡被拒绝 出现这种错误&#xff0c;有以下几个解…

蓝桥杯练习系统(算法训练)ALGO-982 最小距离

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 最小距离 问题描述 数轴上有n个数字&#xff0c;求最近的两个数&#xff0c;即min(abs(x-y)) 输入格式 第一行包含一个整数n。   …

Mysql:如何自定义导出表结构

为了方便将mysql表结构信息快速录入到word或Excel表格中&#xff0c;最终实现如下效果&#xff1a; 对于word,则可将Excel表格复制粘贴即可。 废话不多少&#xff0c;开干。 准备准建&#xff1a;navicat 或sqlyog 第一步&#xff1a;编辑sql&#xff0c;如&#xff1a; SE…

rabbitmq 基本总结

rabbitmq 的基本概念 vhost、broker、producer、 consumer、 exchange、 queue、 routing key rabbitmq 常用的队列类型&#xff0c;工作队列&#xff08;简单队列&#xff09;,pub/sub, routing key&#xff0c; topic 模式 <dependency><groupId>com.rabbitmq&l…

Excel 快速填充/输入内容

目录 一. Ctrl D/R 向下/右填充二. 批量输入内容 一. Ctrl D/R 向下/右填充 ⏹如下图所示&#xff0c;通过快捷键向下和向右填充数据 &#x1f914;当选中第一个单元格之后&#xff0c;可以按住Shift后&#xff0c;再选中最后一个单元格&#xff0c;可以选中第一个单元格和最…

云计算项目九:K8S安装

K8S安装 Kube-master安装 按照如下配置准备云主机 防火墙相关配置&#xff1a;禁用selinux&#xff0c;禁用swap&#xff0c;且在firewalld-*。上传kubernetes.zip 到跳板机 配置yum仓库&#xff08;跳板机&#xff09; 跳板机主机配置k8s软件源服务端 [rootjs ~]# yum -y…

uniapp踩坑之项目:uni.previewImage简易版预览单图片

主要使用uni.previewImage //html <view class"box-card" v-for"(item,index) in DataList" :key"index"><view>图片&#xff1a;</view><image :src"item.Path" tap.stop"clickImg(item.Path)">&l…

JavaScript数组方法常用方法大全

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. push()2. pop()3. unshift()4. shift()5. isArray()6. map()7. filter()8. every()9. some()10. splice()11. slice()12. indexOf()13. includes()14. concat()1…

Python和Google Colab进行卫星图像二维小波变化和机器学习

2D 小波分解是图像处理中的一种流行技术,使用不同的滤波器将图像分解为不同的频率分量(“近似”和“细节”系数)。该技术对于各种图像处理任务特别有用,例如压缩、去噪、特征提取和边缘检测。 在本文中,我们将演示如何在 Google Colab 中使用 Python 下载高分辨率样本卫星…