跳转到主要内容

汇编语言

ARM汇编语言的程序结构

editor /

<strong>1、一个ARM汇编语言源程序的基本结构:</strong>

AREA Init, CODE, READONLY

ENTRY

Start

LDR R0, =0x3FF5000

LDR R1, 0xFF

STR R1, [R0]

LDR R0, =0x3FF5008

LDR R1, 0x01

STR R1, [R0]

... ... ... ... ... ...

END

在 ARM( Thumb)汇编语言程序中,以程序段为单位组织代码。

段是相对独立的指令或数据序列,具有特定的名称。段可以分为代码段和数据段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据。一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行的映象文件。

可执行映象文件通常由以下几部分构成:

— 一个或多个代码段,代码段的属性为只读。

— 零个或多个包含初始化数据的数据段,数据段的属性为可读写。

ARM汇编伪指令介绍

editor /

在ARM处理器汇编语言程序设计里,有一些特殊的指令助记符。这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊的指令助记符为伪指令,它们所完成的操作称为伪操作。

伪指令在源程序中的作用是为完成汇编程序做各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成了。在ARM处理器的汇编程序中,大体有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令及其他伪指令。

伪操作符可以分为以下几类。

<strong>1)数据定义伪操作符

数据定义伪操作符主要包括LTORG、MAP、DCB、FIELD、SPACE、DCQ、DCW等,主要用于数据表定义、文字池定义、数据空间分配等。常用的有DCB/DCQ/DCW分配一段字节/双字/字内存单元,并且将它们初始化。

<strong>2)符号定义伪操作符

符号定义伪操作符包括GBLA、GBLL、GBLS、LCLA、CN、CP、DN、FN、RLIST、SETA等,用于定义ARM汇编程序的变量,对变量进行赋值,以及定义寄存器名称等。其中用于全局变量声明的GBLA、GBLL、GBLS和局部变量声明的LCAL、LCLL、LCLS伪指令较为常用。

【下载】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指令;