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.mzph.cn/news/732439.shtml

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

相关文章

如何修复advapi32.dll丢失无法启动程序的问题

如果你在运行Windows程序时遇到了“advapi32.dll丢失无法启动程序”的错误消息&#xff0c;那么这意味着你的计算机缺少这个DLL文件。在本文中&#xff0c;我们将提供一些解决方案&#xff0c;帮助你解决这个问题并恢复计算机的正常运行。 一.advapi32.dll丢失电脑的提示 关于…

软件项目试运行方案

一、 试运行目的 &#xff08;一&#xff09; 系统功能、性能与稳定性考核 &#xff08;二&#xff09; 系统在各种环境和工况条件下的工作稳定性和可靠性 &#xff08;三&#xff09; 检验系统实际应用效果和应用功能的完善 &#xff08;四&#xff09; 健全系统运行管理体制&…

宏碁掠夺者:4K144Hz显示器,让你爽翻天

大家好&#xff0c;我又来了。 买了PS5后&#xff0c;我发现这样的主机放在客厅里可玩性不太高&#xff08;我没机会玩&#xff09;。 毕竟家里还有今年要上小学的孩子。 每天回家打卡交作业都让我发疯。 客厅里放一台PS5无疑是每天对孩子最大的影响&#xff08;也划破了我的心…

vue 下载的插件从哪里上传?npm发布插件详细记录

文章参考&#xff1a; 参考文章一&#xff1a; 封装vue插件并发布到npm详细步骤_vue-cli 封装插件-CSDN博客 参考文章二&#xff1a; npm发布vue插件步骤、组件、package、adduser、publish、getElementsByClassName、important、export、default、target、dest_export default…

智能驾驶规划控制理论学习08-自动驾驶控制模块(轨迹跟踪)

目录 一、基于几何的轨迹跟踪方法 1、基本思想 2、纯追踪 3、Stanly Method 二、PID控制器 三、LQR&#xff08;Linear Quadratic Regulator&#xff09; 1、基本思想 2、LQR解法 3、案例学习 基于LQR的路径跟踪 基于LQR的速度跟踪 4、MPC&#xff08;Mode…

day59 线程

创建线程的第二种方式 实现接口Runnable 重写run方法 创建线程的第三种方式 java.util.concurrent下的Callable重写call()方法 java.util.concurrent.FutureTask 创建线程类对象 获取返回值 线程的四种生命周期 线程的优先级1-10 default为5&#xff0c;优先级越高&#xff0c…

基于梯度统计学的渐变型亮缝识别算法

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、场景痛点 在图像处理相关的实际工程中&#xff0c;会出现各式各样的现实复杂问题&#xff0c;有的是因为机械设计导致&#x…

【洛谷 P8668】[蓝桥杯 2018 省 B] 螺旋折线 题解(数学+平面几何)

[蓝桥杯 2018 省 B] 螺旋折线 题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点 ( X , Y ) (X, Y) (X,Y)&#xff0c;我们定义它到原点的距离 dis ( X , Y ) \text{dis}(X, Y) dis(X,Y) 是从原点到 ( X , Y ) (X, Y) (X,Y) 的螺旋折线段的长度。 例如 …

蓝桥杯练习系统(算法训练)ALGO-981 过河马

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 在那个过河卒逃过了马的控制以超级超级多的走法走到了终点之后&#xff0c;这匹马表示它不开心了……   于是&#xff0c…

Java教程:RabbitMq讲解与SpringBoot项目如何对接RabbitMq实现生产者与消费者

在往期文章中&#xff0c;我们讲了如何在Windows与Linux环境下安装RabbitMq服务&#xff0c;并访问Web管理端。 有很多同学其实并不知道RabbitMq是用来干嘛的&#xff0c;它起到一个什么作用&#xff0c;并且如何在常见的SpringBoot项目中集成mq并实现消息收发&#xff0c;本章…

Nginx实现高并发

注&#xff1a;文章是4年前在自己网站上写的&#xff0c;迁移过来了。现在看我之前写的这篇文章&#xff0c;描述得不是特别详细&#xff0c;但描述了Nginx的整体架构思想。如果对Nginx玩得透得或者想了解深入的&#xff0c;可以在网上找找其他的文章。 ......................…

day17_订单(结算,提交订单,支付页,立即购买,我的订单)

文章目录 订单模块1 结算1.1 需求说明1.2 获取用户地址1.2.1 UserAddress1.2.2 UserAddressController1.2.3 UserAddressService1.2.4 UserAddressMapper1.2.5 UserAddressMapper.xml 1.3 获取购物项数据1.3.1 CartController1.3.2 CartService1.3.3 openFeign接口定义 1.4 环境…

NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065

首先来看一下整体的流程: 可以看到了用到了上面的这些处理器,然后我们主要看看,这里之前 同步的时候,总是出现重复的数据,奇怪. 比如源表中只有166条数据,但是同步过去以后变成了11万条数据了. ${db.table.name:equals(table1):or(${db.table.name:equals(table2)})} 可以看…

【精选好刊】JCR2区SCI仅17天上线见刊,最后10篇版面!

录用案例 JCR2区地质环境类SCI&EI (进展顺) 【期刊简介】IF&#xff1a;3.0-4.0&#xff0c;JCR2区&#xff0c;中科院3/4区&#xff1b; 【检索情况】SCI&EI双检&#xff1b; 【征稿领域】地球观测、环境监测和管理相关或结合研究均可&#xff1b; 【案例分享】重…

前端面试练习24.3.8

防抖和节流 防抖&#xff08;Debouncing&#xff09;&#xff1a; 防抖是指在短时间内连续触发同一事件时&#xff0c;只执行最后一次触发的事件处理函数。 在实际应用中&#xff0c;常常用于处理用户输入的搜索框或者滚动事件。例如&#xff0c;当用户连续输入搜索关键词时&am…

业务代码中如何使用装饰器模式?

装饰器模式&#xff08;Decorator Pattern&#xff09;介绍 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;我们可以动态地给一个对象添加额外的职责。而不是通过继承增加子类的方式来扩展对象的功能&#xff0c;装饰器模式使用组合的…

[N1CTF 2018]eating_cms 不会编程的崽

题倒是不难&#xff0c;但是实在是恶心到了。 上来就是登录框&#xff0c;页面源代码也没什么特别的。寻思抓包看一下&#xff0c;数据包直接返回了sql查询语句。到以为是sql注入的题目&#xff0c;直到我看到了单引号被转义。。。挺抽象&#xff0c;似乎sql语句过滤很严格。又…

Java基础知识点之思维导图

一、走进Java编程世界 二、变量常量和运算符 三、if选择结构 四、switch选择结构 五、while循环结构 六、for循环结构 七、数组 八、类与对象 九、深入循环结构 十、类的无参方法 十一、类的带参方法 十二、字符串

读已提交隔离级别下竟然有间隙锁

业务背景 广告主痛点的为进行一次全媒体联合投放&#xff0c;若投放10个媒体&#xff0c;需要制作和上传10个创意、50张不同尺寸和出血区要求的图片和视频素材、近100个元素&#xff0c;投放成本极高。这也是制约部分用户使用新产品投放的原因。 因此进行升级。以三个创意为例…

Prometheus添加nginx节点显示不支持stub_status 解决办法

1、我们在使用Prometheus监控添加nginx节点监控的时候&#xff0c;在被监控节点的nginx配置文件中添加下面的模块 server { listen 80; server_name localhost; location /stub_status { stub_status on; access_log off; …