嵌入式系统第四章ARM汇编语言程序设计.
ARM嵌入式系统结构与编程习题答案邱铁著

ARM嵌入式系统结构与编程习题答案邱铁著第8章ARM汇编语言与嵌入式C混合编程1.严格按照嵌入式C语言的编程规范,写一个C语言程序,实现将一个二维数组内的数据行和列进行排序。
答:略2.嵌入式C程序设计中常用的移位操作有哪几种,请说明每种运算所对应的ARM指令实现。
答:移位操作分为左移操作与右移操作左移运算符―<右移运算符―>>‖实现将―>>‖左边的操作数的各个二进制位向右移动―<对于空位的补齐方式,无符号数与有符号数是有区别的。
对无符号数进行右移时,低位丢弃,高位用0补齐,其值相当于除以:2―右移位数‖次方对有符号数进行右移时,根据处理器的不同选择逻辑右移或算术右移3.volatile限制符在程序中起到什么作用。
请举例说明。
答:volatile的本意为―暂态的‖或.―易变的‖,该说明符起到抑制编译器优化的作用。
如果在声明时用―volatile‖关键进行修饰,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供特殊地址的稳定访问。
例:硬件端口寄存器读取Char某=0,y=0,z=0;某=ReadChar(0某54000000);//读端口y=某;某=ReadChar(0某54000000);//再读端口z=某;以上代码可能被编译器优化为Char某=0,y=0,z=0;某=ReadChar(0某54000000);//读端口y=某;z=某;为了确保某的值从真实端口获取,声明时应该为Volatilechar某;Chary,z;4.请分析下列程序代码的执行结果。
#includemain(){intvalue=0某FF1;int某p1,某某p2,某某某p3,某某某某p4;p1=&value;p2=&p1;p3=&p2;p4=&p3;printf(\}答:程序输出结果为:某某某某p4=40815.分析宏定义#definePOWER(某)某某某是否合理,举例说明。
第四讲 ARM汇编语言及嵌入式C混合编程ppt课件

TM
23
内嵌汇编器与armasm汇编器的区别
指令中使用的C变量不能与任何物理寄存器同名, 否则会造成混乱
不支持BX和BLX指令 使用内嵌汇编器,不能通过对程序计数器PC赋值,
(4)通用寄存器R13用作数据栈指针,记作 SP。
TM
5
(5)通用寄存器R14用作链接寄存器 ;
(6)通用寄存器R15用作程序计数器,记作 PC 。
TM
6
8.5.2数据栈使用规则
过程调用标准规定数据栈为FD类型,并且对 数据栈的操作时要求8字节对齐的。
TM
7
8.5.3参数传递规则
1.参数个数可变的子程序参数传递规则 对于参数个数可变的子程序,当参数个数不
超过4个时,可以使用寄存器R0~R3来传递; 当参数个数超过4个时,还可以使用数据栈进 行参数传递。
TM
8
2.参数个数固定的子程序参数传递规则
如果系统不包含浮点运算的硬件部件且没有浮点参 数时,则依次将各参数传送到寄存器R0~R3中, 如果参数个数多于4个,将剩余的字数据通过数据 栈来传递;
如果包括浮点参数则要通过相应的规则将浮点参数 转换为整数参数,然后依次将各参数传送到寄存器 R0~R3中。如果参数多于4个,将剩余字数据传送 到数据栈中,入栈的顺序与参数顺序相反,即最后 一个字数据先入栈。
TM
35
每一步:建立启动C程序的代码,请读者参阅前面 的章节自行建立。
每二步:建立C语言源文件main.c
TM
36
每三步:建立汇编源文件Factorial.s
05-基于ARM的嵌入式程序设计

