[计算机软件及应用]第3章 arm体系结构编程

上传人:tia****nde 文档编号:70534505 上传时间:2019-01-17 格式:PPT 页数:44 大小:417.31KB
返回 下载 相关 举报
[计算机软件及应用]第3章 arm体系结构编程_第1页
第1页 / 共44页
[计算机软件及应用]第3章 arm体系结构编程_第2页
第2页 / 共44页
[计算机软件及应用]第3章 arm体系结构编程_第3页
第3页 / 共44页
[计算机软件及应用]第3章 arm体系结构编程_第4页
第4页 / 共44页
[计算机软件及应用]第3章 arm体系结构编程_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《[计算机软件及应用]第3章 arm体系结构编程》由会员分享,可在线阅读,更多相关《[计算机软件及应用]第3章 arm体系结构编程(44页珍藏版)》请在金锄头文库上搜索。

1、ARM汇编编程,教学目的,掌握汇编语言程序的基本结构 掌握ARM汇编器的伪操作 掌握汇编语言程序的上机过程,教学内容,3.1汇编语言程序格式 3.2 ARM汇编器的伪操作 3.3汇编语言程序设计 3.5汇编语言和C语言交互编程,3.1汇编语言程序格式,3.1.1汇编语言的基本概念 3.1.2汇编语言源程序的组成 3.1.3汇编语言程序中常用的符号 3.1.4汇编语言程序中的表达式和运算符,3.1.1汇编语言的基本概念,表3-1 汇编后的机器代码,3.1.2汇编语言源程序的组成,1.汇编语言源程序的结构 AREA Init, CODE, READONLY ENTRY LDR R0,=0x3FF5

2、000 LDR R1,#0xFF STR R1,R0 LDR R0,=0x3FF5008 LDR R1,#0x01 STR R1,R0 END,程序段,段是相对独立的指令或数据序列,具有特定的名称。 代码段 数据段 通用段 段具有一定的属性。 READONLY READWRITE,2.汇编语言的语句格式,LABEL OPERATION OPERAND ;COMMENT 标号域 操作助记符域 操作数域 注释域 Start MOV R0,0x3F,(1)标号域,标号域用来表示指令的地址、变量、过程名、数据的地址和常量 标号是一个自行设计的标识符或名称,语句标号可以是大小写符号混合,通常以字母开头,

3、由字母、数字、下划线等组成。 语句标号不能与寄存器名、指令助记符、伪指令(操作)助记符、变量名同名。 语句标号必须在一行的开头书写,不能留空格。,(2)操作助记符域,操作助记符域可以为指令、伪操作、宏指令或伪指令的助记符。 ARM汇编器对大小写敏感,在汇编语言程序设计中,每一条指令的助记符可以全部用大写、或全部用小写,但不允许在一条指令中大、小写混用。 所有的指令都不能在行的开头书写,必须在指令的前面有空格,然后在书写指令。 指令助记符和后面的操作数或操作寄存器之间必须有空格,不可以在这之间使用逗号。,(3)操作数域,操作数域表示操作的对象,操作数可以是常量、变量、标号、寄存器名或表达式,不同

4、对象之间必须用逗号分开。,课堂练习 判断指令格式正误,AREA EX3,CODE,READONLY GBLA DATA DATA SETA 0x20 ADD R0,R1,R2 ADD R0,R1,r2 add R0,R1,r2 Add R0,R1,r2,3.1.3汇编语言程序中常用的符号,在汇编语言程序设计中,经常使用各种符号表示变量、常量和地址 符号由大小写字母、数字以及下划线组成。 符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。 符号在其作用范围内必须唯一,即在其作用范围内不可有同名的符号。 自定义的符号名不能与系统的保留字相同。 符号名不应与指令或伪指令同名。,1.程

5、序中的变量,变量的类型: 数值变量 逻辑变量 字符串变量 作用范围: 全局变量 局部变量,2.程序中的常量,ARM(THUMB)汇编程序所支持的常量有数值常量、逻辑常量和字符串常量。 在ARM汇编语言中,使用EQU来定义数值常量。,数值常量有下列表示方式:,十进制数 十六进制数 N进制数:形如n_XXX,其中n的范围是2到9,XXX是具体数值。 ASCII的表示:例如:A表达A的ASCII码。指令:MOV R1,#B等同于 MOV R1,#0x42.,3.2 ARM汇编器的伪操作,区别: 指令 伪指令 :ADR ADRL LDR 伪操作,3.2 ARM汇编器的伪操作,3.2.1符号定义伪操作

6、3.2.2数据定义伪操作 3.2.3汇编控制伪操作 3.2.4其它常用的伪操作,3.2.1符号定义伪操作,常见的符号定义伪操作有如下几种: GBLA 、GBLL、GBLS LCLA、LCLL、LCLS SETA、SETL、SETS,例:使用示例,GBLA A1 A1 SETA 0x0F GBLL A2 A2 SETL TRUE GBLS A3 A3 SETS “TESTING”,3.2.2数据定义伪操作,DCB 分配一片连续的字节存储单元并初始化。表达式可以使0255的数值或字符串。可用“=”代替。 DCW(DCWU) 分配一片连续的半字存储单元并初始化。表达式可以为程序标号或数值表达式。 D

7、CD(DCDU) 分配一片连续的字存储单元并初始化。表达式可以为程序标号或数值表达式 DCDO DCI SPACE FIELD MAP等。,3.2.3汇编控制伪操作,IF 、ELSE 、ENDIF WHILE 、WEND MACRO 、MEND 、MEXIT,3.2.4其它常用的伪操作,AREA ALIGN CODE16 、CODE32 ENTRY EQU EXPORT(或GLOBAL) IMPORT EXTERN GET(或INLXUDE),常用的伪操作,AREA伪操作用于定义一个代码段或数据段 AREA 段名 ,属性1 ,属性2 一个大的程序可以包括多个代码段和数据段。一个汇编程序至少包含

