嵌入式体系结构及接口技术:第7章 汇编语言程序设计_第1页
嵌入式体系结构及接口技术:第7章 汇编语言程序设计_第2页
嵌入式体系结构及接口技术:第7章 汇编语言程序设计_第3页
嵌入式体系结构及接口技术:第7章 汇编语言程序设计_第4页
嵌入式体系结构及接口技术:第7章 汇编语言程序设计_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1TM第第7章章 汇编语言程序设计汇编语言程序设计本章主要介绍本章主要介绍ARM汇编语言程序设计规汇编语言程序设计规范,以及在汇编语言程序设计中所要注意的范,以及在汇编语言程序设计中所要注意的问题,最后以大量的实例说明汇编语言程序问题,最后以大量的实例说明汇编语言程序设计方法。设计方法。2TM2内容提要内容提要71 ARM编译环境下汇编语句编译环境下汇编语句72 GNU环境下汇编语句与编译说明环境下汇编语句与编译说明73 ARM汇编语言程序设计规范汇编语言程序设计规范74 ARM汇编语言程序设计实例解析汇编语言程序设计实例解析3TM37.1 ARM编译环境下汇编语句编译环境下汇编语句nARM编

2、译环境下进行汇编语言程序设计的格式编译环境下进行汇编语言程序设计的格式n汇编语句中的符号规则汇编语句中的符号规则 4TM4 7.1.1 ARM编译环境下汇编语句格式编译环境下汇编语句格式nADS环境下环境下ARM汇编语句格式如下:汇编语句格式如下:symbol instruction;commentsymbol directive;commentsymbol pseudo-instruction;comment注意事项:注意事项: 在在ARM编译环境下编译环境下ARM汇编语句不能从一行的顶格书汇编语句不能从一行的顶格书写,写,在一行语句中,指令的前面必须有空格或在一行语句中,指令的前面必须有空

3、格或TAB符号。符号。5TM5 7.1.2 ARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则 符号用来表示符号用来表示地址地址(一般为程序标号)、(一般为程序标号)、常量常量和和变量变量。当标号以数字开头时称为局部标号当标号以数字开头时称为局部标号,只在当前段有效。,只在当前段有效。1.符号命名规则符号命名规则(1)符号由大小写字母、数字、下划线组成,且符号是区)符号由大小写字母、数字、下划线组成,且符号是区分大小写的。分大小写的。(2)局部标号可以用数字开头,其他的标号不能。)局部标号可以用数字开头,其他的标号不能。(3)符号在其作用范围内必须是唯一的。)符号在其作用范围内必须

4、是唯一的。(4)程序中的符号不要与指令助记符或者伪操作同名。)程序中的符号不要与指令助记符或者伪操作同名。 6TM62.常量:包括数字常量、字符常量、字符串常量和布尔常量常量:包括数字常量、字符常量、字符串常量和布尔常量(1)十进制数,如)十进制数,如535、246。(2)十六进制数,如)十六进制数,如0 x645、0 xff00。(3)n_XXX, n表示表示n进制数,从进制数,从29,XXX是具体的数字。例是具体的数字。例如:如:8_3777(4)字符常量用一对单引号括起来,包括一个单字符或者标)字符常量用一对单引号括起来,包括一个单字符或者标准准C中的转义字符。例如中的转义字符。例如A、

5、n。(5)字符串常量由一对双引号以及由它括住的一组字符串组)字符串常量由一对双引号以及由它括住的一组字符串组成,包括标准成,包括标准C中的转义字符。中的转义字符。如果需要使用双引号如果需要使用双引号”或字符或字符$,则必须用,则必须用”和和$代替代替。 (6)布尔常量在表达式中写为)布尔常量在表达式中写为TRUE和和FALSE 7.1.2 ARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则7TM73.变量变量(1)数字变量)数字变量取值范围为取值范围为0232-1或或-231231-1;汇编器对关系运算符采;汇编器对关系运算符采用无符号数方式处理,这意味着用无符号数方式处理,这意味

6、着0-1是是FALSE。(2)字符串变量)字符串变量字符串变量由包含在双引号内的一系列字符组成,最大长字符串变量由包含在双引号内的一系列字符组成,最大长度为度为512字节,最小长度为字节,最小长度为0。当字符串中包含。当字符串中包含$(或或”)时,时,用用$(或或”)表示一个表示一个$(或或”)。(3)逻辑变量)逻辑变量取值范围为取值范围为TRUE和和FALSE 7.1.2 ARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则8TM83.变量变量变量代换规则:程序中的变量可通过代换操作取得一个常量变量代换规则:程序中的变量可通过代换操作取得一个常量n对于数字变量,如果该变量前有对于数

