跳转到主要内容

ARM

【下载】ARM汇编语言程序设计基础

kelly /

<strong>ARM汇编伪指令</strong>

<strong>伪操作、宏指令及伪指令的概念</strong>

伪操作是ARM汇编语言程序里的一些特殊指令助记符,主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在处理器运行期间由机器执行。

宏指令是一段独立的程序代码,它通过伪操作来定义。通过宏名来调用宏,并可以设置相应的参数。宏定义本身不会产生代码,只是在调用它时把宏体插入到源程序中。

伪指令也是ARM汇编语言程序里的特殊指令助记符,也不在处理器运行期间由机器执行,它们在汇编时将被合适的机器指令代替成ARM或Thumb指令从而实现真正指令操作。

<strong>伪操作</strong>

符号定义(Symbol Definition) 伪操作

内存分配(数据定义)(Data Definition) 伪操作

汇编控制(Assembly Control) 伪操作

其他 (Miscellaneous) 伪操作

ARM中C语言和汇编语言混合编程

kelly /

在嵌入式系统开发中,目前使用的主要编程语言是C 和汇编,虽然C++已经有相应的编译器,但是现在使用还是比较少的。

在稍大规模的嵌入式程序设计中,大部分的代码都是用C来编写的,主要是因为C语言具有较强的结构性,便于人的理解,并且具有大量的库支持。但对于一写硬件上的操作,很多地方还是要用到汇编语言,例如硬件系统的初始化中的CPU 状态的设定,中断的使能,主频的设定,RAM控制参数等。另外在一些对性能非常敏感的代码块,基于汇编与机器码一一对应的关系,这时不能依靠C编译器的生成代码,而要手工编写汇编,从而达到优化的目的。汇编语言是和CPU的指令集紧密相连的,作为涉及底层的嵌入式系统开发,熟练对应汇编语言的使用也是必须的。

单纯的C或者汇编编程请参考相关的书籍或者手册,这里主要讨论C和汇编的混合编程,包括相互之间的函数调用。下面分四种情况来进行讨论,不涉及C++语言。

<strong>一、在C语言中内嵌汇编</strong>

在C中内嵌的汇编指令包含大部分的ARM和Thumb指令,不过使用与单纯的汇编程序使用的指令略有不同,存在一些限制,主要有下面几个方面:

a 不能直接向PC 寄存器赋值,程序跳转要使用B或者BL指令;

ARM64架构下地址翻译相关的宏定义

kelly /

作者:linuxer

来源:<a href="http://www.wowotech.net/memory_management/arm64-memory-addressing.html"…

<strong>一、前言</strong>

本文主要分析linux-4.4.6/arch/arm64/include/asm目录下的若干和地址翻译相关的头文件(例如page.h、pgtable.h、pgtable-hwdef.h、pgtable-prot.h等文件)中的各种宏定义以及相关的ARM64硬件知识。硬肯ARM ARM文档有时候太费劲,结合linux源代码会让学习变得简单一些。

<strong>二、ARM64地址翻译概述</strong>

ARM64定义了若干个translation regimes,下面的每一行地址翻译过程都是一个translation regimes:

ARM中异常中断问题分析总结

kelly /

一、ARM中异常中断的类型:

异常中断名称 含义 复位(Reset)

当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行。复位异常中断通常用在下面几种情况:

1、系统加电时

2、系统复位时

3、跳转到复位中断向量处执行,称为软复位

未定义的指令 当ARM处理器或者是系统中协处理器认为当前指令未定义时,产生未定义指令异常中断。可以通过该异常中断机制仿真浮点向量运算。

软件中断

(software interrupt SWI)

这是一个由用户定义的中断指令。可以用于用户模式下程序调用特权操作指令。在实时操作系统(RTOS)中可以通过该机制实现系统功能调用

指令预取中止

(Prefech Abort)

如果处理器预取指令的地址不存在,或者该地址不允许当前指令访问,当该被预取的指令执行时,处理器产生指令预取中止异常中断

数据访问中止

(Data Abort)

ARM中LDR伪指令与LDR加载指令

kelly /

ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。

LDR伪指令的形式是“LDR Rn,=expr”。下面举一个例子来说明它的用法。

COUNT EQU 0x40003100

……

LDR R1,=COUNT

MOV R0,#0

STR R0,[R1]

COUNT是我们定义的一个变量,地址为0x40003100。这中定义方法在汇编语言中是很常见的,如果使用过单片机的话,应该都熟悉这种用法。

LDR R1,=COUNT是将COUNT这个变量的地址,也就是0x40003100放到R1中。

MOV R0,#0是将立即数0放到R0中。最后一句STR R0,[R1]是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。实际就是将0放到地址为0x40003100的存储单元中去。可 见这三条指令是为了完成对变量COUNT赋值。用三条指令来完成对一个变量的赋值,看起来有点不太舒服。这可能跟ARM的采用RISC有关。

下面还有一个例子

;将COUNT的值赋给R0

LDR R1,=COUNT

元器件选择须以应用为依归 8/32位MCU各擅胜场

kelly /

