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!,{目标寄存器列表} ===> 将栈指针指向连续地址空间中内容,读到目标寄存器列表中

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

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

相关文章

StreamingWarehouse的一些思考和未来趋势

300万字&#xff01;全网最全大数据学习面试社区等你来&#xff01; 一篇笔记。 以Hudi、Iceberg、Paimon这几个框架为例&#xff0c;它们支持高效的数据流/批读写、数据回溯以及数据更新。具备一些传统的实时和离线数仓不具备的特性&#xff0c;主要有几个方面&#xff1a; 这…

Day 59

Day 59 503.下一个更大元素II 将两个nums数组拼接在一起&#xff0c;使用单调栈计算出每一个元素的下一个最大值&#xff0c;最后再把结果集即result数组resize到原数组大小就可以了。 class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:resu…

自然语言处理从入门到应用——LangChain:索引(Indexes)-[检索器(Retrievers)]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 检索器&#xff08;Retrievers&#xff09;是一个通用的接口&#xff0c;方便地将文档与语言模型结合在一起。该接口公开了一个get_relevant_documents方法&#xff0c;接受一个查询&#xff08;字符串&#xff09;并返…

(3)、SpringCache源码分析

1、入口说明 @EnableCaching是开启SpringCache的一个总开关,开启时候我们的缓存相关注解才会生效,所以我们@EnableCaching开始作为入口进行分析, 2、分析@EnableCaching注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(

Python“牵手”唯品会商品列表数据,关键词搜索唯品会API接口数据,唯品会API接口申请指南

唯品会平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;唯品会API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问唯品会平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现唯…

CPU、MCU、MPU、SOC、SOCPC、概念解释之在嵌入式领域常听到的名词含义

CPU、MCU、MPU、SOC等几个在嵌入式领域学习过程中会涉及到的几个名词。我们来学习一下&#xff0c;资料从网上搜集的&#xff0c;有错的地方可以指出。。。 CPU、MCU、MPU、SOC、SOCPC、 1. CPU2. MPU3.MCUMPU和MCU的区别&#xff1a;4.SOC5. SoPC 1. CPU CPU&#xff0c;即中…

Spring之Spring生态系统的演进

未来展望&#xff1a;Spring生态系统的演进 未来展望&#xff1a;Spring生态系统的演进 摘要引言词汇解释详细介绍新技术趋势与影响开发方向与展望探讨Spring在未来的发展趋势微服务与云原生响应式编程强调开发效率和全栈式开发支持人工智能和大数据保持灵活性和创新性 针对新兴…

docker 内apt-get安装软件都不好使

报各种错误 apt-get install --no-install-recommends libboost-all-dev Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed:autoconf automake autotools-dev cpp-8 gc…

索引设计规范

索引是帮助数据库高效获取数据的数据结构。索引是加速查询的常用技术手段。在设计索引时&#xff0c;要遵循索引设计规范&#xff0c;避免不必要的踩坑。 【推荐】索引存储结构推荐BTREE InnoDB和MyISAM存储引擎表&#xff0c;索引类型必须为BTRER&#xff0c;MEMORY表可以根…

vue2 vue中的常用指令

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 **构建用户界面 ** 的 渐进式 …

go:正确引入自己编写的包(如何在 Go 中正确引入自己编写的包)

前言 目录如下&#xff1a; 具体教程 1. 工作空间&#xff08;我的是根目录&#xff09;新建 go.work 文件 文件内容如下&#xff1a; go 1.21.0use (./tuchuang./tuchuang/testm ) 2. 添加go.mod文件 1. 包文件夹下 进入testm目录执行 go mod init testModule 2. 引用目…

设计模式——装饰器模式

装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构型模式&#xff0c;它是作为现有的类的一个包装。 装饰器模式通过将对象包装在装饰器类中&#xff0c;以便动态…

软考高级系统架构设计师系列论文九十九:论软件开发平台的选择和应用

软考高级系统架构设计师系列论文九十九:论软件开发平台的选择和应用 一、相关知识点二、摘要三、正文四、总结一、相关知识点 软考高级系统架构设计师系列之:面向构件的软件设计,构件平台与典型架构二、摘要 本文从一个行业MIS系统的开发实践,讨论了软件开发平台的选择和应…

java maven项目打jar包发布(精简版)

目录 一、maven打包 二、安装jdk环境 三、安装mysql 四、jar包传输到服务器 一、maven打包 先clean再package target文件夹下面有生成一个jar包 二、安装jdk环境 1、下载jdk cd /usr/local wget https://repo.huaweicloud.com/java/jdk/8u201-b09/jdk-8u201-linux-x64.tar.…

数据库——事务,事务隔离级别

文章目录 什么是事务?事务的特性(ACID)并发事务带来的问题事务隔离级别实际情况演示脏读(读未提交)避免脏读(读已提交)不可重复读可重复读防止幻读(可串行化) 什么是事务? 事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 事务最经典也经常被拿出…

sonarqube报错http status 500-internal server error,什么原因,怎么解决

sonarqube报错http status 500-internal server error,什么原因&#xff0c;怎么解决 答案&#xff1a; SonarQube报错HTTP状态500-内部服务器错误通常是由于服务器端出现了一些问题导致的。这可能是由于配置错误、资源不足、数据库连接问题或其他一些未知的问题引起的。 以下…

【PHP】基础语法变量常量

文章目录 PHP简介前置知识了解静态网站的特点动态网站特点 PHP基础语法代码标记注释语句分隔(结束)符变量变量的基本概念变量的使用变量命名规则预定义变量可变变量变量传值内存分区 常量基本概念常量定义形式命名规则使用形式系统常量魔术常量 PHP简介 PHP定义&#xff1a;一…

03ShardingSphere-JDBC读写分离

背景 面对日益增加的系统访问量&#xff0c;数据库的吞吐量面临着巨大瓶颈。 对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说&#xff0c;将数据库拆分为主库和从库&#xff0c;主库负责处理事务性的增删改操作&#xff0c;从库负责处理查询操作&#xff0c;能够…

理解 Delphi 的类(四) - 初识类的事件

先勾画一下思路: 1、建立一个类, 里面有年龄字段 FAge; 2、通过 Age 属性读写 FAge; 3、如果输入的年龄刚好是 100 岁, 将会激发一个事件, 这个事件我们给它命名为: OnHundred unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, F…

resource doesn‘t have a corresponding Go package.

resource doesnt have a corresponding Go package. GO这个鬼东西不能直接放src下。 ************ Building Go project: ProjectGoTest ************with GOPATH: D:\Go;D:\eclipse-jee-oxygen-2-win32-x86_64\workspace\ProjectGoTest >> Running: D:\Go\bin\go.exe …