7、字变量,如果该变量前有$字符,在汇编器编译时字符,在汇编器编译时将该数字变量的数字转换成十六进制的串,然后用该十六将该数字变量的数字转换成十六进制的串,然后用该十六进制串取代进制串取代$字符后的变量。字符后的变量。n对于逻辑变量,如果该变量前有对于逻辑变量,如果该变量前有$字符,在汇编器编译时字符,在汇编器编译时将该逻辑变量替换成它的取值(将该逻辑变量替换成它的取值(T或或F)。)。n使用使用“.”来表示变量名的结束。来表示变量名的结束。 7.1.2 ARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则9TM93.变量变量例:变量代换例:变量代换GBLS string1GBLS st

8、ring2GBLS DGBLA NUMGBLL ISISSETL TRUENUMSETA 0 x11223344DSETS ARM9TDMIstring1 SETS ABC$D$NUM$ISstring2 SETS $string1BBCC 7.1.2 ARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则10TM104.字符串表达式操作字符串表达式操作(1)取字符串的长度)取字符串的长度LEN语法格式:语法格式::LEN: A功能说明:返回字符串功能说明:返回字符串A的长度。的长度。(2)CHR语法格式:语法格式::CHR: A 功能说明:将功能说明:将A(A为某一字符的为某一字符的

9、ASCII值)转换为单个字符。值)转换为单个字符。 7.1.2 ARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则11TM114.字符串表达式操作字符串表达式操作(3)STR语法格式:语法格式::STR: A 功能说明:功能说明:将将A(A为数字量或逻辑表达式)转换成字为数字量或逻辑表达式)转换成字符串。符串。32位数字量转换成位数字量转换成8位十六进制数组成的串;逻辑表达位十六进制数组成的串;逻辑表达式转换成字符串式转换成字符串T或或F。 7.1.2 ARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则12TM124.字符串表达式操作字符串表达式操作(4)LEFT返回一

10、个字符串最左端一定长度的字符串:返回一个字符串最左端一定长度的字符串: A :LEFT: B 功能说明:返回字符串功能说明:返回字符串A最左端最左端B(B为返回长度)长度的字符为返回长度)长度的字符串。串。(5)RIGHT返回一个字符串最右端一定长度的字符串:返回一个字符串最右端一定长度的字符串:A :RIGHT: B功能说明:返回字符串功能说明:返回字符串A最右端最右端B(B为返回长度)长度的字符为返回长度)长度的字符串。串。 7.1.2 ARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则13TM134.字符串表达式操作字符串表达式操作(6)CC用于连接两个字符串,用于连接两个字

11、符串,B串接到串接到A串后面:串后面:A :CC: B 7.1.2 ARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则14TM145.地址标号地址标号 当符号作为程序标号时,其内容为程序语句的地址当符号作为程序标号时,其内容为程序语句的地址。标号分为三种类型:。标号分为三种类型:1)PC相关标号相关标号 :常用来指明一个分支指令的目标地址常用来指明一个分支指令的目标地址;2)寄存器相关标号)寄存器相关标号 :常用于访问数据段中的数据,由常用于访问数据段中的数据,由MAP和和FIELD等伪操作来定义等伪操作来定义3)绝对地址)绝对地址 :32位的无符号数字常量,可寻址整个地址位的无符

12、号数字常量,可寻址整个地址空间。空间。 7.1.2 ARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则15TM156.局部标号局部标号局部标号的语法格式如下:局部标号的语法格式如下:n routname局部标号的引用:局部标号的引用:% F|B A|T nroutname其中:其中:n:局部标号的数字号:局部标号的数字号routname:局部范围的名称:局部范围的名称F/B:向前:向前/向后搜索,如果未指定则先向前再向后搜索向后搜索,如果未指定则先向前再向后搜索A/T:指示汇编器搜索宏的所有嵌套层次:指示汇编器搜索宏的所有嵌套层次/当前层次,如当前层次,如果未指定汇编器从宏的当前层

