您的位置 首页 主动

ARM汇编程序基本知识

1汇编程序的基本组成ARM汇编语言程序中,程序是以程序段为单位组织代码的。段是相对独立的指令或者代码序列,拥有特定的名称。段的种类有

1.汇编程序的根本组成

ARM汇编语言程序中,程序是以程序段为单位安排代码的。段是相对独立的指令或许代码序列,具有特定的称号。段的品种有代码段、数据段和通用段,代码段的内容为履行代码,数据段寄存代码运转时需求用到的数据,通用段不包含用户代码和数据,一切通用段共用一个空间。段运用AREA伪操作来界说,而且阐明相关特点,如

代码段界说

AREA Init, CODE, READONLY

数据段界说

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

……

一个汇编程序至少应该有一个代码段,能够有零或许多个数据段。在格局上,一个汇编程序需求至少有一个ENTRY(关于ENTRY详细内容看伪操作符ENTRY),还需求在汇编源文件完毕处,写上END表明该源文件的完毕。

如一个根本的汇编源程序

AREA Init, CODE, READONLY ;界说一个代码段

ENTRY ;符号程序进口点

StartLDR 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 ;操作助记符前面有必要有空格

DATASETA,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

DATASETA 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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/256010.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部