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

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

相关文章

QT下跨平台库实现及移植经验分享

最近在移植公司一个QT桌面软件到android上&#xff0c;有一些公司自定义的库&#xff0c;用了很多windows的api&#xff0c;移植过程很是曲折&#xff0c;在此有一些感悟分享一下~ 一.自编写跨平台库 1.有时候为了程序给第三方用需要编译一些qt封装库&#xff0c;并可能跨平台…

【SQL Server】实验四 数据更新

1 实验目的 掌握SQL数据更新语句的基本使用方法&#xff0c;如UPDATE、DELETE、INSERT。掌握更新语句条件中的嵌套查询使用方法。 2 实验内容 2.1 掌握SQL更新语句的基本使用方法 INSERT基本语句。UPDATE基本语句。DELETE基本语句。 2.2 掌握SQL更新语句的高级使用方法 …

Soft Robotics 变结构手掌和变刚度手指的仿人软体手的人机交互操作-武科大ESIR课题组师兄成果

一、引言 在当今的机器人技术领域&#xff0c;人类对机器人的需求日益增长&#xff0c;涉及到工业生产、医疗护理、服务业等各个领域。然而&#xff0c;由于任务的多样性和复杂性&#xff0c;单独依靠自主机器人操作往往难以满足实际需求。为了解决这一问题&#xff0c;人机协作…

社交革命的引领者:探索Facebook如何改变我们的生活方式

1.数字社交的兴起 随着互联网的普及&#xff0c;社交媒体成为我们日常生活的重要组成部分。Facebook作为其中的先驱&#xff0c;从最初的社交网络演变成了一个拥有数十亿用户的全球化平台。它不仅改变了我们与世界互动的方式&#xff0c;还深刻影响了我们的社交习惯、人际关系以…

从 VNCTF2024 的一道题学习QEMU Escape

说在前面 本文的草稿是边打边学边写出来的&#xff0c;文章思路会与一个“刚打完用户态 pwn 题就去打 QEMU Escape ”的人的思路相似&#xff0c;在分析结束以后我又在部分比较模糊的地方加入了一些补充&#xff0c;因此阅读起来可能会相对轻松。&#xff08;当然也不排除这是…

微信小程序订阅消息授权弹窗事件

微信小程序消息订阅授权弹窗事件 &#xff0c;每次授权完成之后&#xff0c;只可以推送一条模板消息。 目录 1、HTML代码 2、JS代码 1、HTML代码 <button bindtap"openPopup" class"openPopup">订阅消息</button> 2、JS代码 // 是否设置过授…

Python面试笔记

Python面试笔记 PythonQ. Python中可变数据类型与不可变数据类型&#xff0c;浅拷贝与深拷贝详解Q. 解释什么是lambda函数&#xff1f;它有什么好处&#xff1f;Q. 什么是装饰器&#xff1f;Q. 什么是Python的垃圾回收机制&#xff1f;Q. Python内置函数dir的用法&#xff1f;Q…

论文阅读——VSA

VSA: Learning Varied-Size Window Attention in Vision Transformers 方法&#xff1a; 给定输入特征X&#xff0c;VSA首先按照基线方法的例程&#xff0c;将这些标记划分为几个窗口Xw&#xff0c;窗口大小为预定义的w。我们将这些窗口称为默认窗口&#xff0c;并从默认窗口中…

Shell脚本学习-注释

注释是shell脚本中非常重要的内容&#xff0c;方便自己理解和别人理解。不会产生效果。也就是对于脚本起到了解释的作用。 单行注释 # 如下显示 [rootLDP ~]# cat 3.sh #你好 echo 你好 [rootLDP ~]# bash 3.sh 你好多行注释 使用<<加关键字 范围就是到下一个相同…

Oracle 一键巡检自动生成 Word 报告

