ARM汇编程序基本知识

发布者:灵感驿站最新更新时间:2015-08-24 来源: eefocus关键字:ARM  汇编程序  基本知识 手机看文章 扫描二维码
随时随地手机看文章

1.汇编程序的基本组成

ARM汇编语言程序中,程序是以程序段为单位组织代码的。段是相对独立的指令或者代码序列,拥有特定的名称。段的种类有代码段、数据段和通用段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据,通用段不包含用户代码和数据,所有通用段共用一个空间。段使用AREA伪操作来定义,并且说明相关属性,如

代码段定义

      AREA Init, CODE, READONLY

      …

数据段定义

      AREA Stack1,DATA,READWRITE,NOINIT,ALIGN=3

      ……

一个汇编程序至少应该有一个代码段,可以有零或者多个数据段。在格式上,一个汇编程序需要至少有一个ENTRY(关于ENTRY具体内容看伪操作符ENTRY),还需要在汇编源文件结束处,写上END表示该源文件的结束。

如一个基本的汇编源程序

            AREA Init, CODE, READONLY ;定义一个代码段

            ENTRY ;标记程序入口点

Start    LDR R0,0x3FF5000 ;标号Start可以要,也可以不要

            LDR R1,0Xff

            STR R1,[R0]

            LDR R0,=0x3FF5000

            LDR R1,0x01

            STR R1,[R0]

            ……

            END ;END伪操作表示本源文件结束

当汇编程序较长时,可以分割为多个代码段和多个数据段,多个段在程序编译链接时,最终形成一个可执行的映像文件。一个可执行映像文件通常由以下几部分组成

clip_image001 一个或者多个代码段,代码段属性为只读(只读数据也放在代码段?RO)

clip_image001[1] 零个或者多个初始化数据的数据段,可读写(存放初始化了的变量数据,RW)

clip_image001[2] 零个或者多个不包含初始化数据的数据段,可读写(所有未初始化的变量,也就是ZI)

链接器根据系统默认或者用户设定的规则,将各段安排在存储器中的相应位置,因此源程序中段之间的相对位置与可执行映像文件中的段的相对位置一般不会相同。

2.汇编语句应该注意的地方

汇编语句格式

[LABEL] OPERATION, [OPERAND], [;COMMENT]

LABEL必须在一行的开头写。

OPERATION包括指令、伪操作、宏指令或伪指令。每一条操作助记符必须全部大写或者全部小写。在写操作助记符前,必须有空格。

OPERAND 表示操作的对象,可以使常量、变量、标号、寄存器或者表达式,不同的对象之间必须用逗号分开。

例子:

            AREA EX2,CODE,READONLY ;操作助记符前面必须有空格

            GBLA DATA ;操作助记符前面必须有空格

DATA    SETA,0x20 ;变量名DATA前面不能留空格

            ADD R0,R1,R2

            ADD R0,R1,r2

            add R0,R1,r2

            Add R0,R1,r2 ;寄存器小写正确,指令助记符大小写混合错误

3.常用符号

汇编语言中,经常使用各种符号表示变量、常量和地址。

变量的定义:使用伪操作GBLA、GBLL、GBLS,分别是定义全局的数值变量、逻辑变量和字符变量;LCLA、LCLL、LCLS定义局部的数值变量、逻辑变量和字符变量。相应的变量使用SETA、SETL、SETS来进行赋值。注意字符串长度不应超过512个字节。

例子:

            GBLA DATA

DATA    SETA 0x20

            LCLS str1

            str1 SETS “PEN”

            LCLL lc

            lc SETL {TRUE}

常量是在运行过程中不能改变的量。ARM支持数值常量、逻辑常量和字符串常量。汇编中使用EQU来定义一个数值常量,如

Test EQU 10; 定义标号Test的值为20.

Addr EQU 0x55,CODE32;

关于EQU的具体使用,看伪操作EQU。

数值常量一般为32为的整数,可以使十进制、十六进制,也可以是n进制(n=2~9)如8_247是一个八进制数。

4.常见的伪操作符

符号定义伪操作

GBLA、GBLL、GBLS

LCLA、LCLL、LCLS

SETA、SETL、SETS

RLIST

其中RLIST用来定义通用寄存器列表名称,使用该伪操作定义的名称可以在ARM指令LDM/STM中使用。在LDM/STM中,访问列表中的寄存器次序为寄存器编号由低到高的顺序。如

RegList RLIST {r0-r5,r8,r10}; 将寄存器列表名称定义为RegList

在程序中使用

STMFD SP!, RegList ;存储列表到堆栈

LDMIA R5, RegList ; 加载列表

数据定义伪操作

DCB 分配一片连续的字节存储单元并初始化

DCW(DCWU) 分配一片连续的半字存储单元并初始化

DCD(DCDU) 分配一片连续的字存储单元并初始化

DCDO、DCI、DCQ(DCQU)

DCFS(DCFSU) 为单精度浮点数分配一片连续的字存储单元并初始化

DCFD(DCFDU) 为双精度浮点数分配一片连续的字存储单元并初始化

