【微处理器】ARM汇编

ARM汇编指令学习 arm基础指令集 阅读详情

一、访问信息

1、MOV指令,目的操作数只能是寄存器,源操作数可以是寄存器或立即数

这个指令后面可以加S,表示是否更新APSR,注意这个指令不区分sign和unsign,所有短位的数例如short,被移动到寄存器后都只会进行0扩展,不会进行符号扩展

2、LDR和STR,用于访问内存,不能直接从一个立即数地址load数据,必须先把这个立即数load到一个寄存器中,再用这个寄存器里的值访问内存。这两个指令有sign和unsign版,还有byte和half版,例如LDRSH,就是sign,half,unsign就不用写LDRUH了,直接写LDRH就行

二、算术运算

1、基本加减乘除

ADD,SUB可以加S,代表更新APSR

两个特殊的ADC,SBC,好像有点复杂,没咋讲就不看了

乘法除法,乘法就是MUL,结果是32比特的,除法有无符号数除法和有符号数除法,分别是UDIV和SDIV

2、三种奇怪的操作数

LDRB R0, [R1, #0x3]

这个的意思是load的byte是R1寄存器中存的地址再加3的地址

LDR R3, [R0, R2, LSL #2]

这个的意思是load的地址是R0+(R2<<2),这里LSL是逻辑左移

LDR R0, [R1], #4

这个是先把R1寄存器里的地址load进来,然后再把R1寄存器里的地址+4

3、关于伪汇编

LDR R0, =0x12345678

这条汇编由于后面的立即数已经有32bit了,然而一条指令最多也就32bit,没地方存了,所以这条汇编实际上是假的,但是我们可以这么写,汇编器/编译器会帮我们把这条伪汇编实现,通过在代码段存一些立即数和label,然后在指令中存offset,用pc+offset的方式访问内存中的地址

LDR R0, [PC, #offset]

...

DCD 0x12345678

4、Literal

接上面伪汇编的实现方法,这种在代码段中插数据的方法叫做Literal,我们也可以自己做

看下面这个例子,DCD是分配一个字的长度,DCB是分配一个字节或多个字节的长度,这里定义MY_NUMBER是0x2000ABCC,HELLO_TEXT是“Hello\n”,并且以0作为终结符,所以这个字符串实际上是hello和\n一共6字节,再加上终结符0,一共7字节。然后前面的ALIGN意思是,下面的代码以4字节对齐,这样可以避免一些存储和运行上的麻烦。注意这些label并不会出现在二进制机器码中,这只是汇编器为了方便程序员阅读从而添加的标记,实际的二进制码只会存这个32位的数,DCD、DCB也不会出现,这些只是为了让汇编器理解这行的内容。

汇编指令部分,前两条是把MY_NUMBER,也就是0x2000ABCC这个值复制到R3,然后把这个地址对应的内容复制到R4,后两条是先把HELLO_TEXT也就是“Hello\n”,的地址复制到R0,然后再从R0这个地址load一个byte到R2,这里一个byte就是首字母H。

LDR R3, =MY_NUMBER ;

LDR R4, [R3]

LDR R0, =HELLO_TEXT

LDRB R2, [R0]

…

ALIGN 4 ;

MY_NUMBER DCD 0x2000ABCC

HELLO_TEXT DCB “Hello\n”, 0

三、控制

1、关于指令长

因为有2字节的指令也有4字节的指令,那么机器怎么取指呢

机器可以通过前两字节,也就是hw1来判断这是一个两字节的指令还是一个4字节的指令,如果是4字节的指令,机器就会把后两字节取出来。但是在模拟的时候会发现机器每次都会取4字节的指令,这是因为机器做了一定的优化。

2、如何实现跳转

通过修改PC的值实现跳转,那么是怎么修改的呢,ARM汇编指令集存的是当前PC到要跳转的地方的偏移,这个offset可正可负。

3、跳转指令

有四个基本的

        1)B <label>,无条件的跳转到label处

        2)B<cc> <label>,条件跳转到label处,cc是条件

        3)BL <label>,干两件事,第一,把当前PC压入LR寄存器,为什么是当前PC,因为PC已经在fetch这条BL指令之后自加了,当前PC就是下一条指令的地址,第二,跳转到label处。

        4)BX Rm,这也是干两件事,先根据Rm寄存器中的LSB,也就是最低位判断mode,是1就说明要用thumb mode,如果是0就说明是要用ARM mode。(为什么我们可以把地址的最低位用来做这个标记,因为ARM的处理器要求arm指令必须字对齐,thumb指令必须半字对齐,所以指令一定是存在偶地址的,最后一位一定是0,我们就可以拿这位做这个标记。)确定mode之后,还原出原来的地址,然后跳转到这个地址。

        5)BLX Rm,这个就是前两条指令的结合,要干三件事了,一个是把PC存到LR里,然后在干BX Rm干的事。