前言 Oracle 数据库巡检通常需要消耗大量时间和精力&#xff0c;包括收集数据库以及主机的相关信息。针对 Word 报告的样式调整&#xff0c;也是重复和费事的&#xff0c;所以我针对 Oracle 巡检所需检查的信息以及报告模板&#xff0c;写了一套自动巡检并且生成报告的脚本。巡…

Linux动态库*.so函数名修改

在某些学习或者特殊需求的情况下要对linux下动态库*.so文件内部的函数名进行修改。 比如一个函数ADD(int a,int b);修改为Add(int a,int b); 通过这篇文章你将了解到在linux下动态库函数名寻址的规则&#xff0c;截止2024年3月linux动态库的寻址规则已经出现多种&#xff0c;这…

C++语法、Linux命令查询网站

文章目录 1.cplusplus2.cppreference3.Linux命令查询网站 1.cplusplus 网址&#xff1a;https://legacy.cplusplus.com/ 2.cppreference 1.cppreference中文网站&#xff1a;https://zh.cppreference.com/w/首页 2.cppreference英文原站&#xff1a;https://en.cppreference…

服务器生产环境问题解决思路

游戏服务器开发节奏比较快,版本迭代很频繁,有一些项目甚至出现了周更新(每周准时停服更新维护)。由于功能开发时间短,研发人员本身技术能力等原因,线上出现bug很常见。笔者经历过的游戏项目,一年到头没几次更新不出现bug的(当然,配置问题也算bug)。那当出现bug,我们…

C++ ezOptionParse的用法

在网上找了一下&#xff0c;发现并没有很多关于这个小型头文件的资料 只好自己上了 int main(int argc, const char * argv[]) {ezOptionParser opt;opt.overview "Demo of parsers features."; //概要说明,一般需要填写&#xff0c;简要介绍程序的作用opt.synta…

Java获取视频封面图,利用FFmpegFrameGrabber获取视频封面图

依赖 <dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.9</version></dependency>传入视频流获取图片byte /*** 获取视频截图** param frameNumber 视频的指定帧数* param …

关于Qt中的信号与槽

在Qt中&#xff0c;信号与槽是一种用于对象间通信的机制。信号是在特定事件发生时被发射的&#xff0c;而槽是在接收到信号时执行的函数。通过信号与槽&#xff0c;一个对象可以告诉其他对象某个事件已经发生&#xff0c;并提供有关该事件的信息。 以下是关于Qt中信号与槽的一…

Unity AI Navigation插件快速使用方法

AI Navigation插件使您能够创建能够在游戏世界中智能移动的角色。这些角色利用的是根据场景几何结构自动生成的导航网格。障碍物可以让您在运行时改变角色的导航路径。 演示使用的Unity版本为Tuanjie 1.0.0,团结引擎是Unity中国的引擎研发团队基于Unity 2022 LTS版本为中国开发…

C#,图论与图算法,双连通图(Biconnected Components of Graph)的算法与源代码

1 双连通图(Biconnected Components of Graph) 如果任意两个顶点之间有两条顶点不相交的路径,则无向图称为双连通图。在双连通图中,有一个通过任意两个顶点的简单循环。 按照约定,由边连接的两个节点构成双连通图,但这并不验证上述属性。对于具有两个以上顶点的图,必须…

Python Learn day05

Python Learn day05 本文主要讲解 继承、多态、定制类 继承和多态 什么是继承 当新类想要拥有现有类的功能结构&#xff0c;可以使用继承。继承的前提是新类 is a 现有类&#xff0c;即&#xff1a; 子类 is 父类 总是从某个类继承&#xff1a; class Myclass(object):pass…

Hello,Spider!入门第一个爬虫程序

在各大编程语言中&#xff0c;初学者要学会编写的第一个简单程序一般就是“Hello, World!”&#xff0c;即通过程序来在屏幕上输出一行“Hello, World!”这样的文字&#xff0c;在Python中&#xff0c;只需一行代码就可以做到。我们把这第一个爬虫就称之为“HelloSpider”&…