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.rhkb.cn/news/272283.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka | SpringBoot集成Kafka

SpringBoot集成Kafka 一、前言二、项目1. pom2. application.properties4. 消息生产者-测试5. 消息消费者 三、启动测试四、有总结的不对的地方/或者问题 请指正, 我在努力中 一、前言 该文章中主要对SpringBoot 集成Kafka 主要是 application.properties 与 pom坐标就算集成完…

HTML5基础2

drag 可以把拖放事件拆分成4个步骤 设置元素为可拖放。为了使元素可拖动&#xff0c;把 draggable 属性设置为 true 。 <img draggable"true"> 拖动什么。ondragstart 和 setData() const dragestart (ev)>{ev.dataTransfer.setData(play,ev.target.id)} …

[云原生] k8s之存储卷

一、emptyDir存储卷 当Pod被分配给节点时&#xff0c;首先创建emptyDir卷&#xff0c;并且只要该Pod在该节点上运行&#xff0c;该卷就会存在。正如卷的名字所述&#xff0c;它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件&#xff0c;尽管该卷可以挂载到每…

如何不丢精度保存PPT中的图片,实测有效

1.在powerpoint软件中 文件-》选项 -》高级-》设置为不压缩&#xff0c;且默认输出为最高 2.导入对应图片后&#xff0c;右键导出图片&#xff0c;选择.emf文件 3.使用windows自带的画图工具打开.emf文件&#xff0c;ctrls另存为.png文件 此方法亲测可以生成清晰度很高的图片

python:布伊山德U检验(Buishand U test,BUT)突变点检测(以NDVI时间序列为例)

作者:CSDN @ _养乐多_ 本文将介绍布伊山德U检验(Buishand U test,BUT)突变点检测代码。以 NDVI 时间序列为例。输入数据可以是csv,一列NDVI值,一列时间。代码可以扩展到遥感时间序列突变检测(突变年份、突变幅度等)中。 结果如下图所示, 文章目录 一、准备数据二、…

【JavaEE进阶】 @Transactional详解

文章目录 &#x1f343;前言&#x1f332;rollbackFor&#xff08;异常回滚属性&#xff09;&#x1f384;事务隔离级别&#x1f6a9;MySQL事务隔离级别&#x1f6a9;Spring事务隔离级别 &#x1f38b;Spring事务传播机制&#x1f6a9;什么是事务传播机制&#x1f6a9;事务有哪…

spark 实验二 RDD编程初级实践

目录 一. pyspark交互式编程示例&#xff08;学生选课成绩统计&#xff09; 该系总共有多少学生&#xff1b; 该系DataBase课程共有多少人选修&#xff1b; 各门课程的平均分是多少&#xff1b; 使用累加器计算共有多少人选了DataBase这门课。 二.编写独立应用程序实现数…

关于Python读取Excel表格中的内容

1、准备 首先准备好Excel表&#xff0c;并向里面填充好内容 2、相关算法 import pandas as pd# file_path rE:\data.xlsx # r对路径进行转义&#xff0c;windows需要 file_path rdata.xlsx# 这行代码括号里的head0&#xff0c;表示excel文件中第一行是表头&#xff0c;…

解决ChatGPT发送消息没有反应

ChatGPT发消息没反应 今天照常使用ChatGPT来帮忙码代码&#xff0c;结果发现发出去的消息完全没有反应&#xff0c;即不给我处理&#xff0c;也没有抱任何的错误&#xff0c;按浏览器刷新&#xff0c;看起来很正常&#xff0c;可以查看历史对话&#xff0c;但是再次尝试还是一…

MySQL安装使用(mac)

目录 一、下载MySQL 二、环境变量 三、启动 MySql 四、初始化密码设置 一、下载MySQL 打开 MySql 官方下载页面 我是macOS12&#xff0c;所以选择了8.0.30 下载完成之后&#xff0c;打开安装&#xff0c;一直下一步安装完成&#xff0c;在最后安装完成时&#xff0c;会弹出…

《赵玉平说职场智慧》读书笔记

目录 一、宋江是如何成为笼络人心的领导 二、给你一个干的理由——宋江的精神激励策略 三、团队如何应对这种多样化的挑战 帮领导解决难题 帮领导打退强敌 替领导四处出席 帮领导做好杂事 帮领导打响名气 四、小人难养&#xff0c;小心唯上 五、如何拒绝&#xff1f; …

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

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

什么是MAE和MSE?

平均绝对误差&#xff08;Mean Absolute Error&#xff0c;MAE&#xff09;和平均方差误差&#xff08;Mean Squared Error&#xff0c;MSE&#xff09;是常用的评价回归模型性能的指标。它们用于衡量模型预测值与真实值之间的差异。 在深度学习领域&#xff0c;MAE 和 MSE 是…

python使用selenium webdriver chrome

安装selenum包 pip install selenium 安装chrome驱动 查看chrome版本 安装驱动 下载地址&#xff1a;https://googlechromelabs.github.io/chrome-for-testing/#stable 找到符合版本的驱动下载&#xff0c;解压&#xff0c;把解压后的路径加入PATH环境变量中&#xff1a; …

单片机为什么需要时钟?2种时钟电路对比?

目录 一、晶体振荡器&#xff08;Crystal Oscillator&#xff09;的核心知识 二、单片机为什么需要时钟电路&#xff1f; 三、单片机的时钟电路方案 01、外部晶振方案 02、内部晶振方案 四、总结 单片机研发设计的项目中&#xff0c;它的最小电路系统包含 电源电路复位…

MySQL安装与卸载

安装 1). 双击官方下来的安装包文件 2). 根据安装提示进行安装(全部默认就可以) 安装MySQL的相关组件&#xff0c;这个过程可能需要耗时几分钟&#xff0c;耐心等待。 输入MySQL中root用户的密码,一定记得记住该密码 配置 安装好MySQL之后&#xff0c;还需要配置环境变量&am…

技术选型思考:分库分表和分布式DB(TiDB/OceanBase) 的权衡与抉择

在当今数据爆炸的时代&#xff0c;数据库作为存储和管理数据的核心组件&#xff0c;其性能和扩展性成为了企业关注的重点。随着业务的发展和数据量的不断增长&#xff0c;传统的单库单表架构逐渐暴露出性能瓶颈和扩展性限制。为了应对这些挑战&#xff0c;企业常常需要在分库分…

【Redis知识点总结】(三)——Redis持久化机制、内存淘汰策略、惰性删除机制

Redis知识点总结&#xff08;三&#xff09;——Redis持久化机制、内存淘汰策略、惰性删除机制 Redis持久化RDBAOFAOF与RDB的对比混合持久化 内存淘汰策略惰性删除机制 Redis持久化 Redis有两种数据持久化的方式&#xff0c;一种是RDB、一种是AOF。 RDB RDB是内存快照&#…

Python学习日记之学习turtle库(下 篇)

前言&#xff1a; 书接上篇&#xff0c;我们继续来了解Python内置库 turtle功能库。在前面的文章中&#xff0c;我们初步的了解了一下 turtle库&#xff0c;画布和画笔相关的函数&#xff0c;那么我们继续来深入了解一下吧。 详情见&#xff1a; Python学习日记之学习turtle库…

练习3-softmax分类(李沐函数简要解析)与d2l.train_ch3缺失的简单解决方式

环境为:练习1的环境 网址为:https://www.bilibili.com/video/BV1K64y1Q7wu/?spm_id_from333.1007.top_right_bar_window_history.content.click 代码简要解析 导入模块 导入PyTorch 导入Torch中的nn模块 导入d2l中torch模块 并命名为d2l import torch from torch import nn…