文章目录
- 上一篇
- 嵌入式系统概述
- ARM技术概述
- ARM指令
- Thumb指令集
- ARM程序设计
上一篇
嵌入式系统复习–基于ARM的嵌入式程序设计
嵌入式系统概述
-  嵌入式系统中常用的通信接口包括哪些? 
 RS-232C串行通信接口,RS-422串行通信接口,RS-485串行通信接口,USB接口,以太网接口,IEEE1394接口,IEEE802.11接口,JTAG接口,蓝牙接口
-  大端存储与小端存储有什么异同? 
 大端存储是将数据的低字节存入低地址高字节存入低地址,小端存储是将数据的高字节存入低地址低字节存入高地址
ARM技术概述
-  RISC的主要特点 - 数据通道中只保留有用的指令
- 确保通道能够快速执行每个指令
- 确保CPU硬件设计的足够简单
 
-  简述ARM处理器的数据类型 - 有符号/无符号字节(B)
- 有符号/无符号半字(H)
- 有符号/无符号字(D)
 
-  简述哈佛结构和冯诺依曼结构的主要区别 
  
-  简述ARM体系结构的版本情况。 - v6 - 增加了Thumb-2 提高了代码密度
- 增加了SIMD 提高了数字和媒体处理能力
- TrustZone增加了安全性能力
- IEM增强了功耗管理能力
 
- v7 - A型号提供了应用处理能力,支持复杂的操作系统
- R型号提供了实时操作系统
- M型号提供了成本敏感的系统
 
- v8 - 支持64位的处理器架构
- 64位的通用寄存器和PC, SP
- 支持64位AArch64, 和32位AArch32两种指令
 
 
- v6 
-  简述ARM处理器异常处理情况。 
 进入异常:- 将CPSR中的内容拷贝到SPSR中
- 改变CPSR中的中断标志位
- 将指令的下一条指令拷贝到链接寄存器LR中
- 强制改变PC中的值,进入异常状态
 异常返回: - 将异常改变的寄存器保护存入栈中
- 将SPSR_mode中的值拷贝到CPSR中
- 将PC恢复到指令异常前的指令流中
- 修改CPSR中的中断标志位
 
-  ARM处理器支持哪几种工作模式? 
 用户模式,快速中断fiq模式,普通中断irq模式,软件中断模式svc,中止模式abt,未定义模式und, 系统模式
-  ARM处理器共有多少个寄存器?ARM状态下通用寄存器可以分为几类? 
 37个寄存器,可以分为31个通用寄存器(不分组寄存器、分组寄存器、程序计数器),6个状态寄存器
-  简述ARM指令中12位压缩的立即数是如何构成的? 
 由8位常数及4位循环移位位构成,及 将8位立即数循环右移2 * 循环移位位后得到对应的立即数
ARM指令
-  用ARM汇编指令实现下面列出的几种操作 - R0 = 16MOV R0, #16
- R0 = R1 / 16MOV R0, R1, LSR #4
- R1 = R3 * 4MOV R1, R3, LSL #2
- R1 = -R1MVN R1, R1
 