8、一个段 AREA Example1,CODE, READONLY AREA Example2,DATA, READWRITE,常用的伪操作,EQU伪操作用于为程序中的常量、标号等定义一个等效的字符名称 名称 EQU 表达式,类型 abcd EQU 50;定义标号abcd的值为50 名称为EQU伪操作定义的字符名称,当表达式为32位的常量时,可以指定表达式的数据类型,可以有以下三种类型: CODE16 CODE32 DATA Addr EQU 0x54, CODE32; 定义Addr的值为0x54,且该处为32位的ARM指令。,常用的伪操作,ENTRY和END ENTRY用于指定汇编程序的入口

9、每一个汇编源程序都包含END伪操作,以告诉本源程序的结束 AREA Example1,CODE, READONLY ENTRY END,常用的伪操作,EXPORT或GLOBAL EXPORT用于在程序中声明一个全局的标号,该标号可在其他的文件中引用,可用GLOBAL代替。 AREA Example, CODE, READONLY EXPORT DoAdd ;下面的函数名称DoAdd可以被其他源文件引用 DoAdd ADD r0, r0, r1,常用的伪操作,CODE16及CODE32 因此,在使用 ARM 指令和 Thumb 指令混合编程的代码里,可用这两条伪指令进行切换,但注意他们只通知编译

10、器其后指令的类型,并不能对处理器进行状态的切换。 AREA Example, CODE, READONLY CODE32 ;通知编译器后面的指令为32位的 ARM指令 LDR R0, =start+1 BX R0 CODE16 Start MOV R1, #10,常用的伪操作,IMPORT 伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号 IMPORT Main ;通知编译器当前文件要引用标号Main,但Main在其他文件中定义,常用的伪操作,GET(或INCLUDE) 将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编

11、处理。 例: AREA Init,CODE,READONLY GET a1.s END,3.3 ARM汇编编程,AREA Add, CODE, READONLY ;程序起始定义 ENTRY ;第一条指令的标示符,只能有一个 ;下面是程序主体 Start MOV r0, #1 MOV r1, #2 BL doadd ;调用子程序 doadd ADD r0,r0,r1 ;r0=r0+r1 MOV pc, lr END ;END伪指令必须和ENTRY配对使用,3.3 ARM汇编例子,例:已知32位变量X、Y存放在存储器的地址0x90010、0x90014中,要求实现Z=X+Y,其中Z的值存放在0x9

12、0018中。,3.3 ARM汇编例子,代码编写: AREA EX,CODE,READONLY ENTRY CODE32 START LDR R0,=0x90010; LDR R1,R0,#4 LDR R2,R0,#4 ADD R1,R1,R2 STR R1,R0 B START END,3.3 ARM汇编例子,例: 已知32位有符号数X存放在存储器的地址0x90010中,要求实现: Y=,X (X=0),-X (X0),其中Y值放在0x90010中。,3.3 ARM汇编例子,START LDR R1,=0x90010 MOV R0,#0 LDR R2,R1 CMP R2,#0 SUBLT R2

13、,R0,R2 STR R2,R1,3.4 C语言与汇编语言,在应用系统的程序设计中,若所有的编程任务均用汇编语言来完成,其工作量是可想而知的,同时不利于系统升级或应用软件移植 ARM体系结构支持C/C+以及与汇编语言的混合编程,在一个完整的程序设计中,除了初始部分用汇编语言完成以外,其主要的编程任务一般都用C/C+完成,3.4 汇编语言与C语言的混合编程,下面通过几个例子进一步了解内联汇编的语法。 (1)字符串的复制 下面的例子使用一个循环完成了字符串的复制工作。,3.4 汇编语言与C语言的混合编程,#include void my_strcpy(const char *src, char *

14、dst) int ch; _asm loop: LDRB ch, src, #1 STRB ch, dst, #1 CMP ch, #0 BNE loop ,3.4 汇编语言与C语言的混合编程,int main(void) const char *a=“hello world!”; char b20; my_strcpy(a,b); printf(“original string:%sn”,a); printf(“copied string:%sn”,b); return 0; ,3.4 汇编语言与C语言的混合编程,2)中断使能 下面的例子通过读取程序状态寄存器(CPSR)并设置它的中断使能位

15、bit7来禁止/打开中断。需要注意的是,该例只能运行在系统模式下,因为用户模式是无权修改程序状态寄存器的。,3.4 汇编语言与C语言的混合编程,_inline void enable_IRQ(void) int tmp; _asm MRS tmp, CPSR BIC tmp, tmp, #0x80 MSR CPSR_c, tmp ,3.4 汇编语言与C语言的混合编程,_inline void disable_IRQ(void) int tmp; _asm MRS tmp, CPSR ORR tmp, tmp, #0x80 MSR CPSR_c, tmp int main(void) disable_IRQ(); enable_IRQ(); ,课后练习,试分析下面几段ARM汇编程序的执行结果: (1) AREA Example, CODE, READONLY EXPORT test IMPORT test1 ENTRY test LDR R1, =test LDR R0, R1 ADD R0, R0, #1 STR R0, R1 MOV PC, LR END,小结:,本章介绍了ARM程序设计的过程与方法,包括汇编语言编程、伪指令的使用、汇编与C的混合编程。这些内容是嵌入式编程的基础。,

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

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

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