3.15号arm

汇编语言

1. 汇编语言的组成

汇编文件中由伪操作、伪指令、汇编指令以及代码注释这几部分组成

伪操作:
    ARM的汇编中伪操作以.为前缀,所有的伪操作不占用内存空间,编译汇编时告诉编译器怎么编译当前文件,主要用来修改汇编内容的  .text    .global   .globl  .end     .if  .else  .endif

伪指令:不是指令,但是伪指令也会占用指令内存,执行一条伪指令时也会让运算器进行相关运算

汇编指令:汇编指令执行时会让运算器进行相关运算
    数据处理指令
    跳转指令
    内存读写指令
    状态寄存器传送指令
    异常触发指令
    协处理器指令(不讲)

 注释:
        单行注释:@
        多行注释:/*  */
        条件注释: 
            .if 逻辑值
                指令段
            .else
                指令段
            .endif
解释:逻辑值为真,则执行上一段指令,逻辑值为假,则执行else下面的指令段

2.汇编指令格式

<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>

opcode:汇编指令的指令码

code 条件码

s:当按照指令码对应的指令执行时程序的运行结果会影响到CPSR的条件位

RD:目标寄存器,指令运算的结果保存至目标寄存器中

RN:第一操作寄存器 参与运算的寄存器

shifter_operand:第二操作数 参与运算的数据,可以是寄存器,也可以是一个立即数

操作数前面需要加一个#

将第一操作寄存器的数值和第二操作数按照指令码进行运算,如果指令码后面有s后缀,运算的结果会影响CPSR条件位,指令的运行结果保存至目标寄存器中

3. 汇编指令---数据处理指令

3.1 数据搬移指令

功能:能够将指定的数值搬移到指定的寄存器中

mov{条件码} 目标寄存器,操作数

如果条件码对应的条件满足,则将操作数的值存放到目标寄存器,这个操作数既可以是立即数,也可以是寄存器

mvn{条件码} 目标寄存器,操作数

如果条件码对应的条件满足,则将操作数的值按位取反后存放到目标寄存器,这个操作数既可以是立即数,也可以是寄存器

3.2 立即数

立即数指的是可以直接当作指令的一部分去执行的数据。32位的指令空间中为操作数预留了12位的空间,12位空间分为两部分:低八位和高四位,从0-255范围内找一个数字,让这个数字循环右移偶数位,能够得到的数据就是立即数,否则就不是立即数

3.3 数据移位指令

算术左移:最高位移出,最低位补0