SPACE 分配一片连续的存储单元

FIELD、MAP、LTORG[page]

如:

Str DCB “this is a test” ;分配一片连续的字节存储单元并初始化

Data DCW 1,2,3 ;分配一片连续的半字存储单元并初始化

Data DCD 4,5,6 ; 分配一片连续的字存储单元并初始化

Fdata DCFS 2e5,-5e-7 ;分配一片连续的字存储单元并初始化为指定的单精度数

Dspce SPACE 100 ;分配连续100字节的存储单元并初始化为0

控制伪操作

IF ELSE ENDIF

WHILE WEND

MACRO MEND;MEXIT

信息报告伪操作

ASSERT

INFO

OPT

其他常用伪操作

AREA ALIGN CODE16/CODE32 ENTRY END EQU EXPORT(GLOBLE) IMPORT EXTERN GET(INCLUDE) INCBIN RN ROUT

AREA

格式:AREA 段名 属性1,属性2,……

常用属性有:

CODE :用于定义代码段,默认为READONLY

DATA: 定义数据段,默认为READWRITE

READONLY: 指定本段为只读

READWRITE: 指定本段为读写

ALIGN: 使用方式为ALIGN表达式。在默认时,ELF(可执行链接文件)的代码段和数据段是按字对齐的。表达式的取值范围为0~31,相应的对齐方式为2次幂。

COMMON: 定义一个通用的段,不包含任何用户的代码和数据。各源文件中同名的COMMON段共享同一段存储单元。

ALIGN

格式:ALIGN [表达式[,偏移量]]

ALIGN伪操作可通过添加填充字节的方式,使当前位置满足一定的对齐方式。

例:

            ……

DATA1  DCB “STRIN” ; 定义后不能保证地址对齐

            ALIGN 4 ;确保当前地址是4字节对齐

            ……

例:

            AREA Cache, CODE, ALIGN=3 ; 指定本代码段的指令时23=8字节对齐的

            ……

            MOV PC, LR ;程序跳转后是4字节对齐,返回后需要继续8字节对齐

            ALIGN 8 ;当前位置再次满足8字节对齐

            ……

注意上面,在AREA中使用和单独使用ALIGN的区别,格式和计算方式不一样。

ENTRY

用于指定汇编程序的入口点。一个程序可以由一个或者多个源文件组成,一个源文件由一个或者多个程序段组成。一个程序至少有一个入口点,也可有多个入口点,但是在一个源文件中,最多只能有一个ENTRY。当有多个ENTRY时,程序的真正入口点由链接器指定。编译程序在编译连接时根据程序入口点进行连接。在只有一个入口点时,编译程序会把这个入口点的地址定义为系统复位后的程序起始点。

END

在源文件结束处写上,表示源程序的结尾。

EXPORT

格式:EXPORT 标号 [,WEAK]

声明一个全局标号,该标号在其他文件中可引用。WEAK表示碰上其他同名标号时,其他标号优先。

            AREA INIT, CODE, READONLY

            EXPORT Stest

            ……

            END

IMPORT

格式:IMPORT 标号 [,WEAK]

表示该引用的标号在其他源文件中,但要在当前文件中引用。WEAK表示找不到该标号时,也不报错,一般讲该标号值置为0,如果是B或者BL使用到,则该指令置为NOP。

与EXTERN的不同的是,无论当前文件是否引用该标号,该标号都被加入当前源文件的符号表中。

            AREA INIT, CODE, READONLY

            IMPORT MAIN;

            ……

            END

EXTERN

和IMPORT一样,不同之处在于,如果当前文件没有引用该标号,该标号不会加入当前源文件的符号表中。

GET(或INCLUDE)

将一个源文件包含到当前的源文件中,并在当前位置进行编译。

            AREA INIT, CODE, READONLY

            GET a1.s

            GET C:/a2.s

            ……

            END

INCBIN

将一个目标文件或者数据文件包含到当前,文件内容被原封不动的放在当前位置,编译器不对文件内容进行编译。

            AREA INIT, CODE, READONLY

            GET a1.s ; 包含a1.s并且对a1.s进行编译

            INCBIN C:/d.txt ; 包含d.txt,不对内容进行编译

            GET a2.s ; 包含a2.s,并对内容进行编译

            END

RN

给一个寄存器定义一个别名。

Temp RN, R0 ; 将R0定义一个别名 Temp

关键字:ARM  汇编程序  基本知识 引用地址:ARM汇编程序基本知识

上一篇:stm32 堆栈分配
下一篇:stm32内存分配

推荐阅读最新更新时间:2024-03-16 14:29

