第3章ARM汇编语言程序设计 GNU 汇编ppt课件.ppt
《第3章ARM汇编语言程序设计 GNU 汇编ppt课件.ppt》由会员分享,可在线阅读,更多相关《第3章ARM汇编语言程序设计 GNU 汇编ppt课件.ppt(79页珍藏版)》请在三一办公上搜索。
1、,ADS/SDT IDE开发环境:它由ARM公司开发,使用了CodeWarrior公司的编译器;集成了GNU开发工具的IDE开发环境:它由GNU的汇编器as、交叉编译器gcc、和链接器ld等组成。,汇编语言都具有一些相同的基本特征。一条指令一行。使用标号(label)给内存单元提供名称,从第1列开始书写。指令必须从第2列或能区分标号的地方开始书写。注释跟在指定的注释字符后面(ARM使用的是“;”/”),一直书写到行尾。ARM汇编语言基本的的语句格式如下:symbol instruction|directive|pseudo-instruction;comment 符号 指令、伪指令或伪操作;/
2、注释,符号由大小写字母、数字及下画线组成,符号不能用数字开头。符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。符号在其作用范围内必须唯一。自定义的符号名不能与系统的保留字相同。符号名不应与指令或伪指令同名。,伪操作(Directive)是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运行期间由处理器执行。不同的编译程序所使用的伪操作有所不同。,常量编译控制伪操作,程序代码控制伪操作,宏及条件编译伪指令,其他伪指令,GNU ARM汇编伪操作,Linux汇编行结构任何汇编行都是如下结构::commen
3、t:注释LinuxARM汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要在一行的开始。【例1】定义一个add”的函数,返回两个参数的和。.section.text,“x”.globaladdgivethesymboladdexternallinkageadd:ADDr0,r0,r1addinputargumentsMOVpc,lrreturnfromsubroutineendofprogram,Linux汇编程序中的标号,Linux 汇编程序中的标号 标号只能由az,AZ,09,“.”,”_”等字符组成。当标号为09的数字时为局部标号,局部标号可以重复出现,使用方法如下:标号f:
4、在引用的地方向前的标号 标号b:在引用的地方向后的标号【例2】使用局部符号的例子,一段循环程序 1:subs r0,r0,#1 每次循环使r0=r0-1 bne 1f 跳转到1标号去执行 局部标号代表它所在的地址,因此也可以当作变量或者函数来使用。,Linux汇编程序中的分段,(1).section伪操作用户可以通过.section伪操作来自定义一个段,格式如下:.sectionsection_name,flags,%type,flag_specific_arguments每一个段以段名为开始,以下一个段名或者文件结尾为结束。这些段都有缺省的标志(flags),连接器可以识别这些标志。(与ar
5、masm中的AREA相同)。下面是ELF格式允许的段标志a允许段,w可写段 x:执行段例子:.section.mysection 自定义数据段,段名为“.mysection”,预定义段.text、.data、.bss,语法格式.text subsection.data subsection初始化数据.bss subsection 作用.text、.data和.bss将汇编系统预定义的段名编译到相应的代码段、数据段和bss段。注意:源程序中.bss段应该在.text之前。说明bss段通常是指用来存放程序中未初始化的全局变量的一块内存区域 数据段通常是指用来存放程序中已初始化的全局变量的一块内存区
6、域,举例.section.data.section.bss.section.text.global _start _start:,.end,语法格式.end作用 表明源文件的结束,如果该标号之后还有代码,不会被编译到执行文件中,.include语法格式.include filename 作用可以将指定的文件在使用位置处展开,一般是头文件.incbin语法格式.incbin file,skip,count 作用可以将原封不动的一个二进制文件编译到当前文件中。其中,skip表明是从文件开始跳过skip个字节开始读取文件,count是读取的字数,.if、.else/.endif,语法格式.if 条件
7、表达式 代码段1.else 代码段2.endif,.macro、.exitm和.endm,语法格式.macro 宏名 参数名列表 伪操作.macro定义一个宏 宏体.endm.endm表示宏结束 说明如果宏使用参数,那么在宏体中使用该参数时添加前缀“”。宏定义时的参数还可以使用默认值,可以使用.exitm伪指令来退出宏举例,.macro SHIFTLEFT a,b.if b0 MOV a,a,ASR#-b.exitm.endif MOV a,a,LSL#b.endm,.string/.asciz/.ascii,语法格式.string/.asciz/.ascii 表达式,表达式.作用.strin
8、g/.asciz/.ascii定义多个字符串。注意:ascii伪操作定义的字符串需要自动添加结尾字符0举例.string abcd,hello,.equ、.set,语法格式.equ(.set)常量名,表达式 作用.equ和.set用于为程序中标号定义名称举例.equ abc 3 让abc=3,.global/.globl,语法格式.global/.globl symbol 作用.global和.globl用来定义一个全局的符号,.extern,语法格式.extern label 作用.extern用于声明一个外部标号,.ltorg、.pool,语法格式.ltorg/.pool 作用.ltorg
9、和.pool用于声明一个数据缓冲池的开始,它可以分配很大的空间,伪指令是ARM处理器支持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机器执行,只是在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。ARM汇编语言伪指令如表3-2所示。,在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。ADR伪指令中的地址是基于PC或寄存器的,当ADR伪指令中的地址是基于PC时,该地址与ADR伪指令必须在同一个代码段中。地址表达式expr的取值范围
10、如下:当地址值是字节对齐时,其取指范围为255B255B;当地址值是字对齐时,其取指范围为1020B1020B。,ARM伪指令小范围的地址读取,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,.ADR R0,Delay.Delay MOV R0,r14.,应用示例(源程序):,使用伪指令将程序标号Delay的地址存入R0,.0 x20 ADD r1,pc,#0 x3c.0 x64
11、MOV r0,r14.,ARM伪指令小范围的地址读取,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,.ADR R1,Delay.Delay MOV R0,r14.,应用示例(源程序):,编译后的反汇编代码:,使用伪指令将程序标号Delay的地址存入R0,地址,程序代码,ARM伪指令小范围的地址读取,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。
12、在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,.ADR R0,Delay.Delay MOV R0,r14.,应用示例(源程序):,.0 x20 ADD r0,pc,#0 x3c.0 x64 MOV r0,r14.,编译后的反汇编代码:,使用伪指令将程序标号Delay的地址存入R0,ADR伪指令被汇编成一条指令,ARM伪指令小范围的地址读取,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令
13、被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,应用示例2(查表):ADR R0,DISP_TAB;加载转换表地址 LDRB R1,R0,R2;使用R2作为参数,进行查表 DISP_TAB:.word 0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指
14、令从文字池读出常量。示例:LDR r1,=0 xff;将0 xff读取到r1中;编译后得到MOV r1,0 xff示例:LDR r1,=ADDR;将外部地址ADDR读取到R1中 汇编后将得到:;LDR r1,PC,OFFSET_TO_LPOOL;LPOOL.word ADDR,.text.global _start_start:movr0,#9movr1,#15loop:cmpr0,r1/比较r0 r1subltr1,r1,r0/若r0 r1 则 r1=r1 r0subgtr0,r0,r1/若r1 r0 则 r0=r0 r1bneloop/若 r0 r1不相等则继续循环stop:bstop.e
15、nd,用预先设定的行标与B、BL结合可以设计各种循环结构。例如:LOOP ADD R0,R0,R1;R0=R0+R1 CMP R0,#3;比较R0和#3 BLS LOOP;if R03 then 跳转到LOOP循环.end,在ARM汇编语言程序中,子程序的调用一般是通过BL指令来实现的。在程序中,使用指令:BL 子程序名 即可完成子程序的调用。该指令在执行时完成如下操作:将子程序的返回地址存放在连接寄存器LR中,同时将程序计数器PC指向子程序的入口点,当子程序执行完毕需要返回调用处时,只需要将存放在LR中的返回地址重新复制给程序计数器PC即可。在调用子程序的同时,也可以完成参数的传递和从子程序
16、返回运算的结果,通常可以使用寄存器R0R3完成。以下是使用BL指令调用子程序的汇编语言源程序的基本结构:BL PRINT_TEXT;跳转到子程序 PRINT_TEXT,并保存PC至LR PRINT_TEXT;子程序入口 MOV PC,LR;子程序运行完毕将PC置为LR,准备返回.end,【例3-3】给出一个输出Hello World的程序。.section HelloWorld,;声明代码段.equ SWI_WriteC 程序源代码结束,堆栈指令初始化INITSTACK:MOV R0,LR;保存返回地址;设置管理模式堆栈MSR CPSR_C,#0 xD3LDR SP,StackSvc;设置中断
17、模式堆栈MSR CPSR_C,#0 xD2LDR SP,StackIrq,C语言的优点是运行速度快、编译效率高、移植性好和可读性强。C语言支持模块化程序设计,支持自顶向下的结构化程序设计方法。因此,在嵌入式程序设计中经常会用到C语言程序设计。嵌入式C语言程序设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计。也就是说它首先是C语言程序设计,因此必须符合C语言基本语法,只是它是面向嵌入式的应用而设计的程序。为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则。ATPCS就是ARM程序和Thumb程序中子程序调用的基本规则。,PCS即Procedu
18、re Call Standard(过程调用规范),ATPCS即ARM-Thumb Procedure Call Standard。ATPCS规定了一些子程序之间调用的基本规则,这些基本规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则。,基本ATPCS规定了在子程序调用时的一些基本规则,包括以下3个方面的内容:各寄存器的使用规则及其相应的名字,数据栈的使用规则,参数传递的规则。相对于其他类型的ATPCS,满足基本ATPCS的程序的执行速度更快,所占用的内存更少。但是它不能提供以下的支持:ARM程序和Thumb程序相互调用,数据以及代码的位置无关的支持,子程序的可重入性,
19、数据栈检查的支持。,1寄存器的使用规则ATPCS中定义的寄存器如表3-3所示。表3-3ATPCS中定义的寄存器其中:R0R3:用于传参,r0用于返回值。R4R11:通用变量寄存器。R12:用作过程调用中间临时过渡寄存器IP。R13:堆栈指针。R14:连接寄存器。R15:PC。另外,R9、R10和R11还有一个特殊作用,分别记为:静态基址寄存器SB,数据栈限制指针SL和桢指针FP。,子程序通过寄存器R0R3来传递参数,这时寄存器可以记作A0A3,被调用的子程序在返回前无须恢复寄存器R0R3的内容。在子程序中,使用R4R11来保存局部变量,这时寄存器R4R11可以记作V1V8。如果在子程序中使用到
20、V1V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作。在Thumb程序中,通常只能使用寄存器R4R7来保存局部变量。寄存器R12用作子程序间临时过渡寄存器,记作IP,在子程序的连接代码段中经常会有这种使用规则。,寄存器R13用作数据栈指针,记做SP,在子程序中寄存器R13不能用作其他用途。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。寄存器R14用作连接寄存器,记作LR。它用于保存子程序的返回地址,如果在子程序中保存了返回地址,则R14可用作其他的用途。寄存器R15是程序计数器,记作PC,它不能用作其
21、他用途。ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的。,栈指针通常可以指向不同的位置。当栈指针指向栈顶元素(即最后一个入栈的数据元素)时,称为FULL栈。当栈指针指向与栈顶元素相邻的一个元素时,称为Empty栈。数据栈的增长方向也可以不同,当数据栈向内存减小的地址方向增长时,称为Descending栈;当数据栈向着内存地址增加的方向增长时,称为Ascending栈。综合这两种特点可以有以下4种数据栈,即FD、ED、FA、EA。ATPCS规定数据栈为FD类型,并对数据栈的操作是8字节对齐的,下面是一个数据栈的示例及相关的名词。,数据栈栈指针(stack pointer):指向最后一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第3章ARM汇编语言程序设计 GNU 汇编ppt课件 ARM 汇编语言 程序设计 汇编 ppt 课件

链接地址:https://www.31ppt.com/p-2104428.html