ARM汇编基础指令整合

news2024/11/26 11:29:30

汇编语言的组成

伪操作

        不参与程序的执行,但是用于告诉编译器程序该怎么编译 如:

        .text        .global        .end        .if        .else        .endif        .data

汇编指令

        汇编器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内存,一条指令可以实现一个特定的功能。

伪指令

        不是指令,但是看似一条指令,可以实现指令类似的功能,一条伪指令可能是由多条指令共同实现。

注释

        单行注释:@

        多行注释:/**/

条件编译        

.if 0
@text
.else
@text
.endif

汇编指令的介绍

基本数据操作指令

        数据搬移指令:=

        数据位移指令:<< >>

        数据算数运算指令:+ - * /

        位运算指令:$ | ~ ^

        数据比较指令:cmp 第一操作数,第二操作寄存器,其有很多条件码,如果条件码满足则执行对应的指令

        跳转指令

        内存读写指令

        状态寄存器读写指令

        软中断指令

汇编指令的基本语法格式

 基本格式: <opcode>{cond}{s} Rd,Rn,#oprand2
        解释:
            opcode:指令码
            cond:条件码
                       指令不加条件码,指令默认无条件执行
                       指令加条件码,指令有条件执行
            s:状态位
                       指令不加s,指令执行的结果不会影响CPSR寄存器
                       指令加s,指令执行的结果会影响CPSR寄存器
            Rd:目标寄存器
            Rn:第一操作寄存器
            #oprand2:第二操作数
                1)立即数
                2)有效数:将一个数取反之后,变成立即数
                3)寄存器
                4)经过移位的寄存器 
        注意事项:
                1)汇编指令中不区分大小写
                2)汇编指令不需要以;号结尾
                3)<opcode>{cond}{s}:需要连在一起写
                4)Rd,Rn,#oprand2:需要用逗号分隔开
                5) <opcode>{cond}{s}和Rd,Rn,#oprand2需要用空格分隔开

数据搬移指令

        指令码:mov mvn

        格式:<opcode>{cond}{s} Rd,#oprand2        

@ 代码1:
    mov r0,#0xf @ r0 = 0xf
	mov r1,#0xff
	@ mov r2,#0xfff @ error
	@ mov r3,#0xffff @ error
	@ mov r4,#0xfffff @ error
	mov r5,#0xffffff
	mov r6,#0xfffffff
	mov r7,#0xffffffff
 /*------------------ ------------------ ---------------*/
@ 代码2:
 	mvn r5,#0xff  @ 0xff按位取反之后,赋值给r5
	mov r0,#0xff000000 @ 0xff 8
	mov r1,#0x1f800000 @ 0x7e  10
	mov r2,#0x00ffffff   @ ~r2 = 0xff000000
	mov r3,#0x0fffffff   @ ~r3 = 0xf0000000
	mov r4,#0xffffffff   @ ~r4 = 0x00000000

立即数判断

        要从这个数中间找到0~0xff之间的数,而且要包含所有1,如果能找到,循环右移偶数位,如果能够得到要判断的数,则该数为立即数。

伪指令

        如何用伪指令将非立即数保存到寄存器中

        伪指令:

                LDR 目标寄存器,=数值

移位指令

     格式:<opcode>{cond}{s} Rd,Rn,#oprand2 

      指令码:

                lsl:逻辑左移 高位移出,低位补0

                lsr:逻辑右移 低位移出,高位补0

                asr:算数右移 有符号数右移,低位移出,高位补符号位

                ror:循环右移 低位移出,补高位

位运算指令

        格式:<opcode>{cond}{s} Rd,Rn,#oprand2 

        方法:看到清零用 & 看到置1用 |

        and:按位与(&amp;)------>与0清0,与1不变
        orr:按位或(|) ------>或0不变,或1置1
        eor:按位异或(^) ------>异或0不变,异或1取反
        bic:按位清除  ------> 哪一位写1,对应的位进行清0

算数运算指令

        指令码:add adc sub sbc mul       

        基本格式: <opcode>{cond}{s} Rd,Rn,#oprand2     

        add: 普通加法指令
        adc:带进位加法指令
        sub:普通减法指令
        sbc:带借位减法指令
        mul:乘法指令  格式:<opcode>{cond}{s} Rd,Rn   

64位数据进行算数运算

原则:
        一个 64位数保存在两个寄存 高32位运算,低32位运算
             mov r1,#0XFFFFFFFE          @保存第一个数据的低32位
             mov r2,#2         @保存第一个数据的高32位
             mov r3,#3         @保存第二个数据的低32位
             mov r4,#4         @保存第2数据的高32位
        @低32位运算要求影响条件位
                ADDS R5,R1,R3         @R5保存运算后结果的低32位
                ADC R6,R2,R4           @R6寄存器保存运算结果的高32位,需要考虑条件位

