ARM汇编基础指令整合

汇编语言的组成

伪操作

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

        .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 = 0xfmov r1,#0xff@ mov r2,#0xfff @ error@ mov r3,#0xffff @ error@ mov r4,#0xfffff @ errormov r5,#0xffffffmov r6,#0xfffffffmov r7,#0xffffffff/*------------------ ------------------ ---------------*/
@ 代码2:mvn r5,#0xff  @ 0xff按位取反之后,赋值给r5mov r0,#0xff000000 @ 0xff 8mov r1,#0x1f800000 @ 0x7e  10mov r2,#0x00ffffff   @ ~r2 = 0xff000000mov r3,#0x0fffffff   @ ~r3 = 0xf0000000mov 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.mzph.cn/news/92196.shtml

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

相关文章

公众号商城小程序的作用是什么

公众号是微信平台重要的生态体系之一&#xff0c;它可以与其它体系连接实现多种效果&#xff0c;同时公众号内容创作者非常多&#xff0c;个人或企业商家等&#xff0c;会通过公众号分享信息或获得收益等&#xff0c;而当商家需要在微信做私域经营或想要转化粉丝、售卖产品时就…

SELinux 介绍

背景 在工作中经常需要在 android 中增加一些东西&#xff0c; 而android有自己的安全限制&#xff0c;如果不懂SELinux&#xff0c;就不好添加。 Control Access Model https://zh.wikipedia.org/wiki/Chmod https://linux.die.net/man/1/chcon DAC DAC and Trojan Horses D…

一维数组和二维数组的使用(一)

目录 导读1. 一维数组1.1 一维数组的创建1.2 数组的初始化1.3 一维数组的使用1.4 一维数组在内存中的存储 2. 二维数组2.1 二维数组的创建2.2 二维数组的初始化2.3 二维数组的使用2.4 二维数组在内存中的存储 博主有话说 导读 本篇主要讲解一维数组和二维数组的创建和使用&…

dart flutter json 转 model 常用库对比 json_serializable json_model JsonToDart

1.对比 我是一个初学者,一直跟着教材用原生的json,最近发现实在太麻烦了.所以搜索了一下,发现真的有很多现成的解决方案. 网页 https://app.quicktype.io/?ldart 这个是测试下来最好用的 有很多选项,可以使用 json_serializable 也可以不使用 json_serializable 这是推荐最…

机器人入门(一)

机器人入门&#xff08;一&#xff09; 一、ROS是什么&#xff0c;能用来干什么&#xff1f;二、哪些机器人用到了ROS&#xff1f;三、ROS和操作系统是绑定的吗&#xff1f;四、ROS 1 和ROS 2的关系是什么&#xff1f;4.1架构中间件改变API改变数据格式改变 4.2特性4.3工具/生态…

前缀、中缀、后缀表达式相互转换工具

目录 1. 界面一览 2. 使用说明 3. 实例演示 3.1 输入中缀 3.2 输入前缀 3.3 输入后缀 3.4 选择错误的类型 4. 代码 5. 资源地址 关于什么是前缀、中缀、后缀表达式&#xff0c;相信你不知道这个东西&#xff0c;那你也不会点进来这篇博客&#xff0c;当然&#xff0c;…

计算机竞赛 深度学习机器视觉车道线识别与检测 -自动驾驶

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

CentOS上网卡不显示的问题

文章目录 1.问题描述 1.问题描述 ifconfig下看不到ens33网卡了。systemctl status network #查看网卡状态报下面的问题网上说的解决方式有以下三种&#xff1a; 第一种&#xff1a; 和 NetworkManager 服务有冲突&#xff0c;这个好解决&#xff0c;直接关闭 NetworkManger 服…

竞赛选题 大数据疫情分析及可视化系统

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据疫…

【Linux】——基操指令(二)

个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 LeetCode刷题 算法专栏 目录 前言 man指令 cp 指令 mv指令 echo指令 cat指令 more指令 less指令 head和tail指令 head指令 tail指令 前言 上篇文章给大家讲解了Linux环境下的一点基操指令&#xf…

消息队列实现进程之间通信方式代码,现象

消息队列 #include <myhead.h> //消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_ds; #define SIZE sizeof(Msg_ds)-sizeof(long) //正文大小int main(int argc, const char *argv[]) {//1、创建key值key_t …

搭建全连接网络进行分类(糖尿病为例)

拿来练手&#xff0c;大神请绕道。 1.网上的代码大多都写在一个函数里&#xff0c;但是其实很多好论文都是把网络&#xff0c;数据训练等分开写的。 2.分开写就是有一个需要注意的事情&#xff0c;就是要import 要用到的文件中的模型或者变量等。 3.全连接的回归也写了&#…

ChatGPT的截图识别功能测评:开启图像中的文字与信息的新纪元

文章目录 根据截图&#xff0c;识别菜品根据截图&#xff0c;识别数学公式根据截图生成前端UI代码可视化图像复现案例一案例二 更多可以使用的方向 制作人&#xff1a;川川 辛苦测评&#xff0c;如果对你有帮助支持一下书籍&#xff1a;https://item.jd.com/14049708.html 根据…

自动化测试-友好的第三方库

目录 mock furl coverage deepdiff pandas jsonpath 自动化测试脚本开发中&#xff0c;总是会遇到各种数据处理&#xff0c;例如MOCK、URL处理、JSON数据处理、结果断言等&#xff0c;也会遇到所采用的测试框架不能满足当前需求&#xff0c;这些问题都需要我们自己动手解…

Flink CDC MySQL同步MySQL错误记录

1、启动 Flink SQL [appuserwhtpjfscpt01 flink-1.17.1]$ bin/sql-client.sh2、新建源表 问题1&#xff1a;Encountered “(” 处理方法&#xff1a;去掉int(11)&#xff0c;改为int Flink SQL> CREATE TABLE t_user ( > uid int(11) NOT NULL AUTO_INCREMENT COMME…

若依不分离+Thymeleaf select选中多个回显

项目中遇到的场景&#xff0c;亲测实用 表单添加时&#xff0c;select选中多个&#xff0c;编辑表单时&#xff0c;select多选回显&#xff0c;如图 代码&#xff1a; // 新增代码 <label class"col-sm-3 control-label">通道&#xff1a;</label><…

计算机图形学、贝塞尔曲线及绘制方法、反走样问题的解决(附完整代码)

贝塞尔曲线 1. 本次作业实现的函数及简单描述&#xff08;详细代码见后&#xff09;2. 与本次作业有关的基础知识整理3. 代码描述&#xff08;详细&#xff09;4. 完整代码5. 参考文献 &#xff08;本篇为作者学习计算机图形学时根据作业所撰写的笔记&#xff0c; 如有同课程请…

LabVIEW风力涡轮机的雷电流测量系统中集成高速摄像机

LabVIEW风力涡轮机的雷电流测量系统中集成高速摄像机 随着全球风电装机容量的快速增长&#xff0c;雷电活动对风力发电机组造成的损害受到更多关注&#xff0c;特别是在雷电活动强烈的地区。在冬季闪电期间&#xff0c;风力涡轮机等高层结构会受到向上的雷击。众所周知&#x…

Acwing 837. 连通块中点的数量

Acwing 837. 连通块中点的数量 题目描述思路讲解代码展示 题目描述 思路讲解 大家看y总这段代码时要注意&#xff0c;在C操作时&#xff0c;y总先把a&#xff0c;b的根结点取出来了&#xff1a;a find(a), b find(b);&#xff0c;因此接下来是先将集合a接到集合b下再把a的连通…

Android修行手册 - Activity 在 Java 和 Kotlin 中怎么写构造参数

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…