程序体部分实现了一个简单的加法运算。
5、ARM 汇编语言编程的几个问题
➢ ARM数据处理操作 ➢ 设置条件码 ➢ 汇编语言子程序调用及返回 ➢ 跳转表思想 ➢ ARM与Thumb之间的状态转换及函数的互相调用
ARM数据处理操作 32位立即数在32位指令中的编码以及ARM特有
的寄存器移位操作是数据处理方面的难点
将一文件包含到当前源文件中,被包含文件不进行汇编处理
告诉编译器将局部符号包含在目标文件的符号表中
禁止源程序中包含浮点运算指令
指定段之间的相互依赖关系
为一个特定的寄存器定义名称
定义局部变量的有效范围
3、ARM 汇编语言伪指令
伪指令
语法格式
作用
ADR
ADR{cond} register, 将基于PC或基于寄存器的地址值读取到寄
设置条件码
ARM的任何数据处理指令都能通过增加“S” 操作码来设置条件码N、Z、C、V。
每条指令都可以条件执行。 在程序中可以通过条件码的使用让微处理器决 定是否进行转移,还可用来控制循环的退出。
汇编语言子程序调用及返回
在ARM汇编语言中,子程序调用是通过BL指令来 完成的。BL subname 其中,subname是被调用的子 程序的名称。
文件
ARM汇编语言是以段(section)为单位来组织源文 件的。段是相对独立的、具有特定名称的、不可分割的 指令或者数据序列。一个ARM源程序至少需要一个代码 段,大的程序可以包含多个代码段和数据段。
ARM汇编语言语句格式如下所示:
{symbol} {instruction|directive|pseudo-instruction} {;comment}
{label} DCFS{U} fpliteral 为单精度的浮点数分配字对齐的内存单元
嵌入式系统设计与开发第4章 ARM汇编语言程序设计1PPT课件

11.08.2020
信息学院-通信教研室-油海东
10
RLIST
名称 RLIST(Rename LIST) {寄存器列表} 用于对一个通用寄存器列表定义名称 ,使用该
伪指令定义的名称可在ARM指令LDM/STM中 使用 RegList RLIST {R0-R5,R8,R10} ; 将寄存器列表名称定义为RegList,可在ARM 指令LDM/STM中通过该名称访问寄存器列表
定义一个全局的数字变量,并初始化为0
GBLL(GloBaL Logic) 全局变量名
定义一个全局的逻辑变量,并初始化为{false}
GBLS(GloBaL String) 全局变量名
定义一个全局的字符串变量,并初始化为空
11.08.2020
信息学院-通信教研室-油海东
7
局部变量声明
LCLA(LoCaL Arithmetic) 局部变量名
给一个数学变量赋值
变量名 SETL(SET Logic) 表达式
给一个逻辑变量赋值
变量名 SETS(SET String) 表达式
给一个字符变量赋值
11.08.2020
信息学院-通信教研室-油海东
9
举例
GBLA Test1 ;全局的数字变量,变量名为Test1 Test1 SETA 0xaa ;将该变量赋值为0xaa LCLL Test5 ;局部的逻辑变量,变量名为Test5 Test5 SETL {TRUE} ;将该变量赋值为真 LCLS Test6 ;局部的字符串变量,变量名为Test6 Test6 SETS “Testing”;将该变量赋值为“Testing”
11.08.2020
信息学院-通信教研室-油海东
备工作 伪指令仅在汇编过程中起作用,一旦汇编结束,伪指
ARM嵌入式系统 第4-1章 ARM汇编语言程序设计