lsl{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数值算术左移第二操作数对应的数值位数,结果保存到目标寄存器中

算术右移:最低位移出,最高位补0

 lsr{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数值算术右移第二操作数对应的数值位数,结果保存到目标寄存器中

循环右移:最低位移出,补到最高位

 ror{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

将第一操作寄存器的数值循环右移第二操作数对应的数值位数,结果保存到目标寄存器中

3.4 位运算指令

按位与:
and{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
    将第一操作寄存器的数值和第二操作数进行与运算,运算的结果保存到目标寄存器中
按位或:
orr{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
    将第一操作寄存器的数值和第二操作数进行或运算,运算的结果保存到目标寄存器中
按位异或:
eor{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
    将第一操作寄存器的数值和第二操作数进行异或运算,运算的结果保存到目标寄存器中
    
按位取反:
    mvn{条件码} 目标寄存器,操作数

按位清零
BIC{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
    将第一操作寄存器的数值和第二操作数进行按位清零运算,运算的结果保存到目标寄存器中

3.5 算术运算指令

加法指令:
    add{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器+第二操作数
    adc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器+第二操作数+cpsr寄存器c位的值
减法运算:
    sub{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器-第二操作数
    sbc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器-第二操作数-cpsr寄存器c位的取反值
逆向减法运算:
     rsb{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第二操作数-第一操作寄存器
     rsc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第二操作数-第一操作寄存器-cpsr寄存器c位的取反值

乘法运算:
    mul{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器+第二操作数

3.6 数据比较指令

cmp 第一操作寄存器,第二操作数
比较指令的本质就是两个比较的数3进行减法运算,而且运算的结果会影响到CPSR条件位

我们在比较指令执行完毕后其他的指令后面可以跟上指定的条件码,当该指令执行之前,先去判断条件码对应的条件是否满足,如果满足,则该指令执行,如果不满足,则该指令不执行

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

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

相关文章

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的吸烟检测系统(深度学习+Python代码+PySide6界面+训练数据集)

摘要&#xff1a;本文详细说明了如何利用深度学习开发一个用于监测吸烟行为的系统&#xff0c;并分享了完整的代码实现。该系统采用了先进的YOLOv8算法&#xff0c;同时还使用YOLOv7、YOLOv6、YOLOv5算法&#xff0c;并对它们进行了性能比较&#xff0c;呈现了不同模型的性能指…

Linux:kubernetes(k8s)有状态的服务部署(14)

之前我都是对无状态进行的一个操作&#xff0c;我们想扩容就扩容&#xff0c;想缩容就缩容&#xff0c;根本不用去考虑他的一个网络环境&#xff0c;本地储存环境啥的一个状态 当我们做有状态的服务的操作&#xff0c;肯定要申请一个持久化的一个空间&#xff0c;以及网络&…

Transformers 直观解释——不仅是如何工作,而且为什么工作得这么好 (Ketan Doshi)

Transformers 直观解释——不仅是如何工作&#xff0c;而且为什么工作得这么好 Transformers Explained Visually — Not Just How, but Why They Work So WellHow does the input sequence reach the Attention module 输入序列如何到达Attention模块Each input row is a word…

运放小信号带宽和时间常数、大信号带宽、非线性和线性建立时间的分配

Ref&#xff1a;1. https://www.zhihu.com/question/35621797 2、非线性建立与线性建立时间-up主NKSUNMOON 一、引言 运放的小信号带宽和大信号带宽是不一样的&#xff0c;但都对运放从速度方面提出了要求。小信号带宽反映的是电路的线性建立过程&#xff0c;但从时域上看是…

CKA认证之Etcd备份与恢复

题目介绍&#xff1a; 资料参考&#xff1a; https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd 解题&#xff1a; 1、备份 #参考模板列出 etcdctl 可用的各种选项。 #例如&#xff0c;你可以通过指定端点、证书和密钥来制作快照&#xff0…

01——LenNet网络结构,图片识别

目录 1、model.py文件 &#xff08;预训练的模型&#xff09; 2、train.py文件&#xff08;会产生训练好的.th文件&#xff09; 3、predict.py文件&#xff08;预测文件&#xff09; 4、结果展示&#xff1a; 1、model.py文件 &#xff08;预训练的模型&#xff09; impor…

力扣经典题:分割平衡字符串

大佬的代码非常简洁 int balancedStringSplit(char * s){short i0,count0,sign0;while(s[i]){signs[i]L?sign1:sign-1;if(sign0) count;}return count; }

Redis中的缓存设计

缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c;缓存层和存储层都不会命中&#xff0c;通常处于容错的考虑&#xff0c;如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c;失去了缓存保护后端存储的意义。…

C++进阶:详解多态(多态、虚函数、抽象类以及虚函数原理详解)

C进阶&#xff1a;详解多态&#xff08;多态、虚函数、抽象类以及虚函数原理详解&#xff09; 结束了继承的介绍&#xff1a;C进阶&#xff1a;详细讲解继承 那紧接着的肯定就是多态啦 文章目录 1.多态的概念2.多态的定义和实现2.1多态的构成条件2.2虚函数2.2.1虚函数的概念2…

【bioinformation 7】药效团

&#x1f31e;欢迎来到AI医学的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年3月16日&am…

实战:django项目环境搭建(pycharm,virtualBox)

django项目环境搭建 一.创建虚拟环境二.创建PyCharm远程连接 一.创建虚拟环境 需要用到的软件&#xff1a;PyCharm&#xff0c;VirtualBox虚拟机。 1.打开虚拟机终端&#xff0c;创建新的虚拟环境 Book。 2.在虚拟环境中创建新的文件夹 library&#xff0c;cd命令进入该文件…

【测试开发学习历程】在CentOS7上安装Docker

前言&#xff1a; 内容进入到Docker的时间虽然不是特别长&#xff0c; 但是呢在虚拟机上安装Docker的步骤还是不能少&#xff0c; 因为自己以后也是可能用到这个东西的。 注意&#xff0c;下文中提到的保存退出的命令是&#xff1a; :wq 如果要编辑文件的步骤&#xff0c;…