13、次到宏的最高层次搜索。果未指定汇编器从宏的当前层次到宏的最高层次搜索。 7.1.2 ARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则16TM1673 ARM汇编语言程序设计规范汇编语言程序设计规范n汇编器预定义的寄存器名称汇编器预定义的寄存器名称 为增加程序的可读性,为增加程序的可读性,ARM汇编器自定义了寄存器汇编器自定义了寄存器的别名。在进行程序设计时,程序员可以直接使用这些的别名。在进行程序设计时,程序员可以直接使用这些寄存器名,也可以使用相对应的通用寄存器。寄存器名,也可以使用相对应的通用寄存器。17TM17ARM汇编语言程序设计规范汇编语言程序设计规范 n要提高软件质量

14、必须降低编码阶段的错误率,这要提高软件质量必须降低编码阶段的错误率,这需要制定详细的需要制定详细的软件编程规范软件编程规范,并培训每一位程,并培训每一位程序员,最终的结果可以把编码阶段的错误降至序员,最终的结果可以把编码阶段的错误降至10%左右,同时会大大的缩短测试时间。左右,同时会大大的缩短测试时间。 18TM181. 符号命名规则符号命名规则2注释注释3程序设计的其它要求程序设计的其它要求这三方面的规范要求请参阅教材这三方面的规范要求请参阅教材ARM嵌入式系统结嵌入式系统结构与编程构与编程 159页页19TM1974 ARM汇编语言程序设计实例解析汇编语言程序设计实例解析n在嵌入式系统编程

15、中,与硬件直接相关的最底层代在嵌入式系统编程中,与硬件直接相关的最底层代码要用汇编语言来编写码要用汇编语言来编写;n本节中所设计的实例,意在帮助读者对嵌入式汇编本节中所设计的实例,意在帮助读者对嵌入式汇编语言程序设计打下坚实的基础,同时也为嵌入式硬语言程序设计打下坚实的基础,同时也为嵌入式硬件底层编程做准备。件底层编程做准备。 20TM20n跳转指令的应用跳转指令的应用 用用ARM汇编程序完成以下汇编程序完成以下C语言程序描述的功能语言程序描述的功能(求最大公约求最大公约数):数):int gcd(int a,int b)while (a!=b)if (ab)a=a-b;elseb=b-a;r

16、eturn a; ARM指令功能段举例指令功能段举例21TM21n跳转指令的应用跳转指令的应用设执行前设执行前R0中存放中存放a, R1中存入中存入b,代码执行后,代码执行后R0中存放中存放a和和b的最大公约数。的最大公约数。gcdCMP R0,R1SUBGT R0,R0,R1SUBLT R1,R1,R0BNE gcdMOV PC,LR ARM指令功能段举例指令功能段举例22TM22n跳转指令的应用跳转指令的应用2. 条件判断语句条件判断语句:if(a=0 |b=1)c=d+eCMP R0, #0CMPNE R1,#1ADDEQ R2,R3,R4 ARM指令功能段举例指令功能段举例23TM23

17、n跳转指令的应用3. 循环语句:MOV R0,loopcountloopSUBS R0, R0, #1BNE loop ARM指令功能段举例指令功能段举例24TM24求一个数的阶乘(求一个数的阶乘(64位结果)位结果)用用ARM汇编语言设计程序实现求汇编语言设计程序实现求20!,并将其!,并将其64位结果位结果放在放在R9:R8中。中。MOVR8 , #20;低低32位初始化为位初始化为20MOVR9 , #0;高位初始化为高位初始化为0SUBR0,R8,#1;初始化计数器初始化计数器LoopMOVR1 , R9;暂存高位值暂存高位值UMULLR8 , R9 , R0 , R8;R9:R8=R

18、0*R8MLAR9 , R1 , R0 , R9;R9=R1*R0+R9SUBSR0 , R0 , #1;计数器递减计数器递减BNELoop;计数器不为计数器不为0继续循环继续循环74ARM汇编语言程序设计实例解析汇编语言程序设计实例解析25TM25在在ARM集成开发环境下编程:集成开发环境下编程:AREA Fctrl, CODE, READONLY ; 声明代码声明代码FctrlENTRY ; 标识程序入口标识程序入口CODE32 ; 声明声明32 位位ARM 指令指令StopBStopEND;文件结束文件结束74ARM汇编语言程序设计实例解析汇编语言程序设计实例解析26TM26n例例7-3