15
符号定义伪指令Ⅳ
3. SETA、SETL、SETS 、 、
格式: 格式:变量名 SETA/SETL/SETS 表达式
说明: 说明:
SETA:给一个数字变量赋值; :给一个数字变量赋值; SETL:给一个逻辑变量赋值; :给一个逻辑变量赋值; SETS:给一个字符串变Ⅳ量赋值; :给一个字符串变Ⅳ量赋值;
在宏内定义局部变量后, 在宏内定义局部变量后,则在宏外使用该指令时编 13 译会出错。 译会出错。
符号定义伪指令Ⅲ
2. GBLA、GBLL、GBLS 、 、
格式: 格式:GBLA/GBLL/GBLS 变量名
伪操作定义一个汇编程序中的全局变量,并初始化, 伪操作定义一个汇编程序中的全局变量,并初始化, 其中: 其中:
Array1 DCB 1,2,3,4,5 ;数组 str1 DCB “Your are welcome!” ;构造 ! 字符串并分配空间。 字符串并分配空间。
22
2. DCW/DCWU:
标号/变量 标号 变量 DCW/DCWU 表达式
DCW分配一段半字存储单元并用表达式值初 分配一段半字存储单元并用表达式值初 始化,它定义的存储空间是半字对齐的。 始化,它定义的存储空间是半字对齐的。 DCWU功能跟 功能跟DCW类似,只是分配的字存储 类似, 功能跟 类似 单元不严格半字对齐。 单元不严格半字对齐。 例如: 例如:
所有的标签必须在一行的开头顶格写, 所有的标签必须在一行的开头顶格写,前面不能留 空格,后面也不能跟C语言中的标签一样加上 ” 语言中的标签一样加上“ 空格,后面也不能跟 语言中的标签一样加上“:”; ARM汇编器对标识符的大小写敏感 书写标号及指 汇编器对标识符的大小写敏感,书写标号及指 汇编器对标识符的大小写敏感 令时字母的大小写要一致; 令时字母的大小写要一致; 注释使用“ ”符号,注释的内容从“ ” 注释使用“;”符号,注释的内容从“;”开始到该 行的结尾结束。 行的结尾结束。 例:
嵌入式系统(第4章 汇编语言程序设计)

COMPUTER SCIENCE AND TECHNOLOGY
汇编语言程序的结构3
Zhaohw@
汇编语言程序的结构4
COMPUTER SCIENCE AND TECHNOLOGY
• ARM的汇编语言程序一般由几个段组成,每个段均 由AREA伪操作定义。 • 段可以分为多种,如代码段、数据段、通用段, 每个段又有不同的属性,如代码段的默认属性为 READONLY,数据段的默认属性为READWRITE。 • 本程序定义了两个段,第一个段为代码段codesec, 它在存储器中存放用于程序执行的代码以及main 函数的本地字符串;第二个段为数据段 constdatasec,存放了全局的字符串,由于本程 序没有对数据进行写操作,该数据段定义属性为 READONLY。
第4章 汇编语言程序设计
COMPUTER SCIENCE AND TECHNOLOGY
• 汇编语言源程序格式 • 汇编语言上机过程 • 汇编语言与C语言混合编程技程序文件类型
COMPUTER SCIENCE AND TECHNOLOGY
文件类型 汇编语言源文件 C语言源文件 C++源文件 引入文件
Zhaohw@
汇编语言的常量
COMPUTER SCIENCE AND TECHNOLOGY
• 常量:其值在程序运行过程中不能被改变的量。 (1)数字常量:数字常量有3种表示方式: • 十进制数,如1、2、123 • 十六进制数,如 0x123,0xabc • n进制数,形式为n_XXX,n的范围是2到9,XXX是 具体数字 (2)字符常量:由单引号及中间的字符组成,包括 C语言中的转义字符,如’a’,’\n’ (3)字符串常量:由一对双引号及中间的字符串表 示,中间也可以使用C语言中的转义字符,比如: “abcdef\0xa\r\n” (4)逻辑常量:{TRUE},{FALSE},注意带大括号
嵌入式系统 第四章 ARM汇编语言程序设计

• DCB 格式:标号 DCB 表达式
功能:DCB伪操作用于分配一片连续的字节存储单 元,并用伪操作中指定的表达式初始化。其 中,表达式可以为0~255的数值或字符串。 DCB也可以用“=”代替。 示例: Str DCB “This is a test!”
• DCW 格式:标号 DCW 表达式
功能:DCW伪操作用于分配一片连续的半字存储单 元,并用伪操作中指定的表达式初始化。其 中,表达式可以为程序标号或数值表达式。用 DCW分配的存储单元是半字对齐的。 示例: DataTest DCW 1,2,3
顺序程序设计: 已知32位变量X、Y存放在存储器的地址0x90010、 0x90014中,要求实现Z=X+Y,并且Z的值存放在 0x90018中。 AREA Exam,CODE,READONLY ENTRY START LDR R0,=0x90010 LDR R1,[R0], #4 LDR R2,[R0],#4 ADD R1,R1,R2 STR R1,[R0] END
数据定义伪操作
数据定义伪操作用于为特定的数据分配存储单元,同时可完 成已分配存储单元的初始化。 DCB DCW DCD SPACE MAP FIELD 分配一片连续的字节存储单元并初始化。 分配一片连续的半字存储单元并初始化。 分配一片连续的字存储单元并初始化。 分配一片连续的存储单元并初始化为0。 定义一个结构化的内存表首地址。 定义一个结构化的内存表的数据域。
在代码段开始处写出变量、段寄存器、 (2)在代码段开始处写出变量、段寄存器、外围设 备等所需要的初始化指令 选择实现算法中每一主要动作所需要的指令, (3)选择实现算法中每一主要动作所需要的指令, 并决定数据在这些指令中的存放形式。 并决定数据在这些指令中的存放形式。 按照主要指令的要求, 指令或MOV (4)按照主要指令的要求,用LDR、STR指令或 指令或 指令把数据送到正确的位置。 指令把数据送到正确的位置。
ARM汇编语言编程详解

