ARM嵌入式系统教程 教学课件 ppt 作者 张石 第4章

上传人:E**** 文档编号:89189086 上传时间:2019-05-21 格式:PPT 页数:84 大小:516KB
返回 下载 相关 举报
ARM嵌入式系统教程 教学课件 ppt 作者 张石 第4章_第1页
第1页 / 共84页
ARM嵌入式系统教程 教学课件 ppt 作者 张石 第4章_第2页
第2页 / 共84页
ARM嵌入式系统教程 教学课件 ppt 作者 张石 第4章_第3页
第3页 / 共84页
ARM嵌入式系统教程 教学课件 ppt 作者 张石 第4章_第4页
第4页 / 共84页
ARM嵌入式系统教程 教学课件 ppt 作者 张石 第4章_第5页
第5页 / 共84页
点击查看更多>>
资源描述

《ARM嵌入式系统教程 教学课件 ppt 作者 张石 第4章》由会员分享,可在线阅读,更多相关《ARM嵌入式系统教程 教学课件 ppt 作者 张石 第4章(84页珍藏版)》请在金锄头文库上搜索。

1、ARM 嵌入式系统 第4章 ARM汇编程序设计,ARM程序设计基础,伪操作(derective) 伪指令(Pseudo-instruction) ARM汇编语言语句格式 ARM汇编语言的程序格式 相关的程序示例,伪操作,符号定义伪操作 数据定义伪操作 汇编控制伪操作 其他伪操作,符号定义伪操作,定义全局变量: GBLA、GBLL和GBLS 定义局部变量: LCLA、LCLL和LCLS 变量赋值: SETA、SETL、SETS 通用寄存器列表定义名称:RLIST,GBLA、GBLL和GBLS,GBLA、GBLL和GBLS 语法格式: GBLA(GBLL或GBLS) 全局变量名 GBLA obje

2、ctsize ;全局的数字变量objectsize ,为0 Objectsize SETA 0xff ;将该变量赋值为0xff SPACE objectsize ;引用该变量 GBLL statusB ;全局的逻辑变量statusB ,为False statusB SETL TRUE ;将该变量赋值为真 全局:作用范围为包含该变量的源程序,LCLA、LCLL和LCLS,LCLA、LCLL和LCLS 语法格式: LCLA(LCLL或LCLS) 局部变量名 MACRO ;声明一个宏 $label message $a ;宏的原型 LCLS err ;声明一个局部变量err,为空串 err SETS

3、 “error no: ” ;向该变量赋值 $label ;代码 INFO 0,err:CC:STR:$a ;使用该串变量 MEND ;宏定义结束 局部:作用范围为包含该局部变量的宏代码的一个实例,SETA、SETL、SETS,SETA、SETL和SETS 语法格式: 变量名 SETA(SETL或SETS) 表达式 在向变量赋值前,必须先声明该变量,RLIST,RLIST 语法格式: 名称 RLIST 寄存器列表 Context RLIST r0-r6,r8,r10-r12,r15 ;将寄存器列表名称定义为Context ,可在ARM指令LDM/STM中通过该名称访问寄存器列表。排列顺序无关,

4、数据定义伪操作,DCB DCW(DCWU) DCD(DCDU) DCFD(DCFDU) DCFS(DCFSU) SPACE MAP FIELD,DCB,语法格式: 标号 DCB 表达式 表达式取值范围:128255的数字或字符串。 DCB:“=” Nullstring DCB “Null string”,0 ;构造一个以0结尾的字符串,DCW(或DCWU),语法格式: 标号 DCW(或DCWU) 表达式 DCW:半字对齐 DCWU:不严格半字对齐。 表达式取值范围:3276865535 data1 DCW 128,num1+8 ;num1必须是已经定义过的,DCD(或DCDU),语法格式: 标

5、号 DCD(或DCDU) 表达式 DCD:“ 其值为1,5,20 data2 DCD memaddr+4 ;分配一个字单元,其值为程序中标号memaddr加4个字节,DCFD(或DCFDU),语法格式: 标号 DCFD(或DCFDU) 表达式 每个双精度的浮点数占据两个字单元。 DCFD:字对齐 DCFDU:不严格字对齐 DCFD 1E308,-4E100 DCFDU 100000,.1,3.1E26,DCFS(或DCFSU),语法格式: 标号 DCFS(或DCFSU) 表达式 每个单精度的浮点数占据一个字单元。 DCFS:字对齐 DCFSU:不严格字对齐 DCFS 1E3,-4E-9 DCF

6、SU 1.0,-.1,3.1E6,SPACE,语法格式: 标号 SPACE 表达式 分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。 SPACE:“ ” Datastruc SPACE 280 ;分配连续280字节的存储单元并初始化为0,MAP,语法格式: MAP 表达式 ,基址寄存器 用于定义一个结构化的内存表的首地址。 MAP:“ ” 通常与FIELD伪指令配合使用来定义结构化的内存表。 MAP 0x80,R9 ;定义结构化内存表首地址的值为0x80R9,FILED,语法格式: 标号 FIELD 表达式 定义一个结构化内存表中的数据域。FILED也可用“#”代替。 MAP

7、 0 ;定义结构化内存表首地址为0 consta FIELD 4 ;consta的长度为4字节,相对位置为0 constb FIELD 4 ;constb的长度为4字节,相对位置为4 x FIELD 8 ;x的长度为8字节,相对位置为0x8 y FIELD 8 ;y的长度为8字节,相对位置为0x10 string FIELD 256 ;y的长度为256字节,相对位置为0x18 MOV R9,#4096 LDR R5,R9,constb ;将内存表中数据域constb读取到R5中,汇编控制伪操作,汇编控制(Assembly Control)伪操作用于控制汇编程序的执行流程,常用的汇编控制伪操作包

