当前位置: 首页 > 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; 第二…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...