关于ARM架构与x86的概述以及应用的全面解析
x86概述 X86是由Intel推出的一种复杂指令集,用于控制芯片的运行的程序,现在X86已经广泛运用到了家用PC(机箱+xx主板+xx电源+xx处理器+(光驱选装)的领域。 x86架构于1978年推出的Intel 8086中央处理器中首度出现,它是从Intel 8008处理器中发展而来的,而8008则是发展自Intel 4004的。8086在三年后为IBM PC所选用,之后x86便成为了个人计算机的标准平台,成为了历来最成功的CPU架构。 x86架构是重要地可变指令长度的CISC(复杂指令集计算机,Complex InstrucTIon Set Computer)。字组(word, 4字节)长度的存储器访问允许不对齐存储
[单片机]
关于<font color='red'>ARM</font>架构与x86的概述以及应用的全面解析
ARM、ST与MATHWORKS携手实现支持STM32 MCU代码生成等功能
ARM与意法半导体(STMicroelectronics)携手宣布首款配合MATLAB和 Simulink支持ARM® Cortex™-M系统的Embedded Coder已上市。 意法半导体与ARM的合作项目获得MathWorks的全面支持,使软件开发人员能够在MATLAB和Simulink环境中开发算法,然后在处理器在环(PIL)仿真中编译目标,集成、调试和测试这些模型。Embedded Coder生成的C代码运行于STM32评估板上,Keil™微控制器开发套件(MDK-ARM™)的调试器与Simulink直接交互,进一步简化了代码集成过程。 意法半导体微控制器产品部总经理Michel Buffa表示:“基于消费者对MATL
[单片机]
S3c2440ARM异常与中断体系详解1---概念引入与处理流程
取个场景解释中断。 假设有个大房间里面有小房间,婴儿正在睡觉,他的妈妈在外面看书。 问:这个母亲怎么才能知道这个小孩醒? 过一会打开一次房门,看婴儿是否睡醒,让后接着看书 一直等到婴儿发出声音以后再过去查看,期间都在读书 第一种 叫做查询方式: *优点:简单 *缺点: 累 写程序如何: while(1) { 1 read book(读书) 2 open door(开门) if(睡) return(read book) else 照顾小孩 } 第二种叫中断方式: 优点:不累 缺点:复杂 写程序: while(1) { read book 中断服务程序()//如何
[单片机]
S3c2440<font color='red'>ARM</font>异常与中断体系详解1---概念引入与处理流程
基于ARM LPC2214的在线式UPS硬件设计
   1 概 述   目前UPS主要发展方向有两个:一是新的功能不断加强,例如增加远程监视、自动诊断、识别、事件记录、故障警告等功能;二是自身效率的提高。采用高效率的IC芯片和新的制造工艺,使空载功耗不断地降低,功率密度进一步提高。紧凑密集的空间设计给小型电子设备的应用带来了新的解决方案。   将功能强大的嵌入式微处理器(本文选用LPC2214)系统引入UPS,可以增强UPS的功能,使其具有网络化、智能化的特性,满足许多无人职守基站的用电要求。用数字控制代替模拟控制,可以消除温漂、老化等模拟器件存在的问题;抗干扰能力强,有利于参数整定和调节;通用性强,便于通过改变程序软件方便地调整方案和实现多种新型控制策略;同时高度集成的数字
[电源管理]
ARM7 LPC2378 远程升级----扇区
这里有个时间概念,大家先了解一下:LPC2378单个 Flash 扇区或整个芯片擦除的时间为 400ms,256 字节编程的时间为 1ms,对IAP的操作时间有个大概的了解。 再回到扇区,扇区数:有些 IAP 和 ISP 命令根据“扇区”进行操作并指定扇区数。下图列出了 LPC2300 系列器件的扇区数和存储器地址之间的对应关系,这些器件包括含 64KB、 128KB、 256KB 和512KB Flash 的器件在内。 IAP、 ISP 和 RealMonitor 程序都位于 boot 区。 boot 区位于所有器件中地址 0x0007 E000 到 0x0007 FFFF 处。 ISP 和 IAP 命令不允许对 boo
[单片机]
<font color='red'>ARM</font>7 LPC2378 远程升级----扇区
GNU ARM 汇编指令
第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点(www.gnu.org)上下载有关规范。 一. Linux汇编行结构 任何汇编行都是如下结构: ]] 每一个段以段名为开始, 以下一个段名或者文件结尾为结束。这些段都有缺省的标志(flags),连接器可以识别这些标志。(与armasm中的AREA相同)。 下面是ELF格式允许的段标志 标志 含义 a 允许段 w 可写段 x 执行段 【例3】定
[单片机]
STM32的一些基本知识总结
Cortex-M3缩略语 AMBA:先进单片机总线架构 ADK:AMBA设计套件 AHB:先进高性能总线 AHB-AP:AHB访问端口 APB:先进外设总线 ARM ARM:ARM架构参考手册 ASIC:行业领域专用集成电路 ATB :先进跟踪总线 BE8:字节不变式大端模式 CPI:每条指令的周期数 DAP:调试访问端口 DSP:数字信号处理(器) DWT:数据观察点及跟踪 ETM:嵌入式跟踪宏单元 FPB:闪存地址重载及断点 FSR:fault状态寄存器 HTM:Core Sight AHB跟踪宏单元 ICE:在线仿真器 IDE:集成开发环境 IRQ:中断请求(通常是外中断请求) ISA:指令系统架构 ISR:中断服务例程 I
[单片机]
STM32的一些<font color='red'>基本知识</font>总结
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved