嵌入式系统设计与开发第8章 ARM汇编语言程序设计-2
ARM汇编语言程序设计

是由物理寄存器r1来存放r0所代表的值。
Chavezwang@
计算机学院嵌入式实验室
19
北京理工大学珠海学院
嵌入式系统设计及应用开发
内联汇编中虚拟寄存器举例
int main(void) #include <stdio.h> void test_inline_register(void) { int i; int r5,r6,r7; __asm { MOV i,#0 loop: MOV r5,#0 MOV r6,#0 MOV r7,#0 ADD i,i,#1 CMP i,#3 BNE loop } }
北京理工大学珠海学院
嵌入式系统设计及应用开发
何时使用内联汇编和嵌入型汇编
程序中使用饱和算术运算(Saturating arithmetic),如SSAT16 和 USAT16指令。
程序中需要对协处理器进行操作。 在C或C++程序中完成对程序状态寄存器的操作
注:使用内联汇编编写的程序代码效率也比较高
③ 不能在程序中使用“.”或{PC}得到当前指令地址值。
④ 在16进制常量前加“0x”。
⑤ 建议不要对堆栈进行操作。
Chavezwang@
计算机学院嵌入式实验室
16
北京理工大学珠海学院
嵌入式系统设计及应用开发
内联汇编的限制2
⑥ 编译器可能会使用r12和r13寄存器存放编译的中间结果, 在计算表达式值可能会将寄存器r0~r3、r12及r14用于子程 序调用。另外在内联汇编中设置程序状态寄存器CPSR中的 标志位NZCV时,要特别小心。内联汇编中的设置很可能会 和编译器计算的表达式的结果冲突。
编译器使用一套规则的来设置寄存器的用法
ARM嵌入式系统结构与编程(第2版)_第6-8章_习题答案

BNE
loop_2
Stop:
B
Stop
.end (2).在 ARM 集成开发环境下编程:
AREA Fctrl, CODE, READONLY
ENTRY
CODE32
START
MOV
R0,#0xB000
MOV
R1,#0x10000001
MOV
R2,#100
loop_1
STR
R1,[R0],#4
ADD
R1,R1,#1
解答: 伪指令是 ARM 处理器支持的汇编语言程序里的特殊助记符,它不在处理器运
行期间由机器执行,只是在汇编时将被合适的机器指令代替成 ARM 或 Thumb 指令, 从而实现真正的指令操作。
伪操作(Directive)是 ARM 汇编语言程序里的一些特殊的指令助记符,其作用主要 是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运 行期间由处理器执行.也就是说,这些伪操作只是汇编过程中起作用,一旦汇编结束,伪 操作也就随之消失。
(1)分配一段字节内存单元,并用57, 0x11, 031, ‘Z’,0x76进行初始化;
《ARM 嵌入式系统结构与编程》第 2 版,邱铁 编著. 清华大学出版社. 2013 年 8 月第 2 版,2015 年 8 月第 4 次印刷
(2)分配一段半字内存单元,并用0xFFE0,0xAABB,0x12,进行初始化;
《ARM 嵌入式系统结构与编程》第 2 版,邱铁 编著. 清华大学出版社. 2013 年 8 月第 2 版,2015 年 8 月第 4 次印刷
《ARM 嵌入式系统结构与编程》第 2 版,第 6~8 章
思考与练习题答案(此答案仅供教师教学用)
ARM汇编语言与嵌入式C混合编程

TM
13
8.2.2按位或操作
按位或操作运算符“|”是把参与运算的两个 操作数对应的各个二进制位进行按位相或。 对应的两个二进制位中只要有一个为1,结果 就为1,当两个对应的二进制位都为0时,结 果位为0。参与运算的两个操作数均以补码形 式出现。
TM
14
14
例如7 | 3,7的补码为0000 0111,3的补码 为0000 0011,结果为0000 0111。按位与操 作可以实现将特定位的置位操作,也可以用 于提取出某数的指定位。
{
...
// 程序代码 B
TM
5
5
8.1.2 命名规则
(1)标识符的名称要简明,能够表达出确切的含义 ,可以使用完整的单词或通常可以理解的缩写。
(2)如果在命名中使用特殊约定或缩写,则要进 行注释说明。
(3)对于变量命名,一般不取单个字符 ,例如i、j 、k...
(4)函数名一般以大写字母开头;所有常量名字 母统一用大写。
优秀的代码还要具备易读性、易维护性、具 有可移植和高可靠性。
TM
3
3
8.1.1 嵌入式C程序书写规范
排版规则如下: (1)程序块要采用缩进风格编写 (2)较长的语句(例如超过80个字符)要分成多行书写 (3)循环、判断等语句中若有较长的表达式或语句,则要
进行适应的划分 (4)若函数或过程中参数较长,也要进行适当的划分。 (5)每行一般只写一条语句 (6)程序块的分界符语句的大括号“{”与“}”一般独占一
TM
6
6
8.1.3 注释说明
注释有助于程序员理解程序的整体结构,也便于以 后程序代码的维护与升级。常用的规则如下:
(1)注释语言必须准确、简洁且容易理解; (2)程序代码源文件头部应进行注释说明 ; (3)函数头部应进行注释; (4)程序中所用到的特定含义的常量、变量,在
ARM汇编语言程序设计基础第8章嵌入式系统

(2)中断方式 中断方式又称为前后台系统形式,系统在循环轮转方式的基础上
增加了中断处理功能。ISR(Interrupt Service Routine,中断服 务程序)负责处理异步事件,即前台程序(foreground),也称 为事件处理级程序。而后台程序(background)是一个系统管理 调度程序,一般采用的是一个无限的循环形式,负责掌管整个嵌 入式系统软、硬件资源的分配、管理以及任务的调度。后台程序 也称为任务级程序。一般情形下,后台程序会检查每个任务是否 具备运行条件,通过一定的调度算法来完成相应的操作。而一些 对实时性有要求的操作通常由中断服务程序来完成,大多数的中 断服务程序只做一些最基本的操作,如标记中断事件的发生等, 其余的事情会延迟到后台程序去完成。
2.有操作系统的嵌入式软件 从20世纪80年代开始,操作系统出现在嵌入式系统上。如今,嵌
入式操作系统在嵌入式系统中广泛应用,尤其是在功能复杂、系 统庞大的应用中显得愈来愈重要。在应用软件开发时,程序员不 是直接面对嵌入式硬件设备,而是采用一些嵌入式软件开发环境, 在操作系统的基础上编写程序。
在控制系统中,采用前后台系统体系结构的软件,在遇到强干扰 时,可能会使应用程序产生异常、出错,甚至死循环的现象,从 而造成系统的崩溃。而采用嵌入式操作系统管理的系统,在遇到 强干扰时,可能只会引起系统中的某一个进程被破坏,但这可以 通过系统的监控进程对其进行修复,系统具有自愈能力,不会造 成系统崩溃。
在分层结构中,设备驱动程序中的函数分为硬件接口和调用接口 两种类型。硬件接口直接跟硬件打交道的,直接去操作和控制硬 件设备;调用接口不直接与硬件打交道,它们调用硬件接口当中 的函数,与上层软件(包括操作系统、中间件和应用软件)打交 道的。分层结构把所有与硬件有关的细节都封装在硬件接口当中, 在硬件要升级时,只需要改动硬件接口当中的函数即可,而上层 接口当中的函数不用做任何修改。
嵌入式系统开发基础——基于8位单片机的C语言程序设计(第二版)

(表达式) {语句;} (表达式) {语句 1;} else (表达式 1) {语句 1;} if (表达式 2) (语句 2; ) if (表达式 3) (语句 3; ) if(表达式 n-1) (语句 n-1; ) {语句 n}
第三章习题
1,STC89C51/STC89C52 单片机在硬件结构上和 MCS-51 的 8051/8751 有哪些不同? STC 89C51/89C52 单片机继承了 MCS-51 单片机的所有功能,在芯片引脚(见图 2-1) 和系统指令方面完全兼容,同时增加了许多新功能, 如 WDT 技术(watchdog ,看门狗定 时器) 、ISP(In_System Programming ,在系统编程,无须将存储芯片从嵌入式设备拔出既 可对其编程,简称 ISP) 、SPI(Serial Peripheral Interface ,串行外设接口)等技术,时钟 频率提高到 80MHz。 STC 89C51/89C52 单片机在 MCS-51 单片机基础上增加了一个 P4 口, 该口的使用同 P1、 P2、P3 口一样,口地址是 0XE8。 STC 89C51 将 MCS-51 系列中的 8751 的 4KB 片上 EPROM 改为 4KB 的 Flash, 使得 STC 89C51 可以不使用仿真器在线编程或使用仿真器重复编程。 2,什么是 ISP,什么是 IAP?它们在系统调试时有什么作用? ISP(In_System Programming ,在系统编程,无须将存储芯片从嵌入式设备拔出既可对 其编程,简称 ISP ) ,IAP (In-Application Programming )是应用在 FLASH 程序存储器基础 上的一种编程模式,它可以在应用程序正常运行情况下,通过 IAP 程序对另外一段程序 FLASH 空间进行读/写操作,甚至可以控制对某段、某字节的读/写操作,这给数据存储和硬 件现场升级带来了更大的灵活性。IAP 和 ISP 功能是 STC89C51/89C52 单片机的特别重要功 能。 4,在满足系统要求情况为什么单片机要尽量采用较低频率? 因为低频率可以降低系统功耗,减少发热,增加系统稳定性。 5,低电平电源的单片机适用在什么场合? 在便携式、袖珍式、电池供电的手持产品中应选这类单片机。 6,最小系统中晶振的傍路电容有什么作用,如何选择? 帮助起振,其值大小对振荡频率有一定影响。
第二部分习题答案

第六章1、ARM处理器的特点是什么?答:ARM处理器立足于嵌入式市场,其设计思想并不单纯地追求处理器速度,而是着眼于系统的整体性能。
具体来讲,主要包括以下几个方面。
首先,低功耗是一个主要的考虑方面。
其次,高代码密度是嵌入式系统的又一个重要需求。
另外,嵌入式系统通常都是价格敏感的。
还有一个影响嵌入式系统性能的因素就是处理器内核管芯(die)的面积,对于一个单片方案,处理器内核所占的面积越小,留给外设电路的空间就越大,这可以减少最终产品的外围芯片数目,从而降低设计和制造成本。
在体系结构方面,ARM处理器采用精简指令系统计算机(RISC)结构,但ARM处理器又不是纯粹的RISC。
为了能够更好地满足嵌入式应用的需求,ARM处理器还增加了以下特点:●一些特定指令的周期数可变,即并不是所有的ARM指令都是单周期的。
●内嵌桶形移位器产生了更为复杂的指令。
●Thumb 16位指令集。
●条件执行。
这个特性可以减少分支指令的数目,从而改善性能,提高代码密度。
2、ARM处理器系列主要包括几大类?各自的特性是什么?3、ARM处理器有哪些处理器模式?各自如何切换?答:ARM处理器有7种处理器模式,它们分别是:用户模式,快速中断模式,外部中断模式,管理模式,中止模式,未定义模式和系统模式。
各模式之间的切换,可以通过软件控制来实现,也可以由外部中断或异常而引起。
处理器复位之后,首先进入管理模式,操作系统内核通常处于这种模式。
当运行用户程序时,进入用户模式。
在用户模式下,应用程序不能访问一些受操作系统保护的系统资源,应用程序也不能直接进行处理器模式的切换,只允许对CPSR(当前程序状态寄存器)的控制域进行读操作,但允许对CPSR条件标志的读/写访问,用户模式下执行软中断指令(SWI)时也进入管理模式。
系统模式是一种特殊的用户模式,它使用和用户模式完全相同的寄存器,但允许对CPSR的完全访问,当操作系统任务需要访问系统资源但又想避免访问与异常模式相关的寄存器时进入该模式。
嵌入式系统结构-第8章 ARM汇编语言与嵌入式C混合编程

TM
20
8.2.5 移位操作
n 移位操作分为左移操作与右移操作。 n 左移运算符“<<”实现将“<<”左边的 操作数的各个二进制位向左移动“<<”右
n 边操作数所指定的位数,高位丢弃,低 位补0。 n 相当于乘以:2的“左移位数”次方
。
TM
21
n 右移运算符“>>”实现将“>>”左边的 操作数的各个二进制位向右移动“<<”右 边操作数所指定的位数。 n 对于空位的补 齐方式,无符号数与有符号 数是有区别的 。
TM
13
例如 7 | 3
u 7 的补码为0000 0111,3的补码为0000 0011 u 结果为0000 0111。
u 按位与操作可以实现将特定位的置位操作 ,也可以用于提取出某数的指定位。。
TM
14
8.2.3 按位异或操作
按位异或运算符“^”是将参与运算的两个操作 数对应的各个二进制位进行相异或 当对应的两个二进制位相异时,结果位为1,相 同时为0。 参与运算的两个操作数均以补码形式出现。。
TM
5
8.1.2 命名规则
•1)标识符的名称要简明,能够表达出确切的含义, 可以使用完整的单词或通常可以理解的缩写。
•2)如果在命名中使用特殊约定或缩写,则要进 行注释说明。
3)变量命名,一般不取单个字符,例如i、j、k...
•4)函数名一般以大写字母开头;所有常量名字 母统一用大写。
TM
6
8.1.3 注释说明
TM
15
例如 7 ^ 3
u 7 的补码为0000 0111,3的补码为0000 0011 u 结果为0000 0100。
第8章 ARM汇编语言与嵌入式C混合编程(2)

/*注意:这里不要直接使用 C 代码中提供的变量*/
不能直接引用C语言中的变量定义,有双引号
8.6.1 内嵌汇编
• 2.内嵌汇编的局限性
• (1)操作数 • ARM开发工具编译环境下内嵌汇编语言,指令操 作数可以是寄存器、常量或C语言表达式。可以是 char、short或int类型,而且是作为无符号数进行 操作。
8.6.1 内嵌汇编
–在内嵌的汇编指令中使用物理寄存器时,如果 有C语言变量使用了该物理寄存器,则编译器 将在合适的时候保存并恢复该变量的值。需要 注意的是,当寄存器SP、SL、FP以及SB用作特 定的用途时,编译器不能恢复这些寄存器的值。 –通常在内嵌汇编指令中不要指定物理寄存器, 因为有可能会影响编译器分配寄存器,进而可 能影响代码的效率。
• (4)通用寄存器R13用作数据栈指针,记 作SP。
8.5.1寄存器使用规则
• (5)通用寄存器R14用作链接寄存器 ,记 作LR。(保存子程序返回地址) • (6)通用寄存器R15用作程序计数器,记 作PC 。
8.5.2数据栈使用规则
• 过程调用标准规定数据栈为FD类型(满递 减),并且对数据栈的操作时要求8字节对 齐的。
• 当表达式过于复杂时需要使用较多的物理寄存器, 有可能产生冲突。
• GNU ARM编译环境下内嵌汇编语言ARM开发工 具稍有差别,不能直接引用C语言中的变量。
8.6.1 内嵌汇编
• (2)物理寄存器
–不要直接向程序计数器PC赋值,程序的跳转只 能通过B或BL指令实现。 –一般将寄存器R0~R3、R12及R14用于子程序 调用存放中间结果,因此在内嵌汇编指令中, 一般不要将这些寄存器同时指定为指令中的物 理寄存器。
8.5.3参数传递规则
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013-7-16
信息学院-通信教研室-油海东
6
GUN下的伪指令
常量编译控制伪操作 汇编程序代码控制伪操作 宏及条件编译控制伪操作 其他伪操作
2013-7-16
信息学院-通信教研室-油海东
7
常量编译控制伪操作
伪操作
.byte
.hword/.short
语法格式
.byte expr {,expr} …
作用
将基于PC或基于寄存器的地址值读取到 寄存器中。小范围的地址读取。 将基于PC或基于寄存器的地址值读取到 寄存器中。中等范围的地址读取。 将一个32位的立即数或者一个地址值读 取到寄存器中。大范围的地址读取。 在汇编时将被替换成ARM中的空操作。
ADRL
LDR
NOP
2013-7-16
信息学院-通信教研室-油海东
.global _start .text _start: MOV R0,#10 MOV R1,#3 ADD R0,R0,R1 stop:MOV R0,0x18 LDR R1,=0x20026 SWI 0x123456 .end
15
信息学院-通信教研室-油海东
ARM汇编程序设计的难点
2013-7-16
信息学院-通信教研室-油海东
2
ARM汇编中的文件格式
ARM源程序文件(可简称为源文件)可以由任 意一种文本编辑器来编写程序代码,它一般为文 本格式。 常用的源文件:
文件名 *.S *.C 说明 用ARM汇编语言编写的ARM程 序或Thumb程序。 用C语言编写的程序代码。
源程序文件 汇编程序文 件 C程序文件
作用
将操作符开始的代码编译到代码段或代码段子段。 将操作符开始的数据编译到数据段或数据段子段。 将变量存放到.bss段或.bss段的子段。 表明当前汇编指令的指令集选择Thumb指令集。
.code 32/.arm
表明当前汇编指令的指令集选择ARM指令集。
.end
.include .align/.balign 2013-7-16
. ifdef,.else 及.endif
当满足某条件时对一组语句进行编译, 而当条件不满足时则编译另一组语句。 其中else可以缺省。
2013-7-16
信息学院-通信教研室-油海东
10
其它伪操作符
伪操作 .eject .list .nolist .title .sbttl .eject .list .nolist .title “heading” .sbttl “heading” 语法格式 作用 在汇编符号列表文件中插入一分页符。 产生汇编列表(从 .list 到 .nolist)。 表示汇编列表结束处。 使用“heading ”作为标题。 使用“heading”作为子标题。
作用
分配一段字节内存单元,并用expr初始化。
.hword expr {,expr} …
.ascii expr {,expr} … .asciz expr {,expr} … .float expr {,expr} …
.double expr {,expr} …
分配一段半字内存单元,并用exp [R1:R0]+[R3:R2],结果放在[R1,R0]中。 AREA add64 CODE READONLY ENTRY ADDS R0,R0,R2 ADDC R1,R1,R3 END
请看例6
2013-7-16
信息学院-通信教研室-油海东
22
数据串拷贝程序
AREA strcopy CODE,\ READONLY ENTRY start LDR R1,=srcstr LDR R0,=dststr BL strcopy stop MOV R0,0x18 LDR R1,=0x20026 SWI 0x123456 strcopy LDRB R2,[R1],#1 STRB R2,[R0],#1 CMP R2,#0 BNE strcopy MOV PC,LR AREA strings\ DATA ,REDAWRITE srcstr DCB “first”,0 dststr DCB “second”,0 END 请看例7
信息学院-通信教研室-油海东 12
SDT下和GUN下伪操作符的区别
SDT下的伪操作符 RN GBLA BUS SETA #0x20 MACRO MEND END AREA work CODE READONLY AREA block DATA READWRITE CODE32 CODE16
2013-7-16
GUN下的伪操作符 .req .global .equ BUS,0x20 .macro .mend .end .text .data .arm .thumb
信息学院-通信教研室-油海东 13
ARM汇编语言的伪指令
伪指令
ADR
语法格式
ADR{cond} register , expr ADRL { cond } register,expr LDR { cond } register , = [ expr | label-expr] NOP
.double
word/.long /.int
.word expr {,expr} …
.fill repeat {,size}{, value}
.fill
.zero .space/.skip
2013-7-16
.zero size .space size {, value}
分配一段字节内存单元,并用0填充内存。 分配一段内存单元,用value将内存单元初始化
信息学院-通信教研室-油海东 8
汇编程序代码控制伪操作符
伪操作
.section .text .data .bss .code 16/.thumb
语法格式
.section expr .text {subsection} .data {subsection} .bss {subsection} .code 16 .thumb .code 32 .arm 定义域中包含的段。
.end
.include “filename”
标记汇编文件的结束行,即标号后的代码不作处理。
将一个源文件包含到当前源文件中。
.align {alignment} {, 通过添加填充字节使当前位置满足一定的对齐方式。 fill} {,max} 9 信息学院-通信教研室-油海东
宏及条件编译伪操作符
伪操作 语法格式
.ltorg
.req .err .print .fail
.ltorg
.req name,expr .err .print string .fail expr
在当前段的当前地址(字对齐)产生一个文 字池。 为一个特定的寄存器定义名称。
使编译时产生错误报告。 打印信息到标准输出。 编译汇编文件时产生警告。
2013-7-16 信息学院-通信教研室-油海东 5
GUN编译环境和ADS/SDT编译环境的区别
Embest IDE集成的编译器是自由软件GUN编 译器。 以前介绍的程序均为ARM ADS/SDT环境下的 汇编程序 二者的区别:
ADS注释行以“;”开始。GUN以“@”开始,或 者“/* ……*/” ARM ADS/SDT下的伪指令与GUN下的伪指令不同 ARM指令均相同
嵌入式系统设计与开发
主讲:油海东
院系:信息学院通信教研室302
专业:通信07、电信07、信工07、计本07
第8章 ARM汇编语言程序设计
1.ARM汇编语言伪指令 2.ARM汇编语言语句格式 3.ARM汇编语言程序结构 4. 简单的ARM程序设计 5.ARM汇编语言集成开发环境 6.ARM汇编语言与C混合编程
14
ADS/SDT程序改写成GUN程序
AREA ARMex CODE READONLY ENTRY start MOV R0,#10 MOV R1,#3 我改 ADD R0,R0,R1 stop MOV R0,0x18 LDR R1,=0x20026 SWI 0x123456 END
2013-7-16
条件转移
2013-7-16
信息学院-通信教研室-油海东
18
汇编语言子程序调用及返回
子程序的调用 在ARM汇编语言中,子程序调用是通过BL 指令来完成的。BL指令的语法格式如下: BL subname 其中,subname是被调用的子程序的名称 子程序的返回 在返回调用子程序时,转移链接指令保存到 LR寄存器(r14)中的值需要拷贝回程序寄 存器PC(r15)。
信息学院-通信教研室-油海东 11
2013-7-16
SDT下和GUN下伪操作符的区别
SDT下的伪操作符 INCLUDE A EQU PB25 EXPORT IMPORT DCD IF:DEF: ELSE ENDIF :OR: :SHL:
2013-7-16
GUN下的伪操作符 .include .equ A,PB25 .global .extern .long .ifdef .else .endif | <<
定义字符串expr(非零结束符)。 定义字符串expr(以/0为结束符)。 定义一个32bit IEEE 浮点数expr。 定义64bit IEEE浮点数expr。 分配一段字内存单元,并用expr初始化。
分配一段字节内存单元,用size长度value填充repeat次。
.ascii
.asciz /.string .float/.single
头文件
2013-7-16
*.H
头文件,包括常量命名、宏定 义、数据结构定义
信息学院-通信教研室-油海东 3