嵌入式系统设计与应用 2026 春季学期的期中课堂考试。
本文连载于嵌入式系统设计与应用-2026sp-期中 | HeZzz.
答案来源于 GPT-5.5 和 NotebookLM,并由我校对,可能不完全准确,仅供参考。
🙇♂️🙇♂️🙇♂️时间仓促,有不足之处烦请及时告知。邮箱hez2z@foxmail.com 或者在 速通之家 群里 @9¾。
寄存器移位加法
在完成以下操作后,R0 的内容是?
MOV R5, #2
ADD R0, R5, R5, LSL #3
参考答案:18
详细思路:
MOV R5, #2表示把立即数 2 送入寄存器R5,因此此时R5 = 2。R5, LSL #3表示把R5的值逻辑左移 3 位,也就是乘以2^3 = 8。- 因此有:
R5 << 3 = 2 << 3 = 16
ADD R0, R5, R5, LSL #3的含义是:R0 = R5 + (R5 << 3)
- 代入数值可得:
R0 = 2 + 16 = 18
所以最后 R0 = 18。
连续运算后的 R0
ADD R0, R0, R0, LSL #2
RSB R0, R0, R0, LSL #3
上述操作执行后,R0 变为多少?
参考答案:630
详细思路:
- 这一题默认接着上一题的结果做,因此初始时
R0 = 18。 - 先看第一条指令:
ADD R0, R0, R0, LSL #2- 含义是
R0 = R0 + (R0 << 2) R0 << 2 = 18 << 2 = 72- 所以更新后
R0 = 18 + 72 = 90
- 再看第二条指令:
RSB R0, R0, R0, LSL #3RSB是 Reverse Subtract,含义是:R0 = (R0 << 3) - R0
- 此时
R0 = 90 R0 << 3 = 90 << 3 = 720- 所以:
R0 = 720 - 90 = 630
所以最终 R0 = 630。
ARM9 流水线
ARM9 内核采用几级流水线?分别是?
参考答案:5 级流水线
- [填空1]
5级 - [填空2]
取指(Fetch) - [填空3]
译码(Decode) - [填空4]
执行(Execute) - [填空5]
缓冲/数据(Memory) - [填空6]
回写(Write Back)
详细思路:
- ARM9 比 ARM7 的流水线更深,常见考法就是“ARM7 为 3 级,ARM9 为 5 级”。
- 五级流水线的目的是让多条指令在不同阶段并行推进,从而提高吞吐率。
- 五个阶段通常写成:
- 取指:从存储器中取指令;
- 译码:分析指令和操作数;
- 执行:完成 ALU 运算或地址计算;
- 访存:如果是访存指令,则访问内存;
- 回写:把结果写回寄存器。
考试时通常写“5 级流水线:取指、译码、执行、缓冲/数据、回写”即可。
来源于02-第二章-ARM技术概述-2026第 59 页。
32 位 ARM 的地址空间与指令长度
32 位 ARM 处理器的地址空间是?
一条 ARM 指令占几个字节?一条 Thumb 指令占几个字节?
除了 ARM 与 Thumb,还有哪些后续发展的指令集?
参考答案:
- [填空1]
4GB(2^32 字节) - [填空2]
4字节 - [填空3]
2字节 - [填空4]
Thumb-2 - [填空5]
Jazelle
详细思路:
- 32 位地址总线可以表示
2^32个地址,因此地址空间大小为:2^32 Byte = 4GB
- 经典 ARM 状态下的 ARM 指令长度固定为 32 位,也就是:
32 bit = 4 Byte
- 经典 Thumb 指令长度固定为 16 位,也就是:
16 bit = 2 Byte
- ARM 后续又扩展出新的指令集或执行状态,常见考法会写:
Thumb-2Jazelle
除了原生的 ARM(32位)和 Thumb(16位)指令集,ARM 架构在后续演进中还发展出了以下关键指令集:
- Thumb-2:这是对 Thumb 的重大扩展,同时包含 16 位和 32 位指令,既能保持高代码密度,又能实现接近 ARM 指令集的高性能。
- Thumb-2EE:Thumb-2 的变体,专门用于动态产生的代码(如即时编译 JIT)。
- A64:随 ARMv8 架构引入的全新 64 位指令集,支持 64 位通用寄存器和扩展虚拟寻址。
这些指令集中,Thumb-2 在当前 Cortex 系列中应用非常广泛。
存储指令
ARM汇编中,用于将寄存器R1的值存入内存地址0x1000的指令是?
- A.
STR R1, [0x1000] - B.
LDR R1, [0x1000] - C.
MOV R1, 0x1000 - D.
PUSH {R1}
参考答案:A
详细思路:
- 题目要求“把寄存器中的值存入内存”,关键词是“存”,因此应使用
STR(Store Register)。 - 各选项含义如下:
- A:
STR,表示把寄存器内容写入某个内存地址,方向正确; - B:
LDR,表示从内存读取到寄存器,方向相反; - C:
MOV,是寄存器和立即数之间的数据传送,不是写内存; - D:
PUSH,是压栈操作,不是把数据明确写到0x1000。
- A:
因此答案选 A。
本题为考试常见简化表述。实际开发中需先将绝对地址加载至寄存器,再执行 STR。具体细节请咨询大模型。
栈指针寄存器
下列哪个寄存器在ARM中通常用作栈指针(Stack Pointer)?
- A. R0
- B. R13 (SP)
- C. R15 (PC)
- D. R12
参考答案:B
详细思路:
- ARM 中有一些寄存器有约定俗成的特殊用途:
R13 = SP:栈指针(Stack Pointer),用于指示当前栈顶位置。R14 = LR:链接寄存器(Link Register),保存函数返回地址R15 = PC:程序计数器(Program Counter),指向当前执行指令的地址
- 因此用于栈指针的是
R13。
所以答案选 B。
加 5 运算
以下哪条指令能正确将R0的值加上5,结果存入R1?
- A.
ADD R1, R0, #5 - B.
SUB R1, R0, #5 - C.
MOV R1, R0 + 5 - D.
LDR R1, [R0, #5]
参考答案:A
详细思路:
ADD R1, R0, #5的标准格式是:R1 = R0 + 5
- 其余选项:
- B 是减法;
- C 不是 ARM 合法汇编格式,
MOV的正确用法是MOV R1, R0,表示把 R0 的值直接复制到 R1,而不是加上 5; - D 是从地址
R0 + 5处取数据,不是做加法运算。
因此答案选 A。
条件后缀 EQ
ARM汇编中,用于条件执行的指令后缀“EQ”表示?
- A. 无符号大于(Unsigned Higher)
- B. 大于(Greater Than)
- C. 不等(Not Equal)
- D. 相等(Equal)
参考答案:D
详细思路:
- ARM 中大量指令都可以带条件后缀。
EQ的含义是 Equal,即“相等”。- 它通常对应比较后零标志位
Z = 1的情况。
因此答案选 D。
跳转到标签
以下哪条指令能跳转到标签loop处?
- A.
MOV PC, loop - B.
B loop - C.
CMP loop, PC - D.
LDR PC, loop
参考答案:B
详细思路:
- ARM 中最基本的无条件跳转指令是
B label。 - 因此跳转到
loop应写为:B loop
- 其他选项中:
- A 表示把
loop的地址直接加载到程序计数器PC,虽然也能实现跳转,但不如B指令规范和常见; - C 是比较,不是跳转;
- D 表示从
loop地址处加载数据到PC,这不是标准的跳转方式。
- A 表示把
因此答案选 B。
函数返回值寄存器
以下哪个寄存器在函数调用时通常用于保存返回值?
- A. R0
- B. R1
- C. SP
- D. LR
参考答案:A
详细思路:
- 按 ARM 的函数调用约定,函数返回值一般放在
R0中。 - 如果返回更大的数据,也可能会联合使用
R1,但最常见单个返回值是R0。 SP是栈指针(Stack Pointer),LR是返回地址寄存器(Link Register),都不是返回值寄存器。
因此答案选 A。
逻辑左移
以下哪条指令能正确将R2的值逻辑左移2位?
- A.
LSL R2, R2, #2 - B.
LSR R2, R2, #2 - C.
ASR R2, R2, #2 - D.
ROR R2, R2, #2
参考答案:A
详细思路:
LSL表示逻辑左移。LSR是逻辑右移,ASR是算术右移,ROR是循环右移。- 所以“逻辑左移 2 位”应该写成:
LSL R2, R2, #2
因此答案选 A。
从函数返回
以下哪条指令用于从函数返回?
- A.
RET - B.
BX LR - C.
POP {PC} - D. 以上均可
参考答案:B
详细思路:
A 选项 RET 是 x86 汇编中的返回指令,不适用于 ARM。
B 选项 BX LR 是 ARM 中常用的返回指令,LR 寄存器保存了函数调用时的返回地址。
C 选项 POP {PC} 适用于函数开头已经将返回地址压栈的情况,题中没有说明这种情况,因此不一定适用。
所以答案选 B。
比较指令
以下哪条指令能正确比较R3和R4的值?
- A.
ADD R3, R4 - B.
SUB R3, R4 - C.
MOV R3, R4 - D.
CMP R3, R4
参考答案:D
详细思路:
A 选项 ADD 是加法指令,在这里是把 R3 和 R4 的值相加。
B 选项 SUB 是减法指令,在这里是把 R3 的值减去 R4 的值。
C 选项 MOV 是数据传送指令,在这里是把 R4 的值复制到 R3。
D 选项 CMP 是 ARM 中专门用于比较的指令,它会设置条件码以供后续条件执行指令使用。
所以答案选 D。
加载立即数
以下哪个指令用于加载立即数0x1234到R5?
- A.
MOV R5, 0x1234 - B.
LDR R5, =0x1234 - C.
ADD R5, #0x1234 - D.
STR R5, 0x1234
参考答案:B
详细思路:
- ARM 汇编中,加载较大的立即数时,最常用的写法是伪指令:
LDR R5, =0x1234
- 汇编器会根据情况把这个常数直接编码,或者放到文字池中再加载。
- 其他选项中:
- A 表示把立即数直接放入寄存器,但 ARM 的
MOV指令只能直接编码较小的立即数,0x1234 可能无法直接编码; - C 语法不完整,而且是加法;
- D 是存储,不是加载。
- A 表示把立即数直接放入寄存器,但 ARM 的
因此答案选 B。
大端格式与小端格式
什么是小端格式?什么是大端格式?
参考答案:
- 小端格式(Little-endian):低地址存放数据的低字节,高地址存放数据的高字节。
- 大端格式(Big-endian):低地址存放数据的高字节,高地址存放数据的低字节。
详细思路:
- “端格式”讨论的是一个多字节数据在内存中如何排列。
- 以 32 位数据
0x12345678为例:- 小端模式下:
- 地址从低到高依次存
78 56 34 12
- 地址从低到高依次存
- 大端模式下:
- 地址从低到高依次存
12 34 56 78
- 地址从低到高依次存
- 小端模式下:
- 记忆方法:
- 小端:小的部分(低字节)放在小地址;
- 大端:大的部分(高字节)放在小地址。
嵌入式操作系统的功能
嵌入式操作系统的功能?
参考答案:
嵌入式操作系统的核心功能主要体现在以下两个方面:
- 屏蔽硬件差异(补平界面):隐藏底层硬件的具体细节,为上层应用提供统一、抽象的接口,使开发者无需考虑硬件差异,专注于应用逻辑开发,。
- 核心资源管理:
- 多任务管理:提供调度机制,控制多个线程或进程的起始、执行、暂停与结束。
- 存储管理:负责内存的分配与回收、虚拟地址转换、内存扩充及保护, 。
- 周边资源管理:通过驱动程序管理 I/O 设备、通讯端口及外接控制器等资源,。
- 中断管理:负责中断的初始化安装、现场保护与恢复,以及中断栈的嵌套管理。
Cortex-A8 的工作模式与处理器状态
CORTEX-A8 处理器几种工作模式?处理器状态有哪些?
参考答案:
Cortex-A8 处理器基于 ARMv7 架构,其工作模式和状态总结如下:
8 种工作模式
处理器包括 1 种用户模式和 7 种特权模式:
- 用户模式 (usr):正常程序执行模式。
- 系统模式 (sys):运行特权级操作系统任务,与用户模式共用寄存器。
- 管理模式 (svc):系统复位或执行软件中断(SWI)指令时进入。
- 外部中断模式 (irq):处理低优先级中断。
- 快速中断模式 (fiq):处理高优先级中断,用于高速数据传输。
- 数据访问中止模式 (abt):当存取异常时进入。
- 未定义指令中止模式 (und):执行未定义指令时进入。
- 安全监控模式 (mon):用于安全模式和非安全模式下的转换。
处理器状态
处理器主要在以下状态间切换:
- ARM 状态:执行 32 位、字对齐的 ARM 指令。
- Thumb 状态:执行 16 位(或 32 位 Thumb-2)、半字对齐的指令。
汇编实现选择排序,并由 C 调用
编写一段汇编语言源程序,实现 10 个输入数据的选择排序功能,并在另一 C 语言程序中调用这个程序,依次按序输出出来。
参考答案:
下面给出一种基于 ARM 汇编与 C 混合编程的实现方案。
约定排序为升序,C 程序把数组首地址传给汇编函数,汇编函数对 10 个整数原地排序,返回后再由 C 程序依次输出。
1. 设计思路
- 选择排序的核心思想:
- 第 1 趟从
a[0..9]中找最小值,与a[0]交换; - 第 2 趟从
a[1..9]中找最小值,与a[1]交换; - …
- 第 9 趟从
a[8..9]中找最小值,与a[8]交换。
- 第 1 趟从
- 因为一共有 10 个数据,所以外层循环做 9 趟即可。
- 在 ARM 调用约定中:
R0通常用来传第一个参数,因此可让R0保存数组首地址;- 汇编函数内部通过偏移地址访问
a[i]、a[j]、a[min]。
- 排序完成后返回 C 程序,由 C 程序负责输出。
2. ARM 汇编程序
下面给出 GNU 汇编风格示例:
.text
.global selection_sort10
selection_sort10:
PUSH {R4-R11, LR} @ 保护现场
MOV R4, #0 @ i = 0
outer_loop:
CMP R4, #9 @ i >= 9 时结束
BGE sort_done
MOV R5, R4 @ min = i
ADD R6, R4, #1 @ j = i + 1
inner_loop:
CMP R6, #10 @ j >= 10 时结束内层循环
BGE do_swap
LSL R7, R6, #2 @ j*4
ADD R7, R0, R7 @ &a[j]
LDR R8, [R7] @ a[j]
LSL R9, R5, #2 @ min*4
ADD R9, R0, R9 @ &a[min]
LDR R10, [R9] @ a[min]
CMP R8, R10
BGE next_j @ 若 a[j] >= a[min],不更新 min
MOV R5, R6 @ min = j
next_j:
ADD R6, R6, #1
B inner_loop
do_swap:
CMP R5, R4
BEQ next_i @ min == i,无需交换
LSL R7, R4, #2
ADD R7, R0, R7 @ &a[i]
LDR R8, [R7] @ a[i]
LSL R9, R5, #2
ADD R9, R0, R9 @ &a[min]
LDR R10, [R9] @ a[min]
STR R10, [R7] @ a[i] = a[min]
STR R8, [R9] @ a[min] = a[i]
next_i:
ADD R4, R4, #1
B outer_loop
sort_done:
POP {R4-R11, LR}
BX LR
3. C 语言调用程序
#include <stdio.h>
extern void selection_sort10(int a[]);
int main(void) {
int a[10] = {23, 5, 17, 9, 31, 2, 14, 8, 19, 6};
int i;
selection_sort10(a);
for (i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
4. 运行结果
排序前:
23 5 17 9 31 2 14 8 19 6
排序后:
2 5 6 8 9 14 17 19 23 31
5. 详细思路拆解
外层循环在做什么
- 外层循环变量
i表示“当前应该放置第几个最小值”。 - 当
i = 0时,在整个数组中找最小值,放到第 0 个位置。 - 当
i = 1时,在剩余部分a[1..9]中找最小值,放到第 1 个位置。 - 重复直到
i = 8,此时最后两个元素也自然有序了。
内层循环在做什么
- 设
min = i,表示当前最小值下标先假设为i。 - 用
j从i + 1扫描到9。 - 若发现
a[j] < a[min],就更新min = j。 - 内层循环结束后,
min就是本趟最小元素的位置。
交换过程在做什么
- 若
min == i,说明当前位置已经是最小值,不需要交换。 - 否则交换
a[i]和a[min]。 - 汇编中交换的本质就是:
- 先把两个位置的值分别读到寄存器;
- 再把它们写回对方所在位置。
地址计算为什么要左移 2 位
- 这里数组元素类型是
int,每个元素占 4 字节。 - 数组下标
k对应地址偏移量是k * 4。 - 在汇编中,乘 4 常写成:
LSL #2
- 所以:
a[k]的地址 =数组首地址 + (k << 2)
6. 作答思路
- 选择排序思想:每趟从未排序区中选最小元素,与当前首元素交换。
- ARM 汇编函数接收数组首地址
R0,通过双重循环实现 10 个整数升序排列。 - 外层循环控制趟数,内层循环寻找最小值下标,最后完成交换。
- C 程序通过
extern声明该汇编函数,传入数组后调用,再循环输出即可。
这样既写出了算法思想,也体现了 ARM 与 C 的接口调用关系。