05—基于ARM的嵌入式程序设计.ppt
文本预览下载声明
第 5 章;主要内容:;一、ARM 汇编语言程序设计;1、两种常用 IDE 简介;2、ADS/SDT 下的伪操作;伪操作;伪操作;伪操作;伪操作
;伪操作;3、ARM 汇编语言伪指令;4、ARM 汇编语言的文件和语句;ARM汇编语言语句格式如下所示:
{symbol} {instruction|directive|pseudo-instruction}
{;comment}
其中:
instruction为指令
directive为伪操作
pseudo-instruction为伪指令
symbol为符号
comment为语句的注释 ;ARM汇编语言源程序的基本结构举例:;5、ARM 汇编语言编程的几个问题; 32位立即数在32位指令中的编码以及ARM特有的寄存器移位操作是数据处理方面的难点;汇编语言子程序调用及返回;跳转表思想;ARM与Thumb之间的状态转换及函数的互相调用;6、ARM 汇编语言编程示例;AREA Block,CODE,READONLY
NUM EQU 20
ENTRY
LDR R0 , = src
LDR R1 , = dst
MOV R2 , # NUM
MOV SP , # 0x400
Bcopy MOVS R3 , R2 , LSR # 3
BEQ Cword
STMFD SP ! , { R4 - R11 }
Ocopy LDMIA R0 ! , { R4 - R11 }
STMIA R1 ! , { R4 - R11 }
SUBS R3 , R3 , # 1
BNE Ocopy; LDMFD SP ! , { R4 - R11 }
Cword ANDS R2 , R2 , # 7
BEQ Stop
Wcopy LDR R3 , [ R0 ] , # 4
STR R3 , [ R1 ] , # 4
SUBS R2 , R2 , # 1
BNE Wcopy
Stop MOV R0 , # 0x18
LDR R1 , = 0x20026
SWI 0x123456 ;将CPU控制权交给调试器
AREA Bdata,DATA,READWRITE
src DCD 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4
dst DCD 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0
END;二、C 与汇编语言混合编程;1、嵌入式 C 语言程序设计的几个问题; 在变量声明的时候,最好把所有相同类型的变量放在一起定义,这样可以优化存储器布局。由下例可以看出:
对于局部变量类型的定义,使用short或char来定义变量并不是总能节省存储空间。有时使用32位int或unsinged int局部变量更有效率一些,如下图所示:
变量定义中,为了精简程序,程序员总是竭力避免使用冗余变量。但有时使用冗余变量可以减少存储器访问的次数这可以提高系统性能。 ; 为了使各自单独编译的C语言程序和汇编程序能够互相调用,定义了统一的函数过程调用标准ATPCS。ATPCS规定寄存器组中的{R0~R3}作为参数传递和结果返回寄存器,如果参数数目超过四个,则使用堆栈进行传递。
内部寄存器的访问速度是远远大于存储器的,所以要尽量使参数传递在寄存器里面进行,即应尽量把函数的参数控制在四个以下。 ;③ 循环条件;2、C 与汇编语言混合编程及示例;① ATPCS 规则;寄存器; 根据堆栈指针指向位置的不同 和增长方向的不同可以分为以下4种数据栈 :
FD (Full Descending) 满递减
ED (Empty Descending)空递减
FA (Full Ascending) 满递增
EA (Empty Ascending) 空递增
ATPCS规定数据栈为FD(满递减)类型,并且对数据栈的操作是8字节对齐的。 ;参数个数固定的子程序参数传递规则:
第一个整数参数,通过寄存器R0~R3来传递。其他参数通过数据栈传递。
参数个数可变的子程序参数传递规则:
当参数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数
子程序结果返回规则
结果为一个32位整数时,可以通过寄存器R0返回;结果为一个64位整数时,可以通过寄存器R0和R1返回,
显示全部