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

news2024/11/16 3:18:10

汇编概述

  • 汇编需要学习的大致框架如下:
    @ 汇编中的符号
    @ 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.coloradmin.cn/o/1502399.html

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

相关文章

STL之set容器代码详解

1 基础概念 所有元素都会在插入时自动被排序 本质&#xff1a; set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现。 set和multiset区别&#xff1a; set不允许容器中有重复的元素&#xff1b; multiset允许容器中有重复的元素 。 2 代码示例 Talk is chea…

GO语言接入支付宝

GO语言接入支付宝 今天就go语言接入支付宝写一个教程 使用如下库&#xff0c;各种接口较为齐全 "github.com/smartwalle/alipay/v3"先简单介绍下加密&#xff1a; 试想&#xff0c;当用户向支付宝付款时&#xff0c;若不进行任何加密&#xff0c;那么黑客就可以任…

【牛客】VL76 任意奇数倍时钟分频

描述 编写一个模块&#xff0c;对输入的时钟信号clk_in&#xff0c;实现任意奇数分频&#xff0c;要求分频之后的时钟信号占空比为50%。模块应包含一个参数&#xff0c;用于指定分频的倍数。 模块的接口信号图如下&#xff1a; 要求&#xff1a;使用Verilog HDL语言实现&#…

2024最新版CleanMyMac X 4.15.1 Crack+激活码下载

CleanMyMac X 为您喜爱的事物腾出空间。 CleanMyMac 具有一系列巧妙的新功能&#xff0c;可让您安全、智能地扫描和清理整个系统、删除大型未使用的文件、减小 iPhoto 图库的大小、卸载不需要的应用程序或修复开始工作不正常的应用程序、管理所有应用程序您可以从一个地方进行扩…

html css 导航栏 2

鼠标划过会向上移动改变颜色 html文件 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>导航栏</title><link rel"stylesheet" href"css/dhl1.css" /></head><body><div …

分销商城微信小程序:用户粘性增强,促进复购率提升

在数字化浪潮的推动下&#xff0c;微信小程序作为一种轻便、高效的移动应用形式&#xff0c;正成为越来越多企业开展电商业务的重要平台。而分销商城微信小程序的出现&#xff0c;更是为企业带来了前所未有的机遇。通过分销商城微信小程序&#xff0c;企业不仅能够拓宽销售渠道…

揭秘税务信息接口:解读企业税务登记与纳税情况

导语&#xff1a; 随着社会经济的发展&#xff0c;税收对于国家财政收入的重要性不言而喻。税务登记信息和纳税情况对于企业和个人来说至关重要。在这个背景下&#xff0c;税务信息接口应运而生&#xff0c;为我们提供了便捷的查询途径。本文将以挖数据平台提供的税务信息接口…

【IPC】管道通信【命名管道】

文章目录 1.管道小总结2.命名管道2.1认识命名管道2.2命名管道的应用小场景2.3模拟命名管道1.Lod.hpp2.common.hpp3.server.cxx4.client.cxx 3.管道代码总结 1.管道小总结 linux-manualshouce 在Linux中&#xff0c;manual手册的编号用于区分手册的不同部分。这些编号通常用于ma…

个人商城系统开源(发送手机验证码!)

原文地址&#xff1a;个人商城系统开源&#xff08;发送手机验证码&#xff01;&#xff09; - Pleasure的博客 下面是正文内容&#xff1a; 前言 由于近期实在没有什么话题可写和一些有趣的项目教程可以分享。所以我只能决定将我自己亲手编写的一个迷你迷你商城系统进行开源…

3 模型评估

3 模型评估 在测试AI系统中的模型训练和评估阶段,需要使用准备好的数据集对AI模型进行训练和评估。在训练过程中,应该对模型进行监控和调整,以确保模型的准确性和效果。在评估过程中,需要使用测试数据集对模型进行测试,以验证模型的准确性和效果。模型的评估也分为离线评…

通过一篇文章带你玩转git和GitHub

Git和Github的基本用法 前言一、Git和Github的基本用法背景下载安装安装 git for windows安装 tortoise gitgit安装过程中的一些选项 tortoise git汉化教程下载tortoise git汉化安装包安装tortoise git汉化安装包 三、使用 Github 创建项目注册账号创建项目下载项目到本地 四、…

视频批量混剪剪辑,批量剪辑批量剪视频,探店带货系统,精细化顺序混剪,故事影视解说,视频处理大全,精细化顺序混剪,多场景裂变,多视频混剪

前言 工具的产生源于dy出的火山引擎的云视频混剪制作是按分钟数收费的&#xff0c;这个软件既能实现正常混剪也能避免二次收费。属于FFMPEG合成的。 欢迎大家给一些好的建议和功能&#xff0c;回复可见&#xff0c;附加了一些天卡&#xff0c;周卡&#xff0c;请大家不要一人占…

【C++】函数模板和类模板

目录 1.泛型编程 2.函数模板 2.1函数模板的定义格式 2.2函数模板的实例化 2.3函数模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 3.3模板的分离编译 1.泛型编程 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段…

新一代 Git 工具,AI 赋能!深度集成、简化操作 | 开源日报 No.194

gitbutlerapp/gitbutler Stars: 7.2k License: NOASSERTION gitbutler 是一个基于 Git 的版本控制客户端。旨在为现代工作流程构建一个全新的 Git 分支管理工具。 虚拟分支&#xff1a;可以同时在多个分支上工作&#xff0c;而无需不断切换分支简化提交管理&#xff1a;通过拖…

如何转行成为产品经理?

转行NPDP也是很合适的一条发展路径&#xff0c;之后从事新产品开发相关工作~ 一、什么是NPDP&#xff1f; NPDP 是产品经理国际资格认证&#xff0c;美国产品开发与管理协会&#xff08;PDMA&#xff09;发起的&#xff0c;是目前国际公认的唯一的新产品开发专业认证&#xff…

stm32普通定时器脉冲计数(发送固定脉冲个数),控制步进电机驱动器

拨码开关设置驱动器&#xff0c;细分 方法思路&#xff1a;用通用定时器TIM2&#xff0c;1ms产生一次中断&#xff1b;在中断里做IO反转&#xff1b; 发送10个脉冲信号

Docker部署SimpleMindMap结合内网穿透实现公网访问本地思维导图

文章目录 1. Docker一键部署思维导图2. 本地访问测试3. Linux安装Cpolar4. 配置公网地址5. 远程访问思维导图6. 固定Cpolar公网地址7. 固定地址访问 SimpleMindMap 是一个可私有部署的web思维导图工具。它提供了丰富的功能和特性&#xff0c;包含插件化架构、多种结构类型&…

【漏洞复现】大华ICC智能物联综合管理平台token弱口令漏洞

Nx01 产品简介 大华智能物联综合管理平台 iConnection Center&#xff08;以下简称&#xff1a;ICC平台&#xff09;&#xff0c;是一套基于智能物联的综合业务管理平台软件&#xff0c;具备强大的后台服务能力&#xff0c;配套了B/S管理员端、C/S客户端、移动APP终端、小程序等…

Java的Writer类详解

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

Tomcat容器经常重启问题排查

报错代码: INFO [Catalina-utility-2] org.apache.catalina.core.StandardContext.reload Reloading Context with name [] has started1.查看内存占用情况:top 可以发现java线程正常情况下占用高达24%的内存资源 2.继续排查:top -Hp 29580 可以发现主要有子线程Catalina-ut…