4、关于模式的改变

        1)b label不支持模式转变,处理器默认你b之前和b之后是一个mode

        2)只有bx才支持模式转变,所以bx会要求操作数是一个寄存器,这样方便他判断LSB

        3)很多时候需要修改一个地址的LSB,要么是你存的时候要改,例如BL的时候要根据你当前的mode改LSB,还有的时候是取的时候要改,例如你确认该次跳转要进行模式转变,那么在bx之前,把要跳转的地址load到寄存器的时候,你要进行LSB的修改,例如你知到你要跳转到thumb mode,那就可以把你要跳转的地址和1按位或,1二进制就是前面全0,最后一位是1,按位或之后前面都不变,最后一位一定变成1。这样就可以确保LSB是1了。

5、条件后缀

首先是APSR状态寄存器可以通过cmp指令更新

然后就是这张表

6、对于栈的操作

Thumb指令集支持简单的push和pop,而且可以一条指令push或pop多个值

首先,cortex-M的栈是从高地址向低地址增长的,这样我们就可以开始理解push和pop了

Push多个寄存器的值到栈里的时候,遵循寄存器号越小,栈内地址越低这一原则,例如push{R0,LR},R0会在低地址,LR会在高地址,所以逻辑上是LR先被push进去,也就是说我写的这条指令中寄存器的排列顺序与逻辑上的push顺序没有关系。

Pop多个值到多个寄存器里的时候,也遵循寄存器号越小,栈内地址越低这一原则,例如栈内是这样,我要pop到R0和R3,那么我写的顺序是不影响的,最终都是658那个地址的数去R0,65C那个地址的数去R3,也就是大地址到大号码寄存器,小地址到小号码寄存器。

四、过程

这里梳理一下函数调用的过程

1、首先要把r0-r3空出来,也就是说如果我当前过程中有用r0-r3存东西,我需要保护他,要么把它压入栈中,要么把他存在Callee saved寄存器里。前者因为要访问栈,也就是内存访问,所以会慢,但是能存多个,后者是寄存器访问,所以会快,但是只能存有限个。R0-r3这四个寄存器是Caller saved寄存器,剩下r4-r11是Callee saved寄存器。

2、然后我需要传参,参数要存在r0-r3上,按顺序存,且需要按字对齐,这会出现问题,第一,如果参数太多放不下,就需要把剩下的放到栈上。第二,这四个寄存器两两成对,也就是说,如果我的参数是一个32位,一个64位的,一个32位的。我把第一个32位的参数存在r0之后,不能把64位的存在r1和r2,因为r0和r1是一对,r2和r3是一对,我想存这个64位的数就必须存在r2和r3上,r1就只能空出来了,也不能存第三个32位的数,因为要遵循按顺序存放的原则,这第三个参数就只能通过栈传递了。注意栈上也要遵循按字对齐,举个例子,栈上要传一个byte(8bit)和一个short(16bit),这俩不能放在一行,是放在两行的,也就是这个意思

                                                e -> [ e |   |   |   ]

                                                f -> [    f    |   |   ]

3、然后现场保护完了,参数传完了,我需要跳转了,要用BL,也就是把等会调用完回来要执行的指令的地址压到LR里,这个时候如果我已经在一个函数里了,也就是说我本来LR就存了上一次调用要回去的地址,那就需要先把这个LR压到栈里,再调用BL,这样保证到时候能回来。这里必要时也可以用BLX,同时也要注意先前提BL和BLX时的细节

4、然后就执行函数里的指令,这时候如果要用到Callee saved寄存器就需要把用到的寄存器里的值压入栈中保存,在跳转回去之前再pop出来,执行完之后如果函数有返回值,那么就需要传递返回值给原过程,传返回值的规则如下

为什么能是Indeterminate

5、执行完函数里的指令之后,需要跳转回来了,通常是BX LR,同样需要注意先前提到的细节。回来之后要从栈上拿信息,栈顶的可能是返回值,拿完之后如果是过程调用过程,还有可能要pop先前压进去的上一个LR,然后如果先前压进去了r0-r3,那也要pop出来,之后就可以正常执行后面的指令了。

ARM汇编——PC和LR寄存器理解 寄存器,Arm汇编,PC,LR 阅读详情

相关推荐

ARM中链接寄存器LR与指令寄存器IR的关系及编程实例