19、 对数据区进行对数据区进行64位结果累加操作。位结果累加操作。 先对内存地址先对内存地址0 x3000开始的开始的100个字内存单元填入个字内存单元填入0 x100000010 x10000064字数据,然后将每个字字数据,然后将每个字单元进行单元进行64位累加结果保存于位累加结果保存于R9:R8。(。(R9中存中存放高放高32位)位)74ARM汇编语言程序设计实例解析汇编语言程序设计实例解析27TM27AREA NUMBERS,DATA,READWRITEdataBuffSPACE 400AREA LEIJIA,CODE,READONLYENTRYCODE32BEGINLDRR0,= dat

20、aBuffMOVR1,#0 x10000001MOVR2,#100loop1 STRR1,R0,#4ADDR1,R1,#1SUBS R2,R2,#1BNEloop174ARM汇编语言程序设计实例解析汇编语言程序设计实例解析28TM28LDRR0,= dataBuffMOVR9,#0MOVR8,#0MOVR2,#100loop2LDRR1,R0,#4ADDS R8,R8,R1ADCR9,R9,#0SUBS R2,R2,#1BNEloop2stopB stopEND74ARM汇编语言程序设计实例解析汇编语言程序设计实例解析29TM29例例7-5 用用ARM指令实现内存数据区块拷贝操作。指令实现内存

21、数据区块拷贝操作。内存数据区定义:内存数据区定义:SrcDCD 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18DstSPACE 72将数据从将数据从Src区复制到区复制到Dst区,要求以区,要求以4个字为单位进行批个字为单位进行批量拷贝,不足量拷贝,不足4个字时以字为单位进行拷贝。个字时以字为单位进行拷贝。74ARM汇编语言程序设计实例解析汇编语言程序设计实例解析30TM30NUMEQU18RegListRLISTR5-R8AREA SurDst,DATA,READWRITESurDCD 1,2,3,4,5,6,7,8,9,10,11,12,13,14

22、,15,16,17,18DstSPACE 72AREA blockCopy,CODE,READONLYENTRYCODE32startLDR R2,=SurLDR R3,=DstMOV R0,#NUMMOVS R1,R0,LSR #2BEQ copyWords74ARM汇编语言程序设计实例解析汇编语言程序设计实例解析31TM31copy4wordsLDMIA R2!,RegListSTMIA R3!,RegListSUBS R1,R1,#1BNE copy4wordscopyWordsANDS R0,R0,#3BEQ stopcopyWordLDR R4,R2,#4STR R4,R3,#4SU

23、BS R0,R0,#1BNE copyWordstopB stopEND74ARM汇编语言程序设计实例解析汇编语言程序设计实例解析32TM32n例例7-4 初始化初始化ARM处理器各模式下的堆栈指针处理器各模式下的堆栈指针SP(R13)。)。 设计思路:设计思路:通过通过MRS/MSR指令,采用指令,采用“读取读取-修改修改-写回写回”三个步骤修改三个步骤修改CPSR模式控制字,使处理器进入相应的模式控制字,使处理器进入相应的模式,在各模式下修改其堆栈指针。模式,在各模式下修改其堆栈指针。74ARM汇编语言程序设计实例解析汇编语言程序设计实例解析33TM33如何设置相应模式下的如何设置相应模式

24、下的SPMRSR0, CPSR;读取当前读取当前CPSR BICR0, R0, #0 x1F;清除模式位清除模式位 ORRR1, R0, #0 x1B ; 未定义模式控制字未定义模式控制字 MSRCPSR_c, R1LDRSP, =0 xC7FF20074ARM汇编语言程序设计实例解析汇编语言程序设计实例解析34TM34_ISR_STARTADDRESS EQU 0 xC7FF000 ;设置栈的内存基地址设置栈的内存基地址UserStackEQU _ISR_STARTADDRESS ; 用户模式堆栈地址用户模式堆栈地址SVCStackEQU_ISR_STARTADDRESS+256 ;管理模式

25、管理模式UndefStackEQU_ISR_STARTADDRESS+256*2 ;未定义模式未定义模式AbortStackEQU_ISR_STARTADDRESS+256*3; 中止模式中止模式IRQStackEQU_ISR_STARTADDRESS+256*4 ; IRQ模式模式FIQStackEQU_ISR_STARTADDRESS+256*5 ;FIQ模式模式USERMODEEQU 0 x10; 用户模式控制字用户模式控制字 FIQMODEEQU 0 x11; FIQ模式控制字模式控制字 IRQMODEEQU 0 x12; IRQ模式控制字模式控制字 SVCMODEEQU 0 x13;

