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伪操作表示本源文件结束

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

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

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

零个或者多个不包含初始化数据的数据段,可读写(所有未初始化的变量,也就是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

如:

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一样,不同之处在于,如果当前文件没有引用该标号,该标号不会加入当前源文件的符号表中。

GETINCLUDE

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

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汇编程序基本知识的更多相关文章

  1. ARM汇编程序结构

    ARM汇编程序结构 一个ARM程序可以被划分为多个代码段和数据段,在汇编的时候这些段会被形成一个可执行文件 .text ;正文段,包含程序的指令代码 .data ;数据段,包含固定的数据,如常量,字符 ...

  2. ARM汇编程序中的伪指令

    转自http://blog.chinaunix.net/uid-13701930-id-336459.html 4.1 ARM汇编器所支持的伪指令 在ARM汇编语言程序里,有一些特殊指令助记符,这些助 ...

  3. 1.ARM的基础知识

    ARM简述 ARM公司既不生产芯片也不销售芯片,它只出售芯片技术授权.ARM技术具有很高的性能和功效,因而容易被厂商接受.同时,合作伙伴的增多,可获得更多的第三方工具.制造和软件支持,这又会使整个系统 ...

  4. ARM各种版本号知识以及型号的发展(三星为例)

    1.ARM型号的发展历史 2.单片机.工业上一般使用RTOS(实时操作系统),Linux.Android用在影音娱乐等对实时性要求没那么高的场合: 3.ARM内核版本号和Soc版本号是由ARM确定的, ...

  5. ARM指令集相关知识

    1.ARMv8引入了执行状态机制,分为AArch32和AArch64 AArch32为T32(Thumb)和A32(ARM). AArch64为A64一种指令集 A64和A32的指令都是32位宽,可以 ...

  6. ARM总线方面知识

    AMBA简介 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大.数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用.在基于IP复用的SoC设计中,片 ...

  7. ARM汇编程序闪烁灯与其反汇编代码比较

    /* *LED闪烁 *led.s */ #define GPJ0CON 0xE0200240 #define GPJ0DAT 0xE0200244 .global _start //把 _start ...

  8. ARM处理器基础知识

    1.ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 http://blog.chinaunix.net/uid-28458801-id-3494646.html 2.ARM的7种工作模式. ...

  9. ARM杂散知识

    画重点: 1.存储器格式:重点是大小端识别 经常考 2.对齐后结构体占用空间大小:使用aligned,packed,#pragma pack()三种方式都要会 Thumb指令集 Thumb指令集能够以 ...

随机推荐

  1. cut用法

    cut命令用来剪下文本文件里的数据,文本文件可以是字段类型或是字符类型. cut - remove sections from each line of files 语法 cut  OPTION... ...

  2. Adding Swagger to Web API project

    Adding Swagger to Web API project. All source code for this series can be found here. When you creat ...

  3. javascript设计模式简介

  4. 什么是FOUC?如何避免FOUC?///////////////////////////zzzz

     一个新的名词叫做 FOUC 浏览器样式闪烁,之前也听说过一些类似的东西,比如样式突变等等,但这东西竟然有学名的..什么是FOUC(文档样式短暂失效)?如果使用import方法对CSS进行导入,会导致 ...

  5. flask学习资源

    1.flask快速入门(视频) http://www.pythoner.cn/course/topic/flask-web-development/ 2.flask教程,开源中国 http://www ...

  6. IE7 float:left失效的解决方法

    <div id="a" style="width:500px"> <div id="b" style="widt ...

  7. ASP.NET 管道事件与HttpModule, HttpHandler简单理解

    BeginRequest 指示请求处理开始 AuthenticateRequest 封装请求身份验证过程 AuthorizeRequest 封装检查是否能利用以前缓存的输出页面处理请求的过程 Reso ...

  8. DDL、DML、DCL的理解

    1.DDL       1-1.DDL的概述                DDL(Data Definition Language 数据定义语言)用于操作对象和对象的属性,这种对象包括数据库本身,以 ...

  9. Swashbuckle for asp.net core 配置说明

    0x00 安装 Swashbuckle 6.0 打开程序包管理器控制台,输入: Install-Package Swashbuckle -Pre 0x01 配置 Startup.cs public v ...

  10. Linux 2.6内核Makefile浅析

    1 概述 Makefile由五个部分组成: Makefile:根目录Makefile,它读取.config文件,并负责创建vmlinux(内核镜像)和modules(模块文件). .config:内核 ...