- R0 = 16
-  下面的ARM指令完成什么功能? - LDRH R0, [R1, #6]
 以前变址的方式将R1中的内容作为地址加上偏移量6后,以半字的方式载入R0中
- LDR R0, =0x999
 伪指令,编译时通过多条指令运算得到32位的0x999并将它载入到R0中
 
- LDRH R0, [R1, #6]
-  BX指令与BL指令有什么不同,请说明之? 
 BX指令是在ARM与Thumb两个状态间的切换,当寄存器的第0位是1,则切换到Thumb状态,如果是0则切换到ARM状态,BL指令是跳转链接指令,在调到对应指令前,会将当前指令的地址拷贝到链接寄存器LR中,然后在进行跳转。
-  请指出MOV指令与LDR指令的区别和用途? 
 MOV是完成寄存器与寄存器之间或与立即数之间的数据移动
 而LDR是寄存器与存储器之间的数据传输
-  调用子程序使用B还是BL指令?写出返回子程序的指令? 
 调用子程序使用BL指令,因为需要返回到主程序所以要将下一条的指令地址链接到LR中
 没有嵌套的返回指令BL LABEL LABELMOV PC LR有嵌套的返回指令 STMFD SP! {R0-R7, LR}BL SUBPROGRAMSUBPROGRAM;从子程序返回LDMFD SP! {R0-R7, PC}
-  编写一个子程序,从存储器某处拷贝一个字符串到存储器另一处。源字符串的开始地址放入R1, 长度(以字节为单位)放入R2, 目的字符串的开始地址在R3 AREA COPYSTRING, CODE, READONLY ENTRY CODE32 startBL SUBCOPY stopMOV R0, #0x18LDR R1, =0x20026SWI 0x123456 ;子程序 SUBCOPYCMP R2, #0BEQ ENDCOPY LOOPLDRB R4, [R1], #1; 后变址 mem32R1 -> R4, R1 + 1 -> R1STRB R4, [R3], #1SUBS R2, R2, #1BNE LOOPENDCOPYMOV PC, LR ; 子程序返回END
-  请将下面C语言代码转换成汇编语言 if (a > 10 && a < 100)b = b + 1 elseb = b - 1汇编语言为 假设R0中存入a的内容, R1中存入b的内容CMP R0, #10BLS SECONDCMP R0, #100BCS SECONDADD R1, R1, #1 SECONDSUB R1, R1, #1
-  ARM寻址方式有哪几种? 
 立即数寻址,寄存器寻址,基址加偏址寻址,寄存器间接寻址,块拷贝寻址,堆栈寻址,相对寻址方式
Thumb指令集
-  ARM指令集与Thumb指令集中移位操作是如何实现的?有什么异同点? 
 移位通过移位寄存器进行,一个移位类型一个移位量字段,前者决定移位方式,后者决定移位步数
 异同:- ARM可以同时进行移位和逻辑运算,而Thumb只能单独进行移位运算
- ARM可以进行循环移位,但是Thumb不行
 
-  用语言描述ARM处理器如何进入和退出Thumb指令模式? 
 ARM通过使用BX指令寄存器第0位为1进入Thumb模式,或者通过异常返回进入Thumb模式
 通过BX指令,寄存器第0位为0推出Thumb模式,或者通过发生异常推出Thumb
-  编写一个子程序,从存储器某处拷贝一个字符串到存储器另一处。源字符串的开始地址放入R1, 长度(以字节为单位)放入R2, 目的字符串的开始地址在R3 AREA TCOPY, CODE, READONLY ENTRY CODE 16 startBL SUBCOPY stopMOV R0, #0x18LDR R1, =0x20026SWI 0x123456 SUBCOPYCMP R2, #0BEQ ENDCOPY LOOPLDRB R4, [R1], #1STRB R4, [R3], #1SUBS R2, #1BNE LOOP ENDCOPYMOV PC, LR END异同Thumb在使用寄存器时需要使用R0~R7, 低位寄存器使用受到限制, Thumb指令大多是二地址指令(CMP,MOV,LDR,STR等用法还和ARM类似), 多了移位指令 
ARM程序设计
- 简述IRQ/FIQ异常中断处理程序中所使用的的_fiq/_irq的作用
 标记对应函数为中断函数,编译器会自动在函数内部增加中断现场保护代码
- 简述#include<头文件.h>与 #include "头文件.h"的区别
 带<>的是直接在标准路径下搜索相应文件,而带“”的是先在标准路径下搜索相应文件如果找不到,则在对应工程目录下搜索对应文件
- 变量的存储类型有几种?各自的作用是什么? - 全局变量:在整个程序的生命周期内都可访问,其存储空间在程序启动时分配,在程序结束时释放。
- 局部变量:仅在被声明的函数或代码块内可见,器存储空间在声明该变量的函数或代码块时分配,在退出时释放
- 静态变量:静态变量的生命周期延长到整个程序执行期间,但其作用域仍限定在声明它的函数或代码块内部
- 寄存器变量:将变量存储在寄存器中,以提高访问速度。
 
-  函数的参数传递方式有几种?分别是什么? 
 2中,寄存器传递和栈传递
-  ATPCS包含那些规则?分别是什么? - 寄存器使用规则:R0-R3是用来传递参数的,R4-R11是用来保存局部变量的
- 栈的使用规则:使用FD满递减堆栈,采用字对齐方式
- 参数传递规则:当参数个数是固定的,第一个参数使用R0-R3传递,其余使用数据栈传递,当参数不是固定的时候,前4个参数使用R0-R3传递,超过4个的使用数据栈传递
 
-  在完成以下操作后,R0的内容是什么? MOV R1, #5 ADD R0, R1, R1, LSL #3R1 = 5, R0 <- R1 + R1 * 8 
 R0 = 5 + 5 * 8 = 45
-  请将下面C语言代码转换成汇编语言 if (a == 0 || b == 1)c = d + eAREA EXAMPLE, CODE, READONLY GBLA a, b, c, d, e ENTRY CODE 32 startMOV R4, aMOV R5, bMOV R6, cMOV R7, dMOV R8, eCMP R4, #0CMP R5, #1BNE COMPAREENDADD R6, R7, R8 COMPAREEND stopMOV R0, #0x18LDR R1, #0x20026SWI 0x123456 END
-  编写一段汇编语言程序,实现ARM到Thumb状态的转换 AREA SWITCH, CODE, READONLY ENTRY start CODE 32MOV R0, into_ThumbADD R0, R0, #1 BX R0 CODE 16 into_ Thumb END
-  编写一段汇编程序,利用跳转表实现子程序的跳转。(跳转条件在R2中,R2的值为0,1,2,3,4…,子程序分别为SUB0, SUB1, SUB2…) 
AREA JUMPTAB, CODE, READONLY
ENTRY
CODE 32
start BL JUMPTABJUMPTABADR R0, SUBTABCMP R2, #SUBMAXLDRS PC, [R2, R0, LSL 2]MOV PC, LRSUBTABDCD SUB1DCD SUB2...
SUBMAXSUB1...
SUB2...
END