【嵌入式】嵌入式系统开发与应用第二版课后答案第三章(田泽)
自整理,复习用,考试只考前三章——海底淤泥
一、简答题
1ARM寻址方式有几种?举例说明ARM如何进行不同的寻址方式
6种
1.立即寻址: ADD R0,R0,#1
2.寄存器寻址: ADD R0,R1,R2,#2
3.寄存器间接寻址: LDR R0,[R1]
4.基址加偏址寻址: 1.前:LDR R0,[R1,#4] 2自动:LDR R0,[R1,#4]! 3后:LDR R0,[R1],#4
5堆栈寻址:1.STMFD SP!{R1-R7,LR} 2.LDMFD SP!{R1-R7,LR}
6块拷贝寻址:1.LDMIA R0!,{R2-R9} 2.STMIA R1,{R2-R9}
7相对寻址:MOV PC,R14
2简述ARM指令分类以及指令格式形式
1.数据处理指令 <op>{<cond>}{S}Rd,Rn,#<32位操作数> <op>{<cond>}{S}Rd,Rn,Rm,{<shift>}
2.Load/Store指令 LDR|STR{<cond>}{B}{T}Rd,[Rn,<offset>]{!} LDR|STR{<cond>}{B}{T}Rd,[Rn]<offset>
LDR|STR{<cond>}{B}{T}Rd,LABEL
LDM|STM<cond>}<add mode> Rn{!},<registers> SWP{<cond>}{B}Rd,Rm,[Rn]
3.状态寄存器与通用寄存器之间的传送指令 MRS{<cond>}Rd,CPSR|SPSR
4转移指令 B{L}{<cond>} <target address>
5异常中断产生指令 SWI{<cond>} <24位立即数> BKPT {immed_16} CLZ{cond} Rd,Rm
6协处理器指令 CDP{<cond>} <CP#>,<Copl>,CRd,CRn,CRm{,<Cop2>}
3假设SP的内容为0x8000,寄存器R1、R2的内容分别为0x01与0x10,存储器内容为空,执行下述指令后,说明PC如何变化。存储器以及寄存器内容如何变化。
STMFD sp!,{R1,R2} 0x8000<-0x10 0x7996<-0x10 sp=0x7996
LDMFD sp!,{R1,R2} r1<-[0x8000] r2<-[0x7996] sp=0x7996
4试比较ARM指令集与Thumb指令集的异同,并简述各自的特点
ARM指令是31位二进制编码
Thumb指令是16位二进制编码
支持Thumb指令的ARM微处理器都可以执行ARM指令
5简述Load指令与Store指令的功能
Load 写
Store 读
6ARM处理器如何进入和退出Thumb指令模式
进入:1.BX R0 R0最低位置1 2.利用异常进入
退出:2.BX R0 R0最低位置0 2.利用异常退出
7简述ARM协处理器指令的分类
1.用于ARM处理器的初始化ARM协处理器的数据操作指令
2.用于ARM处理器的寄存器和ARM协处理器之间的数据传送指令
3.用于ARM协处理器的寄存器和内存单元之间的传送数据
8简述ARM汇编语言中的伪操作、宏指令和伪指令的含义,伪操作和伪指令都分为哪几类?
伪操作:特殊指令助记符号
宏指令:一段独立的程序代码,可以插入源程序
伪指令:特殊指令助记符号
伪操作:
1符号定义 2数据定义 3汇编控制
4框架描述 5信息报告 6其他
伪指令:
ADR、ADRL、LDR、NOP
9如何在汇编语言中定义和使用宏
使用#define
10ARM指令与Thumb指令有何异同
ARM指令是32位二进制编码
Thumb指令是16位二进制编码
11简述IRQ和FIQ异常中断处理程序中所使用的的__irq的作用
在程序内部增加中断保护的代码
12简述#include<头文件.h>与#inlcude“头文件.h”的区别
<>标准头文件
“”自定义头文件
13简述局部变量和全局变量的区别
局部变量作用域在局部范围
全局变量作用域在全局范围
14函数的存储类说明符有几种?各自的作用是什么?
static:表示本文件定义前和非本文件定义的文件中,该函数不能被调用
extern:表示该函数是全程序可见的
15变量的存储类型是有几种?各自的作用是什么?
auto——自带存储类型——局部
register——寄存器存储类型——寄存器提高速度
entern——外部存储类型——全局
static——静态存储类型
16变量在内存中存储方式有几种?分别是什么?
字符,整形,浮点数
17函数的参数传递方式有几种?分别是什么?
1.参数个数固定的子程序传递参数——使用R0,R1,R2,R3
2.参数个数可变的子程序传递参数——使用R0,R1,R2,R3和数据栈,多于4个之后的参数倒序入栈
18简述字符串与字符数组的存储区别
字符串在最后一位有‘\0’
19修饰符const、volatile、near、far的作用是什么?用在什么地方?
const——常量修饰符
volatile——易失性修饰符
near,far——远近修饰符
20定义指针变量是如果不进行初始化,可能出现什么问题?
出现野指针异常
21简述const int * 和 int * const
const int * 说明指针指向对象是常量,是常量指针
int * const 说明指针本身是常量,是指针常量
const int * const 常量指针常量指向常量
22 char a,int b,shot c ,int d,与char a, shot c,int b,int d各自占用的存储空间有何区别?
char a,int b,shot c ,int d 占4个字
char a, shot c,int b,int d 占3个字
23ATPCS包括哪些规则?分别是什么?
1.寄存器使用规则
2.数据栈使用规则
24如何使用内嵌汇编编程?使用内嵌汇编时需要注意什么?
__asm("指令");
__asm{
"指令"
"指令"
...
}
注意__asm是两个_
25如何在ADS开发环境下使用malloc和free?使用 时需要注意什么?
内存单元分配通过C语言完成
26简述结构类型与联合类型的异同。
结构:每个变量都有独立空间
联合:所有变量共享一份空间
都可以储存不同类型变量
27结构类型中存取成员有几种方法?简述他们的区别。
结构名.变量名
结构指针名->变量名
28ARM嵌入式软件设计中,如何在汇编程序中实现子程序调用?
使用IMPORT来声明C程序 import f
通过BL来调用子程序 bl f
二、程序设计题
1完成下面操作后,R0的内容是什么?
mov R1,#5
add R0,R1,LSL #3
2请将下面C语言代码转换成汇编语言。
if(a==0||b==1)
c=d+e
3编写一段程序实现在C语言中调用汇编语言程序,实现将1KB大小的内存块以字的形式复制到另一内存地址
4编写一段汇编语言程序,用内嵌汇编指令实现中断的使能和禁止
5编写一段汇编语言程序,实现从ARM到Thumb的转换
6编写一段汇编语言程序,实现从Thumb到ARM的转换
7编写一段程序,实现汇编语言程序中访问C语言程序中的变量
8编写一段程序,利用跳转表实现程序跳转
9编写以字节为单位的的字符串拷贝子程序,要求从存储器某处拷贝到另一处。源字符串的起始地址放入R1,长度(以字节为单位)放入R2,目的字符串的起始地址放入R3
10编写一段C语言与汇编语言的混合编程代码,在C语言中调用汇编语言代码,完成字符串str1和str2内容的互换。