资源预览内容
第1页 / 共65页
第2页 / 共65页
第3页 / 共65页
第4页 / 共65页
第5页 / 共65页
第6页 / 共65页
第7页 / 共65页
第8页 / 共65页
第9页 / 共65页
第10页 / 共65页
亲,该文档总共65页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
ARM 嵌入式系统 第5章 ARM汇编程序设计,5.1 汇编语言源程序,助记符 伪指令 宏指令,汇编指令和机器指令是“一一对应”的 汇编语言程序需由汇编程序将其汇编为机器语言 程序,才能被计算机执行。 汇编语言大体上包括了汇编指令、系统调用和中断、伪指令和宏指令,汇编语言是强烈依赖硬件和汇编环境的。 学习和使用汇编语言程序设计的原因,指令语句(instructions) 完成一定操作功能,能够翻译成机器代码的语句。 伪指令语句(directives, 指示性语句) 为汇编程序在翻译汇编语言源程序时提供有关信息,并不翻译成机器代码。 宏指令语句(marcos) 可看成是由若干条指令语句形成的语句,一条宏指令语句的功能相当于若干条指令语句的功能。,ARM程序设计基础,伪指令 宏与宏指令 ARM汇编语言规范(语句、表达式和运算符) ARM汇编语言的程序格式,5.2 伪指令,段定义 标号 符号定义伪指令 数据定义伪指令 汇编控制伪指令 其他伪操作,汇编语言程序示例,AREA Block, CODE, READONLY num EQU 10 ENTRY start LDR R0, =src LDR R1, =dst MOV R2, #num blockcopy LDR R3, R0, #4 STR R3, R1, #4 SUBS R2, R2, #1 BNE blockcopy B . AREA BlockData, DATA, READWRITE src DCD 0,1,2,3,4,5,6,7,8,9 dst SPACE 10*4 END,符号定义伪指令,定义全局变量: GBLA、GBLL和GBLS 定义局部变量: LCLA、LCLL和LCLS 变量赋值: SETA、SETL、SETS 通用寄存器列表定义名称:RLIST,GBLA、GBLL和GBLS,GBLA、GBLL和GBLS 语法格式: GBLA(GBLL或GBLS) 全局变量名 GBLA objectsize ;全局的数字变量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 “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中通过该名称访问寄存器列表。排列顺序无关,数据定义伪指令,DCB DCW(DCWU) DCD(DCDU) DCFD(DCFDU) DCFS(DCFSU) SPACE MAP FIELD,DCB,语法格式: 标号 DCB 表达式 表达式取值范围:128127;0255的数字或字符串。 DCB:“=” Nullstring DCB “Null string”,0 ;构造一个以0结尾的字符串,DCW(或DCWU),语法格式: 标号 DCW(或DCWU) 表达式 DCW:半字对齐 DCWU:不严格半字对齐。 表达式取值范围:32768 32767;0 65535 data1 DCW 128,num1+8 ;num1必须是已经定义过的,DCD(或DCDU),语法格式: 标号 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 DCFSU 1.0,-.1,3.1E6,SPACE,语法格式: 标号 SPACE 表达式 分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。 SPACE:“ ” Datastruc SPACE 280 ;分配连续280字节的存储单元并初始化为0,LTORG,语法格式: 标号 LTORG 说明某个存储区域是用来暂存数据的数据缓冲区文字池或数据缓冲池。大的代码段也可以使用多个数据缓冲池。 当程序中使用LDR之类的指令访问数据缓冲池时,为防止越界产生,通常把数据缓冲池放在代码段的后面,或者放在无条件跳转指令或子程序返回指令之后,使得处理器不会错误的将数据缓冲池中的数据当做指令来执行。 AREA Example, CODE, READONLY Start BL Func1 Func1 LDR R1,=0x800 MOV PC,LR LRORG Data SPACE 40 END,MAP,语法格式: MAP 表达式 ,基址寄存器 用于定义一个结构化的内存表的首地址。 MAP:“ ” 通常与FIELD伪指令配合使用来定义结构化的内存表。 MAP fun ;定义结构化内存表,fun就是内存表的首地址 MAP 0x80,R9 ;定义结构化内存表首地址的值为0x80R9,FILED,语法格式: 标号 FIELD 表达式 定义一个结构化内存表中的数据域。FILED也可用“#”代替。 MAP 0 ;定义结构化内存表首地址为0 consta FIELD 4 ;consta的长度为4字节,相对位置为0x0 constb FIELD 4 ;constb的长度为4字节,相对位置为0x4 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)伪指令用于控制汇编程序的执行流程,常用的汇编控制伪操作包括以下几条: IF、ELSE、ENDIF WHILE、WEND,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,其他常用的伪操作,AREA CODE16、CODE32 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:其后的指令序列为16位的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时,程序的真正入口点由链接器指定)。 示例: 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 Init,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 ;包含源文件file3.s,5.3 宏和宏指令,宏:在汇编程序中可以用伪指令MACRO、MEND为一个程序段定义一个名称,在往后的程序中就可以通过这个名称来使用它所代表的程序段。在源程序被汇编时,该名称将被替换为它所代表的程序段。 宏指令:在ARM中,还有一种汇编器内置的无参数和标号宏,我们把其称为宏指令。在汇编的时候,这些宏指令也是被替换成一条或两条真正的ARM或Thumb指令。 ADR、ADRL、LDR,MACRO、MEND,语法格式: MACRO $标号 宏名 $参数1,$参数2, ;宏名为宏的名称,为宏在程序中引用名。 ; $参数1,$参数2, 为宏中可以使用的参数。 指令序列 ;宏定义体 MEND 规定: $标号 为主标号,宏内的所有其他的标号必须由主标号组成。 宏中的所有标号必须在前面冠以符号$。 宏中的参数在汇编时被相应的值替换。 示例:在ARM中完成测试跳转操作需要两条指令,定义一条宏指令完成测试跳转操作 MACRO $la
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号