当前位置: 首页 > news >正文

ARM-汇编指令

一,map.lds文件

链接脚本文件

作用:给编译器进行使用,告诉编译器各个段,如何进行分布

/*输出格式:32位可执行程序,小端对齐*/
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
/*输出架构:arm架构*/
OUTPUT_ARCH(arm)
/*入口:_start*/
ENTRY(_start)
/*段*/
SECTIONS
{. = 0x00000000;/*入口地址*/. = ALIGN(4);/*4字节对齐*/.text      :{./Objects/start.o(.text) /*第一个文件存放start.o文件,指定start.o位置*/*(.text) /*其余文件没有要求,编译器随便放*/}. = ALIGN(4);.rodata : /*只读数据段*/{ *(.rodata) }. = ALIGN(4);.data :  /*数据段*/{ *(.data) }. = ALIGN(4);__bss_start = .; .bss : /*.bss段*/{ *(.bss) }__bss_end__ = .;
}

二,汇编

1.汇编指令:编译器将一条编译指令编译生成机器码,占用代码段空间

2.伪指令:伪指令本身不是一条指令,编译器可以将器编译生成多条指令,共同完成一条指令功能

3.伪操作:指导编译器对代码如何进行编译,所有以 . 开头的伪操作,伪操作不占用代码段空间

基本格式:

<opcede>{cond}{s}Rd,Rn,#oprand2

<opcede>指令码

{cond}条件码:1)加条件码:指令有条件执行,2)不加条件码:指令默认无条件执行

{s}:加s,影响CPSR寄存器,不加s,不影响CPSR寄存器

Rd:目标寄存器

Rn:第一操作寄存器

#oprand2:第二操作数

        1)立即数:从判断的数中,找到0~0xff之间的数 ===> 判断的这个数所有1包含,将找到的0~0xff之间的数,循环右移偶数位 ===> 低位移出,补到高位,如果能够得到你要判断的那个数,说明这个数就是立即数

        2)寄存器

        3)有效数:将一个数按位取反之后,如果这个数为立即数,说明这个数为有效数

注意事项:

1.{cond}{s}需要连在一起编写

2.Rd,Rn,#oprand2需要用逗号分隔开

3.{cond}{s}和Rd,Rn,#oprand2需要用空格隔开

4.一条汇编指令占用一行,并且没有分号,不区分大小写

三,指令

1.数据操作指令

1.1数据搬移指令 MOV MVN 

相当于赋值

指令格式:{cond}{s} Rd,#oprand2

mov ====> 将第二操作数进行赋值

mvn ====> 将第二操作数,按位进行取反之后,进行赋值

1.2伪指令 LDR

可用于所有数的赋值

格式:ldr 寄存器,=值 

1.3移位操作指令 LSR LSR ROR ASR

指令格式:{cond}{s} Rd,Rn,#oprand2

lsl:逻辑左移 =====> 特点:无符号数左移,高位移出,低位补0

lsr:逻辑右移 =====> 特点:无符号数右移,低位移出,高位补0

ror:循环右移 =====> 特点:低位移出,补到高位

asr:算数右移 =====> 特点:低位移出,高位补符号位

1.4位运算操作指令 AND ORR EOR BIC

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

and:按位与 =====> 与0清0,与1不变

orr:按位或 =====> 或0不变,或1置1

eor:按位异或 =====> 异或0不变,异或1取反(相同为0,相异为1)

bic:按位清零 =====> 第二操作哪一位写1,对应位进行清0

1.5算术运算指令 ADD ADC SUB SBC MUL

指令格式:{cond}{s} Rd,Rn,#oprand2

add:普通加法指令

adc:带进位加法指令 ====> CPSR寄存器中C位标志位

sub:普通减法指令

sbc:带借位减法指令

mul:乘法指令 ====> 没有第二操作数,{cond}{s} Rd,Rn

1.6比较指令 CMP

指令格式:{cond} Rn,#oprand2

注意点:

1)比较指令没有目标寄存器

2)比较指令本质做减法运算

3)比较指令的执行结果,会影响CPSR寄存器的NZCV位,并且不需要加s

4)比较指令和条件码搭配使用

5)前面我们所有学习的指令,都是默认无条件执行,比较指令有条件指令

图片已经损坏 :<图片已经损坏 :<

 2.跳转指令 B BL

指令格式:b / bl{cond} 标签 ====> 跳转到标签下,第一条指令执行

b:有去无回,不会保存函数返回地址到LR寄存器中

bl:有去有回,会保存函数返回地址到LR寄存器中

3.特殊功能寄存器指令 MRS MSR

指令格式:

mrs{cond} Rn,cpsr ====> 将CPSR寄存器中的值,读到Rn目标寄存器中