26、 管理模式控制字管理模式控制字 ABORTMODEEQU 0 x17; 中止模式控制字中止模式控制字 UNDEFMODEEQU 0 x1b; 未定义模式控制字未定义模式控制字 SYSMODEEQU0 x1f; 系统模式控制字系统模式控制字 MODEMASKEQU0 x1f; 模式位掩码控制字模式位掩码控制字 74ARM汇编语言程序设计实例解析汇编语言程序设计实例解析35TM35AREA Stack_Init, CODE, READONLY ENTRY CODE32 STARTMRSR0, CPSRBICR0, R0, #MODEMASK;清除模式位清除模式位 ;设置系统模式下的设置系统模式下的

27、SPORRR1, R0, #SYSMODEMSRCPSR_c, R1LDRSP, =UserStack;设置未定义模式下的设置未定义模式下的SPORRR1, R0, #UNDEFMODEMSRCPSR_c, R1LDRSP, =UndefStack74ARM汇编语言程序设计实例解析汇编语言程序设计实例解析36TM36例例7-6 内存数据大小端转换操作。内存数据大小端转换操作。对内存地址对内存地址0 x9000开始的开始的20个数据内存单元依次填入个数据内存单元依次填入0 x443322010 x44332214,然后进行转换操作,并存回,然后进行转换操作,并存回原来的地址。(在原来的地址。(在

28、ADS下编写)下编写)74ARM汇编语言程序设计实例解析汇编语言程序设计实例解析37TM37n算术逻辑运算指令的应用转换内存中数据存储方式转换内存中数据存储方式:设设R0的的4个字节存储的数据分别为个字节存储的数据分别为A、B、C、D,要求用一段程序实现将它们的次序反置。要求用一段程序实现将它们的次序反置。EOR R1,R0,R0,ROR #16BIC R1,R1,#0 xFF0000MOV R0,R0, ROR #8EOR R0, R0, R1, LSR #8 ARM指令功能段举例指令功能段举例38TM38n算术逻辑运算指令的应用转换内存中数据存储方式转换内存中数据存储方式:设设R0的的4个

29、字节存储的数据分别为个字节存储的数据分别为A、B、C、D,要求用一段程序实现将它们的次序反置。要求用一段程序实现将它们的次序反置。MOV R2, #0 xFFORR R2,R2,#0 xFF0000AND R1,R2,R0AND R0,R2,R0, ROR #24ORR R0,R0,R1,ROR #8 ARM指令功能段举例指令功能段举例39TM39例例7-8 实现将寄存器高位和低位对称换位。实现将寄存器高位和低位对称换位。换位方式:第换位方式:第0位与第位与第31位互换、第位互换、第1位与第位与第30位互换、位互换、设计思路:设计思路:入口:源数据在入口:源数据在R0出口:结果在出口:结果在R

30、2中中处理过程:处理过程: R0最低位送最低位送R2最低位最低位R0右移一位右移一位 R2左移一位(此过程循环左移一位(此过程循环32次)次)74 ARM汇编语言程序设计实例解析汇编语言程序设计实例解析40TM40例例7-10 把把8421码数据转换成整型数据。码数据转换成整型数据。8421码用码用4位二进制数表示一个十进制位,分别用位二进制数表示一个十进制位,分别用0000 1001表示表示09,设计程序将一个,设计程序将一个8位位8421码表示的十进制码表示的十进制数转换成等价的整型数据。数转换成等价的整型数据。设计思路:设计思路:入口:源数据在入口:源数据在R0出口:结果在出口:结果在R

31、1中中 计算方法:记计算方法:记R0=ABCDEFGH, 则则R1=(A*10)+B)*10+C)*10+D)*10+G)*10+H)74 ARM汇编语言程序设计实例解析汇编语言程序设计实例解析41TM41例例7-13 实现对字符串的逆序拷贝实现对字符串的逆序拷贝编写编写ARM汇编程序,将一个给定的字符串以逆序拷贝到目汇编程序,将一个给定的字符串以逆序拷贝到目标地址中。例如源字符串为标地址中。例如源字符串为“ABCDEFG”,拷贝目标串,拷贝目标串为为“GFEDCBA”。认真分析教材中的程序,用认真分析教材中的程序,用AXD对程序进行调试,回答下对程序进行调试,回答下面的问题:面的问题:1)教材中的源程序是否存在错误?)教材中的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论