比较指令

指令码:cmp
基本格式: <opcode>{cond} Rn,#oprand2
        1)比较指令没有目标寄存器
        2)比较指令本质做减法运算
        3)比较指令的执行结果会影响CPSR寄存器的NZCV位,不需要加s
        4)比较指令需要和条件码搭配使用
        5)前面所有学习的指令都属于无条件指令,比较指令属于有条件执行

示例:

比较两个数大小
第一个数比第二个数大:第一个数减第二个数
第一个数比第二个数小:第二个数减第一个数

mov r0,#0x3
mov r1,#0x4
cmp r0,r1
subhi r0,r0,r1  @ r0 = r0 - r1
subcc r1,r1,r0  @ r1 = r1 - r0

跳转指令

指令码:b 
格式:b {cond} 标签
b指令码:有去无回,不会保存函数的返回地址到LR寄存器中
    -------------------
    b loop
    ------------------- 
    loop:
    -------------------

/****************************************************/

指令码: bl
格式:bl{cond} 标签
bl指令码:有去有回,会保存函数的返回地址到LR寄存器中
    -------------------
    bl loop
    -------------------  ----->会保存函数的返回地址到LR寄存器中
    loop:
    -------------------

        

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

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

相关文章

JAVA 学习笔记 2年经验

文章目录 基础String、StringBuffer、StringBuilder的区别jvm堆和栈的区别垃圾回收标记阶段清除阶段 异常类型双亲委派机制hashmap和hashtable concurrentHashMap 1.7和1.8的区别java的数据结构排序算法&#xff0c;查找算法堆排序 ThreadLocal单例模式常量池synchronizedsynch…

【力扣周赛】第 364 场周赛⭐(前后缀分解+单调栈DFS技巧)

文章目录 竞赛链接Q1&#xff1a;2864. 最大二进制奇数&#xff08;贪心&#xff09;写法1——手动模拟&#xff08;代码长&#xff0c;运行快&#xff09;写法2——API&#xff08;代码短&#xff0c;运行慢&#xff09; Q2&#xff1a;2865. 美丽塔 I竞赛时代码——枚举山顶 …

C++ 基础_Day01

准备工具Vscode或者Clion或者Dev C或者Vs studio 和 MSYS2 是C跨平台的重要工具链. 文章目录 准备工作安装MSYS2软件 创建文件 一、基本介绍1.1C源文件1.2 代码注释1.3变量与常量1.3.1变量1.3.2 常量1.3.3 二者的区别&#xff1a; 1.4 关键字和标识符 二、数据类型2.1 基本数据…

嵌入式Linux应用开发-第十四章查询方式的按键驱动程序

嵌入式Linux应用开发-第十四章查询方式的按键驱动程序 第十四章 查询方式的按键驱动程序_编写框架14.1 LED驱动回顾14.2 按键驱动编写思路14.3 编程&#xff1a;先写框架14.3.1 把按键的操作抽象出一个button_operations结构体14.3.2 驱动程序的上层&#xff1a;file_operation…

自动驾驶中的感知模型:实现安全与智能驾驶的关键

自动驾驶中的感知模型&#xff1a;实现安全与智能驾驶的关键 文章目录 引言感知模型的作用感知模型的技术安全与挑战结论 2023星火培训【专项营】Apollo开发者社区布道师倾力打造&#xff0c;包含PnC、新感知等的全新专项课程上线了。理论与实践相结合&#xff0c;全新的PnC培训…

【洛谷】P3378 【模板】堆

原题链接&#xff1a;https://www.luogu.com.cn/problem/P3378 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 一道模板题&#xff0c;主要是熟悉STL中优先队列&#xff08;priority_queue&#xff09;的使用。 堆的STL实现: priority_queue<in…

国庆周《LInux学习第四课》

国庆周《LInux学习第四课》 软件的安装与卸载 图解

无人注意,新安装的 Ubuntu 23.04 不支持安装 32 位应用

导读新安装的 Ubuntu 23.04 不支持安装 32 位应用。 无人注意&#xff0c;新安装的 Ubuntu 23.04 不支持安装 32 位应用 有用户报告&#xff0c;在新安装的 Ubuntu 23.04 上从 Ubuntu 仓库安装的 Steam 客户端是不工作的。在 Ubuntu 23.04 中使用了基于 Flutter 的新安装程序…

故障:无线鼠标键盘有时候出现短暂失灵的情况