在ARM体系结构中,链接寄存器(Link Register,LR)和指令寄存器(Instruction Register,IR)是两个重要的寄存器。在子函数返回时,通过将LR中的值加载到程序计数器(Program Counter,PC)中,程序会返回到正确的位置继续执行。当一个函数调用另一个函数时,当前函数的返回地址会被保存到LR中,以便在子函数执行完成后返回到正确的位置。LR寄存器通常用于存储跳转指令(如BL指令)的返回地址。函数中,首先将LR寄存器的值保存到栈中,然后将字符串地址存储到寄存器R1中。

2301_79326930的博客 1132

ARM汇编 MOV PC,LR

终于明白这个LR寄存器了 看下面这个ARM汇编吧 BL NEXT ;跳转到子程序 ......... ;NEXT处执行 NEXT .......... MOV PC,LR ;从子程序返回 这里的BL是跳转的意思,LR(R14)保存了返回地址 PC(R15)是当前地址,把LR给PC就是从子程序...

pikachu_beta的博客 3468

全面掌握ARM7微处理器架构及应用

ARM7微处理器,作为半导体行业的一个重要里程碑,以其高性能和低功耗的特性,被广泛应用于移动通信和嵌入式系统领域。本章我们将探讨ARM7的架构基础,为深入理解其指令集、硬件组成、外设集成以及编程特性奠定坚实的基石。LPC系列微控制器是基于ARM处理器架构的高性能微控制器,具有功耗低、处理速度快、集成度高、扩展性好等特点。这些特点使得LPC系列微控制器在众多嵌入式应用中得到了广泛应用。

weixin_42612405的博客 848

arm push/pop/b/bl汇编指令

push支持同时将多个寄存器入栈,格式{xx,xx},如push{r0,r1,r2}BL函数条跳转前执行LR=PC-4;如同push一样,pop也支持同时pop出栈多个寄存器。

GetnextWindow的专栏 1万+

ARM7程序设计与KEIL仿真教程

ARM7微处理器代表了ARM架构的一个重要分支,它的出现不仅推动了移动计算领域的发展,还在嵌入式系统中占据了重要的地位。ARM7的起源可以追溯到上世纪九十年代,当时ARM公司设计了一系列高效的处理器内核以满足快速增长的移动计算需求。ARM7技术特点主要体现在其低功耗和高性能的处理能力,通过精简的指令集架构(RISC)实现了高效的执行效率和优化的电源管理。随着技术的不断进步,ARM7处理器系列逐渐演进,成为嵌入式应用的理想选择,广泛应用于工业控制、消费电子产品、车载系统和智能仪表等领域。

weixin_29476595的博客 695

Monocle2拟时轨迹基因模块的GO富集解析

本文详细解析了如何对Monocle2拟时分析中得到的基因表达模块进行GO富集分析。通过从热图对象中提取聚类模块,并利用clusterProfiler等工具进行功能注释,将抽象的基因表达时序模式转化为可解释的生物学功能主题,如免疫应答、细胞外基质组织等,从而深入理解细胞命运转变的驱动机制。

gpt4scribbler的博客 500

【ARM汇编】第二章:ARM微处理器

文章目录嵌入式系统概述基本概念嵌入式系统的发展发展历史发展趋势组成结构设备驱动层硬件抽象层HAL板级支持包BSP设备驱动程序实时操作系统RTOSOS的应用程序接口API应用程序APP嵌入式处理器微处理器微控制器DSPSOC典型嵌入式处理器介绍MIPS处理器Power PC处理器Sparc处理器ARM处理器ARM概述计算机体系结构的分类冯洛伊曼结构哈弗结构ARM技术的发展过程ARM内核的特点RISC...

whitefish520的博客 1万+

使用Docker搭建MaxKB智能体平台

【代码】使用Docker搭建MaxKB智能体平台。

janthinasnail的博客 711

02_ARM汇编自学笔记模型之ARM微处理器的工作状态