msr{cond} cpsr,Rn ====> 将Rn寄存器中的值,写到CPSR寄存器中

4.内存操作指令

1.单寄存器操作指令 LDR STR

指令格式:

ldr/ldrb/ldrh Rn,[Rm] ===> 将Rm指向内存空间中的数据,读到Rn目标寄存器中

str/strb/strh Rn,[Rm] ===> 将Rn寄存器中的值,写到Rm指向地址空间中

ldr ===> looad 加载 ===> 将内存中值,读到寄存器中

str ===> store 写入 ===> 将寄存器中的值,写到某一块内存空间

r ===> register ===> 4字节

b ===> byte ===> 1字节

h ===> half word ===> 2字节

2.多寄存器操作指令 LDM STM

指令码:ldm stm

指令格式:

stm{cond} Rm,{寄存器列表} ===> 将寄存器列表中数据,写到Rm指向的连续地址空间中

ldm{cond} Rm,{目标寄存器列表} ===> 将Rm指向连续地址空间中内容,读到目标寄存器列表中

备注:1)寄存器列表连续用'-'分隔开 r1-r5

2)寄存器列表不连续用','分隔开 r1,r2,r3,r5

5.栈指针操作指令 SP

栈指针寄存器====> sp

满栈:栈指针指向这块空间有有效数据

空栈:栈指针指向这块空间没有有效数据

增栈:栈指针向高地址方向移动

减栈:栈指针向低地址方向移动

栈种类

满增栈 满减栈 空增栈 空减栈

满增栈:stmfa/ldmfa Full Accending

满减栈:stmfd/ldmfd Full Desascending =====> ARM默认采用满减栈

空增栈:stmea/ldmea Empty Accending

空减栈:stmed/ldmed Empty Desascending

常用满减栈

指令格式(例):

stmfd sp!,{寄存器列表} ===> 将寄存器列表中数据,写入到栈指针指向连续地址空间中

ldmfd sp!,{目标寄存器列表} ===> 将栈指针指向连续地址空间中内容,读到目标寄存器列表中

相关文章:

ARM-汇编指令

一&#xff0c;map.lds文件 链接脚本文件 作用&#xff1a;给编译器进行使用&#xff0c;告诉编译器各个段&#xff0c;如何进行分布 /*输出格式&#xff1a;32位可执行程序&#xff0c;小端对齐*/ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm",…...

Java相关知识对应leetcode

力扣账号&#xff1a;华为邮箱 类知识点力扣链接Integer转为String Character 判断字符是否是字母或者数字转为小写字母 不可修改 String 转为字符串数组 是否包含某个字符或者字符位置 可修改 StringBuffer 单个字符获取 string转为StringBufferStringBuffer转为String字符…...

js中?.、??、??=的用法及使用场景

上面这个错误&#xff0c;相信前端开发工程师应该经常遇到吧&#xff0c;要么是自己考虑不全造成的&#xff0c;要么是后端开发人员丢失数据或者传输错误数据类型造成的。因此对数据访问时的非空判断就变成了一件很繁琐且重要的事情&#xff0c;下面就介绍ES6一些新的语法来方便…...

每日一题:leetcode 1109 航班预订统计

这里有 n 个航班&#xff0c;它们分别从 1 到 n 进行编号。 有一份航班预订表 bookings &#xff0c;表中第 i 条预订记录 bookings[i] [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti &#xff08;包含 firsti 和 lasti &#xff09;的 每个航班 上预订了 seatsi 个座…...

C#__自定义类传输数据和前台线程和后台线程

// 前台线程和后台线程 // 默认情况下&#xff0c;用Thread类创建的线程是前台线程。线程池中的线程总是后台线程。 // 用Thread类创建线程的时候&#xff0c;可以设置IsBackground属性&#xff0c;表示一个后台线程。 // 前台线程在主函数运行结束后依旧执行&#xff0c;后台线…...

司徒理财:8.21黄金空头呈阶梯下移!今日操作策略

黄金走势分析 盘面裸k分析&#xff1a;1小时周期的行情局部于1896附近即下行通道上轨附近录得一系列的K线呈震荡下行并筑圆顶&#xff0c;上轨压制有效&#xff0c;下行通道并未突破&#xff0c;后市建议延续看下行。4小时周期局部录得一系列的纺锤线呈震荡&#xff0c;但行情整…...

Java8 实现批量插入和更新,SpringBoot实现批量插入和更新,Mybatis实现批量插入和更新

前言 基于mybatis实现的批量插入和更新 由于直接执行批量所有数据可能会出现长度超出报错问题&#xff0c;使用如下方式即可解决 实现 原理还是分配执行&#xff0c;这里的100就是设定每次执行最大数 /*** 封装使用批量添加或修改数据库操作* * param list 集合* param inse…...

vue登录验证码组件,前端验证

