《ARM程序设计基础课件.ppt》由会员分享,可在线阅读,更多相关《ARM程序设计基础课件.ppt(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、ARM程序设计基础ARM程序设计基础程序设计基础 1.伪操作和伪指令伪操作和伪指令2.ARM汇编语言语句格式汇编语言语句格式3.ARM汇编语言的程序格式汇编语言的程序格式4.相关的程序示例相关的程序示例 1 伪指令、伪操作和宏指令概念伪指令、伪操作和宏指令概念n 伪指令伪指令是汇编语言程序里的特殊指令助记符,是汇编语言程序里的特殊指令助记符,在汇编时被合适的机器指令替代。在汇编时被合适的机器指令替代。n 伪操作伪操作为汇编程序所用,在源程序进行汇编为汇编程序所用,在源程序进行汇编时由汇编程序处理,只在汇编过程起作用,不参与时由汇编程序处理,只在汇编过程起作用,不参与程序运行。程序运行。n 宏指
2、令宏指令通过伪操作定义的一段独立的代码。通过伪操作定义的一段独立的代码。在调用它时将宏体插入到源程序中。在调用它时将宏体插入到源程序中。也就是常说的也就是常说的宏宏。说明:说明:所有的伪指令、伪操作和宏指令,均与所有的伪指令、伪操作和宏指令,均与具体的开发工具中的编译器有关,当前主要采用具体的开发工具中的编译器有关,当前主要采用ARM公司的公司的“ADS/SDT IDE”开发工具,所以后开发工具,所以后面的讨论,均是基于面的讨论,均是基于ARM公司的开发工具。公司的开发工具。2 ARM汇编伪指令汇编伪指令 ARM伪指令不属于伪指令不属于ARM指令集中的指令,指令集中的指令,是为了编程方便而定义
3、的。伪指令可以像其是为了编程方便而定义的。伪指令可以像其它它ARM指令一样使用,但在编译时这些指令指令一样使用,但在编译时这些指令将被等效的将被等效的ARM指令代替。指令代替。ADR小范围的地址读取小范围的地址读取ADR伪指令功能:伪指令功能:将基于将基于PC相对偏移的地址值或相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。基于寄存器相对偏移的地址值读取到寄存器中。ADR伪指令功能的实现方法:伪指令功能的实现方法:在汇编编译器编译在汇编编译器编译源程序时,源程序时,ADR伪指令被编译器替换成一条合适的伪指令被编译器替换成一条合适的指令。通常,编译器用一条指令。通常,编译器用一条AD
4、D指令或指令或SUB指令来指令来实现此实现此ADR伪指令的功能,若不能用一条指令实现,伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。则产生错误,编译失败。语法格式:语法格式:ADRcond register,expr其中:其中:nregister:加载的目标寄存器。:加载的目标寄存器。nexpr:地址表达式。:地址表达式。n例例1:(0 x20)ADR R1,Delay Delay(0 x64)MOV R0,R14 使用使用ADR将程序标号将程序标号Delay所表示的地址存入所表示的地址存入R1。编译后的反汇编代码:编译后的反汇编代码:ADD R1,PC,#0 x3C MOV R0
5、,R14 PC+0 x3C=0 x20+0 x08+0 x3C=0 x64四、四、NOP空操作伪指令空操作伪指令NOP伪指令功能实现方法:伪指令功能实现方法:在汇编时将被替代在汇编时将被替代成成ARM中的空操作,比如可能是中的空操作,比如可能是“MOV R0,R0”指令等。指令等。用途:用途:NOP可用于延时操作。可用于延时操作。语法格式:语法格式:NOP例:延时子程序例:延时子程序 Delay NOP ;空操作空操作 NOP NOP SUBS R1,R1,#1 ;循环次数减循环次数减1 BNE Delay MOV PC,LR符号定义伪指令符号定义伪指令n符号定义(Symbol Definit
6、ion)伪指令用于定义ARM 汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。n常见的符号定义伪指令n用于定义全局变量的GBLA、GBLL 和GBLS。用于定义局部变量的LCLA、LCLL 和LCLS。用于对变量赋值的SETA、SETL、SETS。符号定义伪指令符号定义伪指令n1、GBLAn语法格式:GBLA(GBLL 或GBLS)全局变量名nGBLA伪指令用于定义一个ARM程序中的全局变量,并将其初始化。nGBLA伪指令用于定义一个全局的数字变量,并初始化为0;nGBLA Test1;定义一个全局的数字变量,变量名为Test1nTest1 SETA 0 xaa;将该变量赋值为0 xa
7、a符号定义伪指令符号定义伪指令n2、LCLAn语法格式:LCLA(LCLL 或LCLS)局部变量名nLCLA伪指令用于定义一个ARM 程序中的局部变量,并将其初始化。nLCLA伪指令用于定义一个局部的数字变量,并初始化为0;n由于是用于声明局部变量,在其作用范围内变量名必须唯一。nLCLA Test4;声明一个局部的数字变量,变量名为Test4nTest4 SETA 0 xaa;将该变量赋值为0 xaa符号定义伪指令符号定义伪指令n3、SETAn语法格式:变量名 SETA(SETL 或SETS)表达式nSETA伪指令用于给一个数学变量赋值;nLCLA Test3;声明一个局部的数字变量,变量名
8、为Test3nTest3 SETA 0 xaa;将该变量赋值为0 xaa数据定义伪操作nSPACE:分配一块内存单元,并用0初始化。nMAP:定义一个结构化的内存表的首地址。nFIELD:定义结构化内存表中的一个数据域。nDCB:分配一段字节内存单元,并初始化。nDCD:分配一段字内存单元,并初始化。nSPACE也可以用符号“%”表示n用于分配一块连续的内存单元供程序使用,并且将这个内存单元的内容初始化为0。n语法格式:n label SPACE exprn或 label%exprn其中:nlabel:是一个标号,可选项。nexpr:数值表达式,用来规定内存单元的字节数。n例:ndata1 S
9、PACE 256;定义大小为256字节的数据区nMAP、FIELDn使用MAP和FIELD伪操作描述数据结构。nMAP用于定义数据结构的起始地址;nFIELD用于定义结构中的字段(各数据域的字节长度),并可为每一个数据域指定一个标号,其它指令可引用此标号。n注:nMAP和FIELD伪操作只是定义数据结构并不实际分配内存单元。n(1)MAP 也可以用符号”表示n语法格式:n MAP expr ,base-registern或 expr ,base-registern其中:nexpr:数据表达式或程序中的标号(使用MAP之 前已定义)。n base-register:基址寄存器n若指令中没有此项时
10、,expr为结构的首地址。(基于绝对地址的数据结构)n若指令中包含此项时,expr+base-register的和为结构首地址。(基于相对地址的数据结构)n例:nMAP 0 xC0008 ;数据结构存放的起始地址是0 xC0008n datalabel+64 ;数据结构存放的起始地址是datalabel+64 ;(datalabel已定义过)n MAP 0 x10,R9 ;数据结构存放的起始地址是R9中存放的数值加上0 x10 n(2)FIELD 也可以用符号”#”表示n用户定义数据结构中的字段。n语法格式:label FIELD expr或 label#exprn其中:nlabel:字段的名
11、称(地址标号)。nexpr:此字段在数据结构中所占的字节数。n由MAP和FIELD伪操作配合定义的数据结构n例基于绝对地址首地址固定MAP 0 x200 ;内存的首地址为0 x200 a FIELD 4 ;字段a长度为4,相对位置为0b FIELD 4 ;字段b长度为4,相对位置为4x FIELD 8 ;字段x长度为8,相对位置为8y FIELD 8 ;字段y长度为8,相对位置为16s FIELD 16 ;字段s长度为16,相对位置为24引用结构中的数据:LDR R0,bn4、DCB也可以用符号”=”表示n用于定义并且初始化一个或者多个字节的内存区域。n语法格式:label DCB expr,
12、expr或 label =expr,exprn例:nshort DCB 1 ;为short分配了一个字节,并初始 化为1。nstring DCB “string”,0 ;构造一个以0结尾的字 符串 n5、DCDnDCD 也可以用符号”&”表示n用于分配一段字内存单元(分配的内存单元都是字对齐的)并初始化。n语法格式:label DCD expr,expr或 label&expr,exprn例:ndata1 DCD 2,4,6 ;为data1分配三个字,内容初始化为2,4,6ndata2 DCD label+4;初始化data2为label+4对应的地址汇编控制伪操作nIF,ELSE及ENDIF
13、nIF,ELSE及ENDIF伪操作能够根据条件把一段源代码包括在汇编语言程序内或者将其排除在程序之外。n“是IF伪操作的同义词n“|“是ELSE伪操作的同义词n“”是ENDIF伪操作的同义词n语法格式:nIF logic expression;logic expression控制选择逻辑表达式 n ;指令或伪指令代码段1nELSE ;可选n ;指令或伪指令代码段2nnENDIFn例:nIF Variable=16 ;如果Variable=16成立,则编译下面代码 n BNE SUB1n LDR R0,=SUB0n BX R0nELSE ;否则编译下面代码n BNE SUB0n LDR R0,=
14、SUB0n BX R1nENDIF 其他常用的伪操作 uAREAuCODE16、CODE32uENTRYuENDuEQUuIMPORTuGET(或(或INCLUDE)AREA语法格式:AREA 段名段名 属性属性1,属性,属性2,定义一个代码段或数据段。常用的属性如下:CODE:用于定义代码段,默认为READONLY。DATA:用于定义数据段,默认为READWRITE。READONLY:指定本段为只读,代码段默认为READONLY。READWRITE:指定本段为可读可写,数据段的默认属性为READWRITE。示例:AREA Example,CODE,READONLY;codeCODE16、CO
15、DE32语法格式:CODE16(或(或CODE32)CODE16:其后的指令序列为16位的Thumb指令。CODE32:其后的指令序列为32位的ARM指令。示例:AREA ChangeState,CODE,READONLYCODE32;指示下面的指令为指示下面的指令为ARM指令指令Star1LDRr0,=start+1BXr0;切换到;切换到Thumb状态,并跳转到状态,并跳转到start处执行处执行CODE16;指示下面的指令为;指示下面的指令为Thumb指令指令start MOV r1,#10ENTRY语法格式:ENTRYENTRY伪操作用于指定汇编程序的入口点。在一个源文件里最多只能有一
16、个ENTRY(可以没有)。在一个完整的汇编程序中至少要有一个ENTRY(当有多个当有多个ENTRY时,程序的真正入口点由链接器指定时,程序的真正入口点由链接器指定)。示例:AREA example,CODE,READONLYENTRY;应用程序的入口点;应用程序的入口点 END 语法格式:ENDEND伪指令用于通知编译器已经到了源程序的结尾。示例:AREA example,CODE,READONLYEND n2、EQU 也可以用符号”*”表示nEQU伪操作为数字常量、基于寄存器的值和程序中的标号定义一个字符名称。n语法格式:name EQU expr,typen其中:nexpr:基于寄存器的地
17、址值、程序中的标号、32位的地址常量或者32位的常量。nname:为expr定义的字符名称。ntype:当expr为32位常量时,可以使用type指示expr的数据的类型。取值为:nCODE32nCODE16nDATAn例:abcd EQU 2 ;定义abcd符号的值为2 abcd EQU label+16 ;定义abcd符号的值为(label+16)abcd EQU 0 x1c,CODE32 ;定义abcd符号的值为绝对地址 ;值0 x1c,而且此处为ARM指令IMPORT 语法格式:IMPORT标号标号WEAK 用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用。示例:
18、AREA Init,CODE,READONLY IMPORTMain ;通知编译器当前文件要引用标号;通知编译器当前文件要引用标号Main,但,但Main在其他源文件中定义在其他源文件中定义 END GET(或INCLUDE)语法格式:GET 文件名文件名用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET。使用方法与C语言中的“include”相似。示例:AREA example,CODE,READONLYGET file1.s;包含源文件;包含源文件file1.sGET C:projectfile2.s;包含源文件;包含源文件fi
19、le2.sGET C:Program filesfile3.s;包含源文件;包含源文件file3.snEXPORT及GLOBALn声明一个源文件中的符号,使得此符号可以被其他源文件引用。n语法格式:nEXPORT/GLOBAL symboln其中:nsymbol:声明的符号的名称。(区分大小写)n例:AREA example,CODE,READONLYn EXPORT DoAdd n DoAdd ADD R0,R0,R1nC语言调用汇编程序;文件名:function.s;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试 AREA function,CODE,READONLY;声
20、明代码段function ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令 EXPORTmyadd ;导出函数申明,可被别的文件调用myadd ADD r0,r1,r0 ;r0=r1+r0 MOV pc,lr ;子程序返回 END ;文件结束/文件名:main.c int myadd(int a,int b);/申明在汇编中定义的函数,函数调用时,/参数a放入r0,参数b放入r1中int main(void)while(1)printf(“myadd 2 and 3 is:%dn”,myadd(2,3);/函数调用 汇编语言的语句格式 ARM(Thumb)汇编语言的语句格式为:
21、标号标号指令或伪指令指令或伪指令;注释;注释标号:从一行的行头开始,不能包含空格标号:从一行的行头开始,不能包含空格指令或伪指令:指令的前面必须有空格或符号指令或伪指令:指令的前面必须有空格或符号注释:以注释:以“;”开头开头每一条指令的助记符可以全部用大写、或全部用小写,但不允许在一条不允许在一条指令中大、小写混用指令中大、小写混用。语句之间可以插入空行。如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾用“”表示下一行与本行为同一条语句。n简单的ARM程序;文件名:TEST1.S;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段Example1 ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令START MOVR0,#0 ;设置参数 MOVR1,#10LOOPBLADD_SUB ;调用子程序ADD_SUB BLOOP ;跳转到LOOPADD_SUB ADDSR0,R0,R1 ;R0=R0+R1 MOVPC,LR ;子程序返回 END ;文件结束 使用“;”进行注释标号顶格写实际代码段声明文件结束感 谢
限制150内