二模型 ARM 微处理器的工作状态 - 第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令; - 第二种为Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。 状态切换方法:在开始执行代码时,应该处于ARM状态,采用执行BX指令的方法,使微处理器从ARM状态切换到Thumb状态,当处理器处于Thumb状态时发生异常(如I RQ、FI Q、Undef 、Abort 、

u011337769的博客 370

腾讯地图自定义瓦片地图开发实战:从坐标定位到图层融合

本文详细介绍了腾讯地图自定义瓦片地图开发的全流程,从坐标定位到图层融合的实战技巧。通过具体代码示例和常见问题解决方案,帮助开发者快速掌握腾讯地图API的自定义瓦片功能,实现室内外地图的无缝衔接和特殊图层的叠加展示。

weixin_42526015的博客 172

关于RTP时间戳以及播放器对时间戳的处理

首先,了解时间戳几个基本概念: 时间戳单位:时间戳计算的单位不是秒之类的单位,而是由采样频率所代替的单位,这样做的目的就是为了是时间戳单位更为精准。比如说一个音频的采样频率为8000Hz,那么我们可以把时间戳单位设为1 / 8000。 时间戳增量:相邻两帧之间的时间差(以时间戳单位为基准)。 采样频率: 有些地方也叫时钟频率,即 每秒钟抽取样本的次数,例如音频的采...

toshiba689的专栏 3052

探索ARM微处理器世界:深入理解ARM7指令集及其汇编技术

探索ARM微处理器世界:深入理解ARM7指令集及其汇编技术 去发现同类优质开源项目:https://gitcode.com/ 随着嵌入式系统和移动设备的爆炸性增长,了解ARM架构成为了开发者不可或缺的技能之一。今天,我们为您推荐一个珍贵的开源宝藏——《ARM7指令集及汇编(经典完整版)》电子书资源。这不仅是一份文档,而是一个开启 ARM 微处理器深度之旅的钥匙。 项目介绍 位于开源社区的这一项目,...

gitblog_06656的博客 652

第10章 shellcode实战:18 神级开源shellcode工具:donut

Donut是一款shellcode生成器,可将C/C++、C#生成的PE文件转换为shellcode文件,同时支持JS、XSL、VBS脚本转换为shellcode。以下“原生”EXE/DLL指非托管PE文件(包括并不限于C/C++、delphie等编写生成的可执行文件),可以直接由系统加载运行,区别于.Net生成的托管文件。被处理exe/dll为32位程序,则需要用32为的shellcode加载器启用,exe/dll为64位的就用64位shellcode加载器启用。

李小咖·网安技术库 2796

arm蛋疼汇编 part3-- 转载 ARM微处理器的指令系统

跳转指令:arm程序跳转的两种方法:           1.直接修改pc寄存器的值   可以实现4GB空间的跳转           2.使用跳转指令   只能实现前后32M空间的跳转B:    相对来说有去无回的跳转    格式:   B{条件}   目标地址         eg:B Lable @@@@@@@@@@@@@@@@@@@@@@@ CMP R0,#0 BEQ Lable @相等则跳转 BL:  带返回的跳转 跳转前将PC寄存器的值写入LR寄存器(R14)  格式:   BL{

leftover_crazy的专栏 1004

《四》:LBE,VR 大空间系列——Pico的空间扫描方式

(这里有个选项叫高精度扫描模式,这个功能在下方详细补充)系统会根据绘制的顶点,将区域分割成若干个4X4米的小方格,我们只需要根据提示,首先进入一个方格子空间内部,然后依次凝视每个区域上下左右前后六个面的小方格组,每一面4个,直至全部消失, 消失后地面会出现一个方形行走路径,我们沿着边缘正或反走一圈即可,完成后此块区域即自动消失。不过由于pico有一个高精度扫描圈,如图加粗的圆环,这个圆环的意思是在在内部的区域扫描精度较高,越远离原点的区域误差越大,所以为了更有效的利用,建议原点设置在场地中心区域。

unitygroup的博客 2887

ABAP RAP 行为建模深入学习:从 Behavior Definition 到 Behavior Implementation 的完整实践指南

ABAP RAP开发指南:业务行为定义与实现 本文介绍SAP RAP框架中业务对象行为的开发方法: 分层设计 Behavior Definition声明业务能力(增删改查、校验、动作等) Behavior Implementation在ABAP类中编写具体逻辑 核心组件 使用BDL定义业务行为 通过FOR BEHAVIOR OF绑定行为池类(ABP) 在本地类实现校验/确定/动作逻辑 关键特性 支持managed/unmanaged两种实现模式 提供草稿表、并发控制等企业级功能 通过EML以别名访问实体 开

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 414

微处理器原理与应用篇---ARM常见汇编指令

《ARM汇编常用指令解析》摘要:本文详解10种核心ARM汇编指令,包括LDR/LDRB(数据加载)、STR/STRH(数据存储)、AND(逻辑运算)、ADD(算术运算)等。重点说明其语法格式(如LDR Rd,[Rn,#offset])和典型应用场景(寄存器操作、外设控制、位处理等),并通过LED控制实例展示综合应用。特别强调指令的内存对齐要求(字/半字对齐)、立即数编码限制,以及伪指令DCD的使用场景。掌握这些指令可有效实现底层硬件操作、数据处理及算法优化。

在你不想做的时候,正是应该做的时候。 1077

基于GEC6818开发板+Linux+Qt设计的智能养老院出入管理系统(195)

当前,传统的养老院出入管理模式普遍存在信息更新滞后、数据统计繁琐、实时监控能力不足等问题,难以满足现代养老机构对安全管理与服务质量提升的需求。本系统设计正是针对这些问题,通过集成先进的硬件设备如高性能GEC6818开发板以及RFID刷卡模块,结合稳定高效的嵌入式Linux操作系统和QT开发框架,构建一套功能齐全、操作直观、响应迅速的智能出入管理系统。 该系统能自动记录并实时显示老人的进出时间,方便管理人员及时了解每位老人的活动轨迹,同时具备强大的后台管理功能,支持管理员便捷地进行老人信息的增删改查操作。通

1069

[ARM 汇编]高级部分—ARM汇编编程实战—3.3.1 嵌入式系统的基本概念

嵌入式系统是一种特殊的计算机系统,通常用于执行特定的任务。它通常包含一个或多个微处理器、存储器和外围设备。与通用计算机系统相比,嵌入式系统具有体积小、功耗低、成本低和实时性强等特点。在这一部分,我们将介绍嵌入式系统的基本概念,并通过实例来展示如何在ARM汇编程序中应用这些概念。微处理器是嵌入式系统的核心部件,用于执行程序指令。ARM微处理器广泛应用于嵌入式系统领域,因为它具有低功耗、高性能和可扩展性等优势。

Andy0214的专栏 5977

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ARM处理器 寄存器 汇编指令集

寄存器 ARM微处理器共有37个32位寄存器,其中31个 为通用寄存器,6个为状态寄存器。但是这些寄 存器不能被同时访问,具体哪些寄存器是可以访 问的,取决ARM处理器的工作状态及具体的运行 模式。但在任何时候,通用寄存器R14~R0、程 序计数器PC、一个状态寄存器都是可访问的。 在ARM工作状态下,任一时刻可以访问16 个通用寄存器和一到两个状态寄存器。在 非用户模式(特

嵌入式学习小生! 1577

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ARM入门学习方法分享

ARM是Advanced RISC Machines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能、廉价、耗能低的RISC (精简指令集)处理器。通过掌握基本概念、学习汇编语言、使用开发工具、进行实践项目以及深入了解相关的硬件知识,你可以逐步掌握ARM架构并成为一个合格的ARM开发者。你可以查阅ARM的官方文档,了解ARM架构的细节,并参考一些在线教程和博客来学习其他开发者的经验和技巧。ARM,既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。

teach2004的博客 480

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

在ARM微处理器上实现Rijndael加密算法

在ARM微处理器上实现Rijndael加密算法 内容摘要:本文使用北京博创兴业科技有限公司研制的UP-NETARM300嵌入式开发板,在ARM SDT 2.51集成开发环境下,建立基于μC/OS-Il操作系统的工程文件,分别调用ARM汇编程序和C程序在嵌入式微处理器上实现了Rijndael算法,并比较了两者的效率。   引 言  2000年10月2日,美国国家标准局NIST宣布,比

激情成就梦想--关注移动互联网 916

ARM处理模式和部分处理指令

1、先介绍ARM的处理模式(7种) 用户模式(User):ARM处理器正常的程序执行状态  快速中断模式(FIQ):用于高速数据传输或通道处理  外部中断模式(IRQ):用于通用的中断处理  管理模式(Svc):操作系统使用的保护模式  数据访问中止模式(Abort):数据或指令预取终止时进入该模式,用于虚拟存储及存储保护  系统模式(System):运行具有特权的操作系统任务  未

qq_26460507的博客 378

ARM开发详解学习资源

ARM开发详解学习资源 去发现同类优质开源项目:https://gitcode.com/ 此仓库提供了《ARM开发详解.pdf》电子书籍的下载资源,该书详细介绍了ARM微处理器的各个方面,是嵌入式系统开发者和学习者宝贵的学习资料。 资源简介 《ARM开发详解》电子书涵盖以下内容: ARM微处理器概述:包括ARM的历史、应用领域、特点及微处理器系列介绍。 ARM微处理器的编程模型:涵盖工作状态、存...

gitblog_06759的博客 340

2024 微处理器与嵌入式系统设计(电子科技大学)

电子科大答案合集

HTTbluebowl的博客 1806

Android基础知识 —1.1-ARM汇编语言程序结构

ARM汇编程序语言主要包括段定义、注释与标号、汇编指令

qincheng168的博客 1243
上一篇: 【IPv6】IPv6编址方案
下一篇: 【IPv6】IPv6地址配置
TheSysy
博客等级 码龄5年 62粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值