Linux中汇编语言的学习(加法、乘法、除法、左移、右移、按位与等多种命令操作实例以及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/269441.html

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

相关文章

技术指标的买入形态之均线形成多头排列

一、技术特征 1、在股价横盘整理过程中&#xff0c;其短期均线、中期均线持续纠缠在一起。 2、整理一段时间后&#xff0c;短期均线向上突破了中期均线&#xff0c;中期均线也向上突破了长期均线。 均线多头排列是股价处于上涨行情中的信号。 二、买点描述 当均线的多头排列…

tomcat nginx 动静分离

实验目的:当访问静态资源的时候&#xff0c;nginx自己处理 当访问动态资源的时候&#xff0c;转给tomcat处理 第一步 关闭防火墙 关闭防护 代理服务器操作&#xff1a; 用yum安装nginx tomcat &#xff08;centos 3&#xff09;下载 跟tomcat&#xff08;centos 4&#xff0…

3分钟开通GPT-4

AI从前年12月份到现在已经伴随我们一年多了&#xff0c;还有很多小伙伴不会开通&#xff0c;其实开通很简单&#xff0c;环境需要自己搞定&#xff0c;升级的话就需要一张visa卡&#xff0c;办理visa卡就可以直接升级chatgptPLSU 一、虚拟卡支付 这种方式的优点是操作简单&…

AI-RAN联盟在MWC24上正式启动

AI-RAN联盟在MWC24上正式启动。它的logo是这个样的&#xff1a; 2月26日&#xff0c;AI-RAN联盟&#xff08;AI-RAN Alliance&#xff09;在2024年世界移动通信大会&#xff08;MWC 2024&#xff09;上成立。创始成员包括亚马逊云科技、Arm、DeepSig、爱立信、微软、诺基亚、美…

mysql高可用架构设计

一、主从架构 主从架构一般如下所示 这里从节点一般设置成只读&#xff08;readonly&#xff09;模式。这样做&#xff0c;有以下几个考虑&#xff1a; 有时候一些运营类的查询语句会被放到备库上去查&#xff0c;设置为只读可以防止误操作&#xff1b; 防止切换逻辑有 bug&a…

Unity2023.1.19_ECS_DOTS

Unity2023.1.19_ECS_DOTS 盲学-盲目的学习&#xff1a; 懒着自己整理就看看别人整理的吧&#xff0c;整合一下逻辑通了不少&#xff1a; DOTS/data oriented technology stack-面向数据的技术栈 ECS/Entities-Component-System Unity-Entities包 Entities提供ECS架构面向数…

javaWebssh教师荣誉库管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh在线授课辅导系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

云计算时代的运维: 职业发展方向与岗位选择

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

基于Spring Boot + Vue的网上订餐系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

10kV/35kV并网分布式光伏系统-实现错峰有序用电

根据国家电网 Q/GDW1480-2015 《分布式电源接入电网技术规定》&#xff1a;分布式电源并网电压等级可根据各 并网点装机容量进行初步选择&#xff0c;推荐如下&#xff1a; • 8kW 及以下可接入 220V &#xff1b; • 8kW~400kW 可接入 380V &#xff1b; • 400kW~60…

实名制交友-智能匹配-仿二狗交友系统-TP6+uni-APP小程序H5公众号-源码交付-支持二开!

一、代码风格 通常不同的开发者具备不同的代码风格&#xff0c;但为了保证语音交友系统开发质量&#xff0c;在编码前需要进行代码风格的统一&#xff0c;通过制定一定的规则&#xff0c;约束开发者的行为。具有统一风格的代码才能更清晰、更完整、更容易理解、更方便后期维护…

springboot,druid动态数据源切换

关键字&#xff1a;springboot&#xff0c;druid数据库连接池&#xff0c;两个数据源&#xff08;可以切换成多个&#xff09;&#xff0c;事务管理 关于druid简介传送门&#xff1a;https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 具体分为四…

利用文件实现进程间共享数据

概述 文件可以存储任何非结构化字节序列&#xff0c;这个比较简单&#xff0c;就一个写一个读&#xff1b;学习到此&#xff0c;留个记录&#xff0c;以后可以直接抄代码&#xff0c;哈哈 Demo代码 #include <fstream> #include <iostream> #include <thread&…

代码随想录day10(2)字符串:反转字符串Ⅱ (leetcode541)

题目要求&#xff1a;给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起, 每计数至 2k 个字符&#xff0c;就反转这 2k 个字符中的前 k 个字符。如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0c;则反转前…

python实现ElGamal算法

ElGamal公钥密码算法是在密码协议中有着重要应用的一类公钥密码算法&#xff0c;基于公钥密码体制和椭圆曲线加密体系&#xff0c;其安全性是基于有限域上离散对数学问题的难解性。至今仍是一个安全性良好的公钥密码算法。既可用于加密又可用于数字签名的公钥密码体制。 数字签…

【vue.js】文档解读【day 1】 | 模板语法2

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 模板语法JavaScript表达式仅支持表达式调用函数&#xff1f;受限的全局访问 指令参数动态参数动态参数中…

Vanna-ai -基于RAG的TextToSql实现方案

官方连接&#xff1a;Vanna.AI - Personalized AI SQL Agent 1.背景 基于大模型的TextToSql的关键为给大模型提供正确有效的数据库信息及问题&#xff0c;以提升大模型生成sql的正确率。database_info question形成prompt&#xff0c;但是实际中通常会遇到一个问题&#xff…

C# WinForm AndtUI第三方库 Tree控件使用记录

环境搭建 1.在NuGet中搜索AndtUI并下载至C# .NetFramework WinForm项目。 2.添加Tree控件至窗体。 使用方法集合 1.添加节点、子节点 using AntdUI; private void UpdateTreeView() {Tree tvwTestnew Tree();TreeItem rootTreeItem;TreeItem subTreeItem;Dictionary<str…

openGL 透视投影矩阵

openGL 透视投影矩阵 什么是透视投影&#xff1f; 模型都是3D的&#xff0c;但屏幕是2D的。如何将3D空间投影到2D平面&#xff0c;还能保持深度的视觉效果&#xff1f;在OpenGL中&#xff0c;采用透视投影矩阵作用顶点来实现&#xff0c;即完成缩放、选择、位移之后&#xff…

CSS_实现三角形和聊天气泡框

如何用css画出一个三角形 1、第一步 写一个正常的盒子模型&#xff0c;先给个正方形的div&#xff0c;便于观察&#xff0c;给div设置宽高和背景颜色 <body><div class"box"></div> </body> <style>.box {width: 100px;height: 100px…