ARM汇编语言编程详解硅谷芯微嵌入式学院技术贡献网址:4.1 汇编语言使用汇编语言编写程序,它的特点是程序执行速度快,程序代码生成量少,但汇编语言是一种不易学习的编程语言,并且可读性较差,这种语言属于低级语言。
每一种汇编语言对应每一款芯片,使用这种语言需要对硬件有深刻的了解。
在通常情况下,可以使用汇编语言编写驱动程序、需要严格计算执行时间的程序以及需要加速执行的程序。
先介绍一个例子来说明ARM汇编程序的格式。
例1 计算20+8,结果放入R0寄存器。
AREA Buf, DATA, READWRITE ;声明数据段Buf Count DCB 20 ;定义一个字节单元Count AREA Example, CODE, READONLY ;声明代码段ExampleENTRY ;标识程序入口CODE32 ;声明32位ARM指令STARTLDRB R0, Count ;R0 = Count =20MOV R1, #8 ;R1 = 8ADD R0, R0, R1 ;R0 = R0 + R1B STARTEND例1中定义了两个段:数据段Buf和代码段Example 。
数据段中定义了字节单元Count,其中Count用来保存一个被加数;代码段中包含了所有源程序代码,程序中首先读取Count字节单元的内容,然后与立即数8相加,计算结果保存到R0中。
由例1可见,ARM汇编语言的源程序是分段的,由若干个段组成一个源程序。
源程序的一般格式为:AREA name1, attr ;声明特定的段标号语句1 ;语句...语句nAREA name2, attr标号语句n+1...语句n+mEND ;结束符每一个段都有一个名字,并且段名是唯一的。
每个段以符号AREA作为段的开始,以碰到下一个符号AREA 作为该段的结束。
段都有自己的属性,如是代码段(CODE)还是数据段(DATA),是只读(READONLY )还是可读写(READWRITE)?这些属性可以在attr栏中设定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)表达式是一个基于绝对地址的内存表:
MAP 0x100 ;首地址为0x100
A FIELD 4 ;A的长度为4字节,位臵为0x100 B FIELD 4 ;B的长度为4字节,位臵为0x104 S FIELD 16 ;S的长度为16字节,位臵为0x108 …. LDR R0, =A ;读取A的地址0x100
Start
AREA Init, CODE, READONLY ENTRY Start LDR R0, =0x3FF5000 LDR R1, 0xFF BL PRINT_TEXT …. …. PRINT_TEXT …. …. MOV PC, LR END
;FULL SEGMENT DEFINITION-----Intel 8086 ;-----stack segment-------STACK SEGMENT DB 64 DUP(?) STACK ENDS ;-----data segment-------DATA SEGMENT ;data definitions are placed here DATA ENDS ;-----code segment-------CODE SEGMENT MAIN PROC FAR ASSUME CS: CODE, DS: DATA, SS: STACK MOV AX, DATA MOV DS, AX - ----MOV AH, 4CH INT 21H MAIN ENDP CODE ENDS END MAIN
(3)表达式是一个标号,基于PC的内存表:
Data SPACE 100 ;分配100字节的内存单元初始化0
MAP Data
A B S …. LDR R5, FIELD 4 FIELD 4 FIELD 4
• DCD
格式:标号 DCD 表达式
功能:DCD伪操作用于分配一片连续的字存储单
元,并用伪操作中指定的表达式初始化。其
中,表达式可以为程序标号或数值表达式。用
DCD分配的存储单元是字对齐的。DCD也可
以用 “&‖代替。
示例:
Test DCD
4, 5, 6
• SPACE
格式:标号 SPACE 表达式 功能:SPACE伪操作用于分配一片连续的存储区 域并初始化为0。其中,表达式为要分配的字 节数。SPACE也可以用 “%‖代替。
;S的长度为96字节,相对位臵为12 =0x900 A [R0] =0x2000 B [R1] ;表的首地址为0x904 ;读取A的地址0x904 ;将A的内容读到R2 ;同一表的首地址为0x2004 ;读取B的地址0x2008 ;将R9的内容写到B
LDR ADR LDR …. LDR ADR STR
4.1.2 汇编语言的语句格式
ARM汇编语言程序的每行语句由1~4部分组成。
[LABEL] 标号域 OPERATION 操作助记符域 [OPERAND] 操作数域 [;COMMENT] 注释域
4.2 ARM汇编器的伪操作
•符号定义伪操作(Symbol Definition) •数据定义伪操作(Data Definition )
第四章 ARM汇编语言程序设计
4.1 汇编语言程序格式 4.2 ARM汇编器的伪操作
4.3 汇编语言上机过程 4.4 汇编语言程序设计
4.1 汇编语言程序格式
4.1.1 汇编语言程序的组成
AREA Init, CODE, READONLY ENTRY LDR R0, =0x3FF5000 LDR R1, 0xFF STR R1, [R0] LDR R0, =0x3FF5008 LDR R1, 0x01 STR R1, [R0] …. END
• FIELD
格式:标号 FIELD 表达式
功能: FIELD伪操作用于定义一个结构化的内存表中 的数据域。表达式的值为当前数据域在内存表中 所占的字节数。 FIELD伪操作常与MAP配合使用 来定义结构化的内存表。注意:MAP和FIELD仅 用于定义数据结构,并不实际分配存储单元。
FIELD也可以用 “#‖代替。
分配一片连续的半字存储单元并初始化。
分配一片连续的字存储单元并初始化。 分配一片连续的存储单元并初始化为0。 定义一个结构化的内存表首地址。 定义一个结构化的内存表的数据域。
• DCB
格式:标号 DCB 表达式
功能:DCB伪操作用于分配一片连续的字节存储单 元,并用伪操作中指定的表达式初始化。其 中,表达式可以为0~255的数值或字符串。 DCB也可以用“=‖代替。
示例:
Str DCB ―This is a test!‖
• DCW
格式:标号 DCW 表达式
功能:DCW伪操作用于分配一片连续的半字存储单 元,并用伪操作中指定的表达式初始化。其 中,表达式可以为程序标号或数值表达式。用 DCW分配的存储单元是半字对齐的。 示例: DataTest DCW 1, 2, 3
LDR
R1,
[R0] ;将A的内容读到 R1
(2)表达式是一个数值,是一个相对地址的内存表:
MAP 0x04 ,R9 A FIELD 4 ;首地址为R9的值 ;A的长度为4字节,相对位臵为0
B
S ….
FIELD 8
FIELD 96 R9, R0, R2, R9, R1, R9,
;B的长度为8字节,相对位臵为4
•汇编控制伪操作(Assembly Control)
•框架描述伪操作(Frame Description) •其他伪操作(Miscellaneous)
数据定义伪操作
数据定义伪操作用于为特定的数据分配存储单元,同时可完
成已分配存储单元的初始化。
DCB 分配一片连续的字节存储单元并初始化。
DCW
DCD SPACE MAP FIELD
示例:
DataSpace SPACE 100
• MAP
格式:MAP 表达式 {,基址寄存器}
功能:MAP伪操作用于定义一个结构化的内存表首地址。达式可以为程序标号或数值表达式,基
址寄存器为可选项,当基址寄存器选项不存在
时,表达式的值即为内存表的首地址。否则,
内存表的首地址为表达式的值与基址寄存器的 和。也可以用 “^‖代替。 示例: MAP 0x100,R0 ;首地址的值为0x100+R0