正如汽车代替了马车,电子邮件代替了普通邮件一样,32位微控制器(MCU)让8位MCU变得黯然失色。尽管未来8位MCU朝向32位MCU发展将会成为现实,但目前还没那么容易实现。事实证明8位MCU和32位MCU仍是互补的技术,在一些方面各有千秋,而在其它方面的表现却同样出色。这其中的窍门在于厘清何种应用适合哪种MCU架构。

本文比较了8位MCU和32位MCU的使用案例,可作为如何选择这两种MCU架构的指南使用。

本文大部分32位范例将关注于ARM Cortex-M装置,Cortex-M在不同MCU供货商产品组合中表现非常相似。由于8位MCU有很多种架构,所以很难对8位供货商之间进行类似的产品比较。为了进行比较,本文将使用广泛应用、易于理解的8051 8位架构。

事实上,“ARM Cortex和8051哪个比较好”不是个逻辑问题,反而像是在问“吉他和钢琴哪个好”?真正要解决的问题是“哪种MCU最能帮助解决目前面临的问题?”。

不同的任务须使用不同的工具,使用者目的是要了解“如何才能善用所拥有的工具”,包括8位和32位装置。

对不同的装置进行比较,须要对其进行测量。有很多建构工具可供选择,本文尽量选择一些认为能够进行最公平的比较,且最能代表开发人员真实体验的情境。

ARM工作模式

kelly /

<strong>一、存储器格式(字对齐):</strong>

Arm体系结构将存储器看做是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字(32位)数据,从第四个字节到第七个字节放置第二个存储的字数据,一次排列。作为32位的微处理器,arm体系结构所支持的最大寻址空间为4GB。

存储器格式

1、大端格式:高字节在低地址,低字节在高地址;

2、小端格式:高字节在高地址,低字节在低地址;

指令长度:

Arm微处理器的指令长度是32位的,也可以为16位(thumb状态下)。Arm微处理器中支持字节(8位),半字(16位),字(32位)三种数据类型,其中,字需要4字节对齐,半字需要2字节对齐。
注:所谓的指令长度是一条完整的指令的长度,而不是单纯的mov这3个字母长度

<strong>二、ARM体系的CPU有两种工作状态</strong>

1、ARM状态:处理器执行32位的字对齐的ARM指令;

2、Thumb状态:处理器执行16位的、半字对齐的Thumb指令;

如何从零开始利用ARM微控制器相应资源

kelly /

<strong>1 – 总览</strong>

对于一个 ARM 微控制器的初学者来说,有时候要找到一些有用的设计参考信息是非常困难的一件事。因为在网上实在有太多资源了,最先遇到的困难可能就是能不能找到一个地方帮助你正确选择一款 ARM 的处理器 ,目前,主要有两种 ARM 处理器:

应用处理器 Application processors – 这些都是能跑操作系统的,比如 Linux 呀, Windows RT 啥的。典型应用就是智能手机,移动计算设备甚至服务器。 推荐用 ARM Cortex-A 系列处理器

嵌入式处理器 Embedded processors – 比较典型的包括微控制器产品,以及其他广泛的嵌入式系统。目前在微控制器市场最流行的是 ARM Cortex-M 处理器系列 ,而 Cortex-R 处理器系列常用于专用控制器,比如硬盘驱动,汽车应用以及 基带控制等。

当然最近几年来,基于 Cortex-A 的微控制器也逐渐多起来了。这些微控制器可以跑 Linux 或者 Android 。和传统的模块化电脑 COM ( computer-on-module )相比, 成本降低了很多 。

ARM、MCU、DSP、FPGA、SOC选择的区别在哪里?

Lee_ /

科技的发展,身边的智能产品越来丰富,扫地机器人、手机、VR、穿戴设备及车载仪表、导航仪等,这些产品都具备个智能的“芯”,今天,主要介绍这些“芯”的特点与联系。

<strong>ARM</strong>

ARM处理器是Acorn计算机有限公司面向低预算市场设计的第一款RISC微处理器。更早称作Acorn RISC Machine。ARM处理器本身是32位设计,但也配备16位指令集,一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势。20世纪90年代,ARM 32位嵌入式RISC(Reduced lnstruction Set Computer)处理器扩展到世界范围,占据了低功耗、低成本和高性能的嵌入式系统应用领域的领先地位。ARM公司既不生产芯片也不销售芯片,它只出售芯片技术授权。

ARM的9种寻址方式

editor /

本文介绍ARM的9种寻址方式,基础知识,需要牢固掌握,快来看一下吧。

<strong> ARM的9种寻址方式</strong>

<strong> 1)立即寻址</strong>

操作数是立即数,以“#”为前缀,表示 16 进制数值时以“0x”表示。

例:

MOV R0,#0xFF00 ;0xFF00 -> R0

SUBS R0,R0,#1 ;R0 – 1 -> R0

<strong> 2)寄存器寻址</strong>

操作数的值在寄存器中,指令执行时直接取出寄存器值操作。

例:

MOV R1,R2 ;R2 -> R1

SUB R0,R1,R2 ;R1 - R2 -> R0

<strong> 3)寄存器偏移寻址</strong>

当第二操作数是寄存器偏移方式时,第二个寄存器操作数在与第一个操作数结合之前,选择进行移位操作。

例:

MOV R0,R2,LSL #3 ;R2 的值左移 3 位,结果放入 R0,即 R0 = R2 * 8