效果图 点击可以切换验证码 自定义组件 <template><div class"s-canvas"><canvas id"s-canvas" :width"contentWidth" :height"contentHeight"></canvas></div> </template> <script> e…...

SLS日志解析配置

分隔符模式 INFO|2023-04-10T11:05:30.12808:00|X.X.X.X|ACCESS_ALLOWED|1 模式&#xff1a;分隔符模式 日志样例&#xff1a;贴文档说明中的样例&#xff0c;或者直接在SLS历史日志里找一行 分隔符&#xff1a;竖线 日志抽取内容Key用文档中说明的变量名 是否接受部分字段&am…...

CRM系统有哪些功能可以管理客户?

客户管理&#xff0c;可以简单理解为企业收集并利用客户信息&#xff0c;建立与客户的良好关系&#xff0c;满足客户的需求&#xff0c;从而提升客户价值的过程。CRM一直被誉为客户管理的“神器”&#xff0c;下面我们就来说说&#xff0c;什么是客户管理&#xff1f;CRM如何管…...

15.树与二叉树基础

目录 一. 树&#xff0c;基本术语 二. 二叉树 &#xff08;1&#xff09;二叉树 &#xff08;2&#xff09;满二叉树 &#xff08;3&#xff09;完全二叉树 三. 二叉树的性质 四. 二叉树的存储结构 &#xff08;1&#xff09;顺序存储结构 &#xff08;2&#xff09;链…...

neo4j 图数据库 springboot

一.安装 neo4j社区版在liunx安装部署 https://blog.csdn.net/u013946356/article/details/81736232 二.知识图数据导入 参考:https://notemi.cn/neo4j-import-csv-file-data.html http://openkg.cn/dataset/ch4masterpieces 放在对应的import文件夹下面 导入数据 LOAD C…...

Linux下的系统编程——makefile入门(四)

前言&#xff1a; 或许很多Winodws的程序员都不知道这个东西&#xff0c;因为那些Windows的IDE都为你做了这个工作&#xff0c;但我觉得要作一个好的和professional的程序员&#xff0c;makefile还是要懂。这就好像现在有这么多的HTML的编辑器&#xff0c;但如果你想成为一个专…...

Mybatis的综合案例-学生信息查询系统 用于校验是否真正学习掌握了动态SQL

Mybatis的综合案例-学生信息查询系统 需求一&#xff1a;当用户输入的学生姓名不为空&#xff0c;则只根据学生信息进行查询; 当用户输入的学生姓名为空&#xff0c;且专业不为空&#xff0c;那么就根据学生专业进行学生的查询 需求二&#xff1a;查询所有id值小于5的学生信息…...

力扣:70. 爬楼梯(Python3)

题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客…...

陕西广电 HG6341C FiberHome烽火 光猫获取超级密码 改桥接模式 提升网速

光猫默认的路由模式实测在100M宽带下只能跑到60M左右&#xff0c;只有改成桥接模式才能跑满&#xff0c;不损失性能。但是改桥接需要给运营商打电话&#xff0c;有的时候不想麻烦他们&#xff0c;这时获取超级密码进行更改就是一个不错的选择了 分析 之前写了一篇HGU B2 光猫的…...

无涯教程-PHP - 移除的扩展

以下扩展已从PHP 7开始删除- eregmssqlmysqlsybase_ct 以下SAPI已从PHP 7开始删除- aolserverapacheapache_hooksapache2filtercaudiumcontinuityisapimilternsapiphttpdpi3webroxenthttpdtuxwebjames PHP - 移除的扩展 - 无涯教程网无涯教程网提供以下扩展已从PHP 7开始删除…...

笔记:transformer系列

1、和其他网络的比较 自注意力机制适合处理长文本&#xff0c;并行度好&#xff0c;在GPU上&#xff0c;CNN和Self-attention性能差不多&#xff0c;在TPU&#xff08;Tensor Processing Uni&#xff09;效果更好。 总结&#xff1a; 自注意力池化层将当做key,value,query来…...

Mysql socket连接测试

配置如下&#xff1a; socket /data/mysql/data/mysql.sock //套接字文件 在数据库没有任何连接的情况下&#xff0c;可以看到3306端口和socket端口都在监听 [mysqlt3-dtpoc-dtpoc-web04 bin]$ netstat -an | grep -i 3306 tcp 0 0 0.0.0.0:3306 0.…...

探究分布式操作系统的本质

探究分布式操作系统的本质 有一位网友问&#xff0c;分布式操作系统的本质是什么&#xff0c;今天就来说说这个话题。 首先&#xff0c;我们需要明确什么是分布式操作系统。 从大范围来理解&#xff0c;分布式操作系统是传统单机操作系统的延伸&#xff0c;可以看作是在多台独…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...