8、括以下几条: IF、ELSE、ENDIF WHILE、WEND MACRO、MEND MEXIT,IF、ELSE、ENDIF,语法格式: IF 逻辑表达式 指令序列1 ELSE 指令序列2 ENDIF 示例: IF Version=“1.0” ;指令 ;伪指令 ELSE ;指令 ;伪指令 ENDIF,WHILE、WEND,语法格式: WHILE 逻辑表达式 指令序列 WEND 示例: count SETA 1 WHILE count=4 count SETA count+1 ;code WEND,MACRO、MEND,语法格式: MACRO $标号 宏名 $参数1,$参数2, 指令序列 MEN

9、D 示例:在ARM中完成测试跳转操作需要两条指令,定义一条宏指令完成测试跳转操作 MACRO $label TestAndBranch $dest, $reg, $cc $label CMP $reg, #0 B$cc $dest MEND,MACRO、MEND,;在程序中调用该宏 test TestAndBranch NonZero, r0, NE NonZero ;程序被汇编后,宏展开的结果 test CMP r0, #0 BNE NonZero NonZero,MEXIT,语法格式: MEXIT MEXIT用于从宏定义中跳转出去。,其他常用的伪操作,AREA CODE16、CODE32

10、ENTRY END EQU IMPORT GET(或INCLUDE),AREA,语法格式: AREA 段名 属性1,属性2, 定义一个代码段或数据段。 常用的属性如下: CODE:用于定义代码段,默认为READONLY。 DATA:用于定义数据段,默认为READWRITE。 READONLY:指定本段为只读,代码段默认为READONLY。 READWRITE:指定本段为可读可写,数据段的默认属性为READWRITE。 示例: AREA Example,CODE,READONLY ;code,CODE16、CODE32,语法格式: CODE16(或CODE32) CODE16:其后的指令序列为1

11、6位的Thumb指令。 CODE32:其后的指令序列为32位的ARM指令。 示例: AREA ChangeState,CODE,READONLY CODE32 ;指示下面的指令为ARM指令 LDR r0,=start+1 BX r0 ;切换到Thumb状态,并跳转到start处执行 CODE16 ;指示下面的指令为Thumb指令 start MOV r1,#10,ENTRY,语法格式: ENTRY ENTRY伪操作用于指定汇编程序的入口点。在一个源文件里最多只能有一个ENTRY(可以没有)。在一个完整的汇编程序中至少要有一个ENTRY(当有多个ENTRY时,程序的真正入口点由链接器指定)。 示

12、例: AREA example,CODE,READONLY ENTRY ;应用程序的入口点,END,语法格式: END END伪指令用于通知编译器已经到了源程序的结尾。 示例: AREA example,CODE,READONLY END,EQU,语法格式: 名称 EQU 表达式,类型 EQU:“ * ” 示例: abcd EQU 2 ;定义abcd符号的值为2 abcd EQU label1+16 ;定义abcd符号的值(label1+16),IMPORT,语法格式: IMPORT 标号WEAK 用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用。 示例: AREA In

13、it,CODE,READONLY IMPORT Main ;通知编译器当前文件要引用标号Main,但Main在其他源文件中定义 END,GET(或INCLUDE),语法格式: GET 文件名 用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET。使用方法与C语言中的“include”相似。 示例: AREA example,CODE,READONLY GET file1.s ;包含源文件file1.s GET C:projectfile2.s ;包含源文件file2.s GET C:Program filesfile3.s ;包含源文

14、件file3.s,伪指令,ADR ADRL LDR NOP,ADR小范围的地址读取伪指令,语法格式 ADRcond register, expr cond:可选的指令执行条件 register:目标寄存器 expr:基于PC或寄存器的地址表达式,取值范围: 地址非字对齐,-255255 地址字对齐,-10201020 将基于PC或寄存器的地址值读取到寄存器中。 ADR伪指令被替换成一条合适的指令( ADD指令或SUB指令)。如果不能用一条来实现ADR伪指令的功能,编译器将报告错误。,ADR小范围的地址读取伪指令,示例: start MOV r0,#10 ;PC值为当前指令地址值加8字节 ADR

15、 r4,start ;本ADR伪指令将被编译器替换成 ; SUB r4,pc,#0xc,ADRL中等范围的地址读取伪指令,语法格式 ADRLcond register, expr cond:可选的指令执行条件 register:目标寄存器 expr:基于PC或寄存器的地址表达式,取值范围: 地址非字对齐,-64KB64KB 地址字对齐,-256KB256KB 将基于PC或寄存器的地址值读取到寄存器中。 ADRL伪指令被替换成两条合适的指令。如果不能用两条来实现ADRL伪指令的功能,编译器将报告错误。,ADRL中等范围的地址读取伪指令,示例: start MOV r0,#10 ;PC值为当前指令

16、地址值加8字节 ADR r4,start60000 ;本ADRL伪指令将被编译器替换成下面两条指令 ;ADD r4,pc,#0xe800 ;ADD r4,r4,#0x254 ;600000xEA60,LDR大范围的地址读取伪指令,语法格式 LDRcond register, expr|label-expr cond:可选的指令执行条件 register:目标寄存器 expr:32位常数 当expr没有超过MOV或MVN指令中的地址取值范围时,编译器用合适的MOV或MVN指令代替该LDR伪指令 反之,编译器将该常数放在数据缓冲池中,同时用一条基于PC的LDR指令读取该常数。LDR伪指令处的PC值到数据缓冲池中目标数据所在地址的偏移量要小于4KB。 将32位常数或者

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号