1、ARM汇编编程汇编编程ARMARM汇编程序组成汇编程序组成zARM汇编语言源程序中语句由指令、伪操汇编语言源程序中语句由指令、伪操作和宏指令组成作和宏指令组成y在在ARM汇编语言程序中,有一些特殊指汇编语言程序中,有一些特殊指令助记符,这些助记符没有相应的操作令助记符,这些助记符没有相应的操作码,他们所完成的操作称为伪操作。在码,他们所完成的操作称为伪操作。在源程序中的作用是为完成汇编程序作各源程序中的作用是为完成汇编程序作各种准备工作的。种准备工作的。y宏是一段独立的程序代码,在程序中通宏是一段独立的程序代码,在程序中通过宏指令调用该宏过宏指令调用该宏常用的伪操作常用的伪操作zAREA伪操作
2、用于定义一个代码段或数据伪操作用于定义一个代码段或数据段段yAREA 段名段名,属性属性1,属性属性2 y一个大的程序可以包括多个代码段和数据段。一个大的程序可以包括多个代码段和数据段。一个汇编程序至少包含一个段一个汇编程序至少包含一个段 y AREA Example1,CODE,READONLYy AREA Example2,DATA,READWRITE常用的伪操作常用的伪操作zEQU伪操作用于为程序中的常量、标号等伪操作用于为程序中的常量、标号等定义一个等效的字符名称定义一个等效的字符名称y名称名称 EQU 表达式表达式,类型类型 yabcd EQU 50;定义标号;定义标号abcd的值为
3、的值为50y名称为名称为EQU伪操作定义的字符名称,当表达伪操作定义的字符名称,当表达式为式为32位的常量时,可以指定表达式的数据类位的常量时,可以指定表达式的数据类型,可以有以下三种类型:型,可以有以下三种类型:yCODE16 CODE32 DATAyAddr EQU 0 x54,CODE32;定义定义Addr的值的值为为0 x54,且该处为,且该处为32位的位的ARM指令。指令。常用的伪操作常用的伪操作zENTRY和和ENDyENTRY用于指定汇编程序的入口用于指定汇编程序的入口y每一个汇编源程序都包含每一个汇编源程序都包含END为操作,以告为操作,以告诉本源程序的结束诉本源程序的结束yA
4、REA Example1,CODE,READONLYyENTRYyEND常用的伪操作常用的伪操作zEXPORT或或GLOBALyEXPORT用于在程序中声明一个全局的标号用于在程序中声明一个全局的标号,该标号可在其他的文件中引用,可用,该标号可在其他的文件中引用,可用GLOBAL代替。代替。yAREA Example,CODE,READONLYyEXPORT DoAdd ;下面的函;下面的函数名称数名称DoAdd可以被其他源文件引用可以被其他源文件引用yDoAdd ADD r0,r0,r1常用的伪操作常用的伪操作zCODE16及及CODE32y若在汇编源程序中同时包含若在汇编源程序中同时包含
5、ARM 指令和指令和 Thumb 指指令时,可用令时,可用 CODE16 伪指令通知编译器其后的指令序伪指令通知编译器其后的指令序列为列为 16 位的位的 Thumb 指令,指令,CODE32 伪指令通知编伪指令通知编译器其后的指令序列为译器其后的指令序列为 32 位的位的 ARM 指令。因此,指令。因此,在使用在使用 ARM 指令和指令和 Thumb 指令混合编程的代码里指令混合编程的代码里,可用这两条伪指令进行切换,但注意他们只通知编,可用这两条伪指令进行切换,但注意他们只通知编译器其后指令的类型,并不能对处理器进行状态的切译器其后指令的类型,并不能对处理器进行状态的切换。换。AREA E
6、xample,CODE,READONLYCODE32 ;通知编译器后面的指令为;通知编译器后面的指令为32位的位的 ARM指令指令LDR R0,=start+1BX R0CODE16StartMOV R1,#10常用的伪操作常用的伪操作zIMPORT 伪操作告诉编译器当前的符号不伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符件中定义的,在本源文件中可能引用该符号号zIMPORT Main;通知编译器当前文件要;通知编译器当前文件要引用标号引用标号Main,但,但Main在其他文件中定在其他文件中定义义宏定
7、义宏定义z 使用宏定义可以提高程序的可读性,简化程序代码和同步使用宏定义可以提高程序的可读性,简化程序代码和同步修改。修改。ARM宏定义与标准宏定义与标准C的的#define相似。相似。z 宏定义从宏定义从MACRO伪指令开始,到伪指令开始,到MEND结束,并可以使结束,并可以使用参数。用参数。z 宏要先定义,然后再使用,使用时直接书写宏名,并根据宏要先定义,然后再使用,使用时直接书写宏名,并根据对应的宏定义格式设置输入参数或书写标号等,当源程序对应的宏定义格式设置输入参数或书写标号等,当源程序被汇编时,汇编编译器将展开每一个宏调用,用宏定义体被汇编时,汇编编译器将展开每一个宏调用,用宏定义体
8、代替程序中的宏调用,并使用实际的参数值代替宏定义时代替程序中的宏调用,并使用实际的参数值代替宏定义时的形式参数。的形式参数。z MACROz$label macroname$parameter,$parameterz MENDARMARM汇编编程例子汇编编程例子AREA Add,CODE,READONLY;程序起始定义;程序起始定义ENTRY ;第一条指令的标示符,只能有一个;第一条指令的标示符,只能有一个 ;下面是程序主体;下面是程序主体StartMOV r0,#1MOV r1,#2BL doadd ;调用子程序;调用子程序doaddADD r0,r0,r1 ;r0=r0+r1MOV pc,
9、lrEND ;END伪指令必须和伪指令必须和ENTRY配对使用配对使用 ARMARM汇编编程例子汇编编程例子C C语言与汇编语言语言与汇编语言z在应用系统的程序设计中,若所有的编程在应用系统的程序设计中,若所有的编程任务均用汇编语言来完成,其工作量是可任务均用汇编语言来完成,其工作量是可想而知的,同时不利于系统升级或应用软想而知的,同时不利于系统升级或应用软件移植件移植zARM体系结构支持体系结构支持C/C+以及与汇编语以及与汇编语言的混合编程,在一个完整的程序设计中言的混合编程,在一个完整的程序设计中,除了初始部分用汇编语言完成以外,其,除了初始部分用汇编语言完成以外,其主要的编程任务一般都
10、用主要的编程任务一般都用C/C+完成完成从汇编程序中访问从汇编程序中访问C C变量变量从从C C程序中调用汇编程序程序中调用汇编程序Any Question?习题与思考习题与思考z ARM处理器有几种工作状态?各个状态处理器有几种工作状态?各个状态之间如何切换?之间如何切换?z ARM处理器的工作模式有哪几种?什么处理器的工作模式有哪几种?什么情况下会发生工作模式的改变?情况下会发生工作模式的改变?z 简述简述ARM处理器处理异常的过程。处理器处理异常的过程。z ARM处理器有几种存储格式?有什么不处理器有几种存储格式?有什么不同?同?z 简述简述ARM处理器的寻址方式,并举例处理器的寻址方式
11、,并举例。z 试分析下面几段试分析下面几段ARM汇编程序的执行结果:汇编程序的执行结果:z(1)AREA Example,CODE,READONLYzEXPORTtestzIMPORT test1zENTRY testzLDRR1,=testzLDRR0,R1zADD R0,R0,#1zSTRR0,R1zMOV PC,LRzENDz AREACDO,CODE,READONLY z CODE32 z ADD_SIXz GLOBALADD_SIXz STMFDR13,R4,R5z LDR R4,R13 z LDR R5,R13,#4!z ADD R0,R0,R1z ADD R0,R0,R2z ADD R0,R0,R3z ADD R0,R0,R4z ADD R0,R0,R5z SUBR13,R13,#8z LDMFDR13,R4,R5 z MOVR15,R14z END