无线鼠标连台式机用的&#xff0c;之前一直没问题&#xff0c;最近开始出现短暂失灵的情况。 并不是有延时&#xff0c;因为在失灵期间的那些操作在恢复后不会执行。 有的时候&#xff0c;电脑是在打开或者关闭某些应用&#xff0c;即调用cpu的情况&#xff0c;这个时候出问题…

k8s搭建EFK日志系统

搭建 EFK 日志系统 前面大家介绍了 Kubernetes 集群中的几种日志收集方案&#xff0c;Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch、Fluentd 和 Kibana&#xff08;EFK&#xff09;技术栈&#xff0c;也是官方现在比较推荐的一种方案。 Elasticsearch 是一个实…

Cannot download sources:IDEA源码无法下载

问题 Swagger的相关包&#xff0c;无法看到注释&#xff1b; 在class文件的页面&#xff0c;点击下载源码&#xff0c;源码下载不了&#xff0c;IDEA报下面的错误。 报错 Cannot download sources Sources not found for: io.swagger.core.v3:swagger-annotations:2.2.9 解决…

差分放大器的精髓:放大差模信号 抑制共模信号

参考如图基本的差分放大电路&#xff0c;在R1R2 R3R4的条件下&#xff0c;其输出与输入的关系为 &#xff1a; 具体推导过程参考&#xff1a;差分运算放大器的放大倍数的计算及结论_正在黑化的KS的博客-CSDN博客 由这个式子我们可以发现&#xff0c;差分放大器放大的是同相端与…

凉鞋的 Godot 笔记 103. 检视器 :节点的微观编辑和查看

在上一篇&#xff0c;笔者简单介绍了场景与节点的增删改查&#xff0c;如下所示: 在这一篇&#xff0c;我们接着往下学习。 我们知道在场景窗口&#xff0c;可以对节点进行增删改查。 在 Godot 引擎使用过程中&#xff0c;场景窗口的使用频率是非常高的。 但是场景窗口只能编…

系统集成|第二十一章(笔记)

目录 第二十一章 知识产权与法律法规21.1 知识产权21.2 法律法规 上篇&#xff1a;第二十章、收尾管理 第二十一章 知识产权与法律法规 21.1 知识产权 概述&#xff1a;狭义的知识产权就是传统意义上的知识产权&#xff0c;包括著作权&#xff08;含邻接权&#xff09;&#x…

深度学习——模型选择、欠拟合和过拟合

深度学习——模型选择、欠拟合和过拟合 文章目录 前言一、训练误差和泛化误差1.1. 统计学习理论1.2. 模型复杂性 二、模型选择2.1. 验证集2.2. K折交叉验证 三、欠拟合 or 过拟合3.1. 模型复杂性3.2. 数据集大小 四、多项式回归4.1. 生成数据集4.2. 对模型进行训练和测试4.3. 三…

Egg 封装接口返回信息

中间件封装 代码 const msgArr {"200":成功,"401":token失效 } module.exports (option, app) > {return async function(ctx, next) {try{//成功是返回的信息ctx.emit(code,data,msg)>{console.log(1111,code,data,msg)ctx.body {code,data:dat…

嵌入式Linux应用开发-第十三章APP怎么读取按键值

嵌入式Linux应用开发-第十三章读取按键及按键驱动程序 第十三章 APP怎么读取按键值13.1 妈妈怎么知道孩子醒了13.2 APP读取按键的4种方法13.2.1 查询方式13.2.2 休眠-唤醒方式13.2.3 poll方式13.2.4 异步通知方式13.2.4.1 异步通知的原理&#xff1a;发信号13.2.4.2 应用程序之…

MyBatisPlus(六)字段映射 @TableField

字段注解&#xff08;非主键&#xff09; TableField 用于映射对象的 属性 和表中的 字段 。 当 属性名 和 字段名 差异较大的时候&#xff0c;无法通过默认的映射关系对应起来&#xff0c;就需要指定 属性名 对应 的 字段名。 官网示例 代码实例 package com.example.web.…

clip代码安装实操

CLIP模型及代码地址&#xff1a;GitHub - openai/CLIP: Contrastive Language-Image Pretraining 代码准备环境 先创建一个anaconda虚拟环境&#xff0c;包含python3.7版本&#xff0c;将该环境命名为clip。成功。 &#xff08; pytorch1.7.1 所需 python 版本 >3.6&…

JVM内存线程Dump

Heap Dump文件生成 Heap Dump是指在Java虚拟机中&#xff0c;将当前内存中的对象信息以二进制形式保存到文件中的操作。它可以用于分析内存泄漏、内存溢出等内存相关问题。 生成Heap Dump文件的方式有多种&#xff0c;可以通过命令行工具如jmap、jcmd&#xff0c;也可以通过J…