跳到正文
HeZzz's Notes
返回

嵌入式系统设计与应用-2026sp-期中

在 Github 上编辑此页

嵌入式系统设计与应用 2026 春季学期的期中课堂考试。

本文连载于嵌入式系统设计与应用-2026sp-期中 | HeZzz.

答案来源于 GPT-5.5 和 NotebookLM,并由我校对,可能不完全准确,仅供参考。

🙇‍♂️🙇‍♂️🙇‍♂️时间仓促,有不足之处烦请及时告知。邮箱hez2z@foxmail.com 或者在 速通之家 群里 @9¾

寄存器移位加法

在完成以下操作后,R0 的内容是?

MOV R5, #2
ADD R0, R5, R5, LSL #3

参考答案:18

详细思路:

  1. MOV R5, #2 表示把立即数 2 送入寄存器 R5,因此此时 R5 = 2
  2. R5, LSL #3 表示把 R5 的值逻辑左移 3 位,也就是乘以 2^3 = 8
  3. 因此有:
    • R5 << 3 = 2 << 3 = 16
  4. ADD R0, R5, R5, LSL #3 的含义是:
    • R0 = R5 + (R5 << 3)
  5. 代入数值可得:
    • R0 = 2 + 16 = 18

所以最后 R0 = 18


连续运算后的 R0

ADD R0, R0, R0, LSL #2
RSB R0, R0, R0, LSL #3

上述操作执行后,R0 变为多少?

参考答案:630

详细思路:

  1. 这一题默认接着上一题的结果做,因此初始时 R0 = 18
  2. 先看第一条指令:
    • ADD R0, R0, R0, LSL #2
    • 含义是 R0 = R0 + (R0 << 2)
    • R0 << 2 = 18 << 2 = 72
    • 所以更新后 R0 = 18 + 72 = 90
  3. 再看第二条指令:
    • RSB R0, R0, R0, LSL #3
    • RSB 是 Reverse Subtract,含义是:
      • R0 = (R0 << 3) - R0
    • 此时 R0 = 90
    • R0 << 3 = 90 << 3 = 720
    • 所以:
      • R0 = 720 - 90 = 630

所以最终 R0 = 630


ARM9 流水线

ARM9 内核采用几级流水线?分别是?

参考答案:5 级流水线

详细思路:

  1. ARM9 比 ARM7 的流水线更深,常见考法就是“ARM7 为 3 级,ARM9 为 5 级”。
  2. 五级流水线的目的是让多条指令在不同阶段并行推进,从而提高吞吐率。
  3. 五个阶段通常写成:
    • 取指:从存储器中取指令;
    • 译码:分析指令和操作数;
    • 执行:完成 ALU 运算或地址计算;
    • 访存:如果是访存指令,则访问内存;
    • 回写:把结果写回寄存器。

考试时通常写“5 级流水线:取指、译码、执行、缓冲/数据、回写”即可。

来源于02-第二章-ARM技术概述-2026第 59 页。


32 位 ARM 的地址空间与指令长度

32 位 ARM 处理器的地址空间是?
一条 ARM 指令占几个字节?一条 Thumb 指令占几个字节?
除了 ARM 与 Thumb,还有哪些后续发展的指令集?

参考答案:

详细思路:

  1. 32 位地址总线可以表示 2^32 个地址,因此地址空间大小为:
    • 2^32 Byte = 4GB
  2. 经典 ARM 状态下的 ARM 指令长度固定为 32 位,也就是:
    • 32 bit = 4 Byte
  3. 经典 Thumb 指令长度固定为 16 位,也就是:
    • 16 bit = 2 Byte
  4. ARM 后续又扩展出新的指令集或执行状态,常见考法会写:
    • Thumb-2
    • Jazelle

除了原生的 ARM(32位)和 Thumb(16位)指令集,ARM 架构在后续演进中还发展出了以下关键指令集:

这些指令集中,Thumb-2 在当前 Cortex 系列中应用非常广泛。


存储指令

ARM汇编中,用于将寄存器R1的值存入内存地址0x1000的指令是?

参考答案:A

详细思路:

  1. 题目要求“把寄存器中的值存入内存”,关键词是“存”,因此应使用 STR(Store Register)。
  2. 各选项含义如下:
    • A:STR,表示把寄存器内容写入某个内存地址,方向正确;
    • B:LDR,表示从内存读取到寄存器,方向相反;
    • C:MOV,是寄存器和立即数之间的数据传送,不是写内存;
    • D:PUSH,是压栈操作,不是把数据明确写到 0x1000

因此答案选 A。

本题为考试常见简化表述。实际开发中需先将绝对地址加载至寄存器,再执行 STR。具体细节请咨询大模型。


栈指针寄存器

下列哪个寄存器在ARM中通常用作栈指针(Stack Pointer)?

参考答案:B

详细思路:

  1. ARM 中有一些寄存器有约定俗成的特殊用途:
    • R13 = SP:栈指针(Stack Pointer),用于指示当前栈顶位置。
    • R14 = LR:链接寄存器(Link Register),保存函数返回地址
    • R15 = PC:程序计数器(Program Counter),指向当前执行指令的地址
  2. 因此用于栈指针的是 R13

所以答案选 B。


加 5 运算

以下哪条指令能正确将R0的值加上5,结果存入R1?

参考答案:A

详细思路:

  1. ADD R1, R0, #5 的标准格式是:
    • R1 = R0 + 5
  2. 其余选项:
    • B 是减法;
    • C 不是 ARM 合法汇编格式, MOV 的正确用法是 MOV R1, R0,表示把 R0 的值直接复制到 R1,而不是加上 5;
    • D 是从地址 R0 + 5 处取数据,不是做加法运算。

因此答案选 A。


条件后缀 EQ

ARM汇编中,用于条件执行的指令后缀“EQ”表示?

参考答案:D

详细思路:

  1. ARM 中大量指令都可以带条件后缀。
  2. EQ 的含义是 Equal,即“相等”。
  3. 它通常对应比较后零标志位 Z = 1 的情况。

因此答案选 D。


跳转到标签

以下哪条指令能跳转到标签loop处?

参考答案:B

详细思路:

  1. ARM 中最基本的无条件跳转指令是 B label
  2. 因此跳转到 loop 应写为:
    • B loop
  3. 其他选项中:
    • A 表示把 loop 的地址直接加载到程序计数器 PC,虽然也能实现跳转,但不如 B 指令规范和常见;
    • C 是比较,不是跳转;
    • D 表示从 loop 地址处加载数据到 PC,这不是标准的跳转方式。

因此答案选 B。


函数返回值寄存器

以下哪个寄存器在函数调用时通常用于保存返回值?

参考答案:A

详细思路:

  1. 按 ARM 的函数调用约定,函数返回值一般放在 R0 中。
  2. 如果返回更大的数据,也可能会联合使用 R1,但最常见单个返回值是 R0
  3. SP 是栈指针(Stack Pointer),LR 是返回地址寄存器(Link Register),都不是返回值寄存器。

因此答案选 A。


逻辑左移

以下哪条指令能正确将R2的值逻辑左移2位?

参考答案:A

详细思路:

  1. LSL 表示逻辑左移。
  2. LSR 是逻辑右移,ASR 是算术右移,ROR 是循环右移。
  3. 所以“逻辑左移 2 位”应该写成:
    • LSL R2, R2, #2

因此答案选 A。


从函数返回

以下哪条指令用于从函数返回?

参考答案:B

详细思路:

A 选项 RET 是 x86 汇编中的返回指令,不适用于 ARM。 B 选项 BX LR 是 ARM 中常用的返回指令,LR 寄存器保存了函数调用时的返回地址。 C 选项 POP {PC} 适用于函数开头已经将返回地址压栈的情况,题中没有说明这种情况,因此不一定适用。

所以答案选 B。


比较指令

以下哪条指令能正确比较R3和R4的值?

参考答案:D

详细思路:

A 选项 ADD 是加法指令,在这里是把 R3 和 R4 的值相加。 B 选项 SUB 是减法指令,在这里是把 R3 的值减去 R4 的值。 C 选项 MOV 是数据传送指令,在这里是把 R4 的值复制到 R3。 D 选项 CMP 是 ARM 中专门用于比较的指令,它会设置条件码以供后续条件执行指令使用。

所以答案选 D。


加载立即数

以下哪个指令用于加载立即数0x1234到R5?

参考答案:B

详细思路:

  1. ARM 汇编中,加载较大的立即数时,最常用的写法是伪指令:
    • LDR R5, =0x1234
  2. 汇编器会根据情况把这个常数直接编码,或者放到文字池中再加载。
  3. 其他选项中:
    • A 表示把立即数直接放入寄存器,但 ARM 的 MOV 指令只能直接编码较小的立即数,0x1234 可能无法直接编码;
    • C 语法不完整,而且是加法;
    • D 是存储,不是加载。

因此答案选 B。


大端格式与小端格式

什么是小端格式?什么是大端格式?

参考答案:

详细思路:

  1. “端格式”讨论的是一个多字节数据在内存中如何排列。
  2. 以 32 位数据 0x12345678 为例:
    • 小端模式下:
      • 地址从低到高依次存 78 56 34 12
    • 大端模式下:
      • 地址从低到高依次存 12 34 56 78
  3. 记忆方法:
    • 小端:小的部分(低字节)放在小地址;
    • 大端:大的部分(高字节)放在小地址。

嵌入式操作系统的功能

嵌入式操作系统的功能?

参考答案:

嵌入式操作系统的核心功能主要体现在以下两个方面:

  1. 屏蔽硬件差异(补平界面):隐藏底层硬件的具体细节,为上层应用提供统一、抽象的接口,使开发者无需考虑硬件差异,专注于应用逻辑开发,。
  2. 核心资源管理
    • 多任务管理:提供调度机制,控制多个线程或进程的起始、执行、暂停与结束。
    • 存储管理:负责内存的分配与回收、虚拟地址转换、内存扩充及保护, 。
    • 周边资源管理:通过驱动程序管理 I/O 设备、通讯端口及外接控制器等资源,。
    • 中断管理:负责中断的初始化安装、现场保护与恢复,以及中断栈的嵌套管理。

Cortex-A8 的工作模式与处理器状态

CORTEX-A8 处理器几种工作模式?处理器状态有哪些?

参考答案:

Cortex-A8 处理器基于 ARMv7 架构,其工作模式和状态总结如下:

8 种工作模式

处理器包括 1 种用户模式和 7 种特权模式

  1. 用户模式 (usr):正常程序执行模式。
  2. 系统模式 (sys):运行特权级操作系统任务,与用户模式共用寄存器。
  3. 管理模式 (svc):系统复位或执行软件中断(SWI)指令时进入。
  4. 外部中断模式 (irq):处理低优先级中断。
  5. 快速中断模式 (fiq):处理高优先级中断,用于高速数据传输。
  6. 数据访问中止模式 (abt):当存取异常时进入。
  7. 未定义指令中止模式 (und):执行未定义指令时进入。
  8. 安全监控模式 (mon):用于安全模式和非安全模式下的转换。

处理器状态

处理器主要在以下状态间切换:


汇编实现选择排序,并由 C 调用

编写一段汇编语言源程序,实现 10 个输入数据的选择排序功能,并在另一 C 语言程序中调用这个程序,依次按序输出出来。

参考答案:

下面给出一种基于 ARM 汇编与 C 混合编程的实现方案。
约定排序为升序,C 程序把数组首地址传给汇编函数,汇编函数对 10 个整数原地排序,返回后再由 C 程序依次输出。

1. 设计思路

  1. 选择排序的核心思想:
    • 第 1 趟从 a[0..9] 中找最小值,与 a[0] 交换;
    • 第 2 趟从 a[1..9] 中找最小值,与 a[1] 交换;
    • 第 9 趟从 a[8..9] 中找最小值,与 a[8] 交换。
  2. 因为一共有 10 个数据,所以外层循环做 9 趟即可。
  3. 在 ARM 调用约定中:
    • R0 通常用来传第一个参数,因此可让 R0 保存数组首地址;
    • 汇编函数内部通过偏移地址访问 a[i]a[j]a[min]
  4. 排序完成后返回 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. 详细思路拆解

外层循环在做什么

  1. 外层循环变量 i 表示“当前应该放置第几个最小值”。
  2. i = 0 时,在整个数组中找最小值,放到第 0 个位置。
  3. i = 1 时,在剩余部分 a[1..9] 中找最小值,放到第 1 个位置。
  4. 重复直到 i = 8,此时最后两个元素也自然有序了。

内层循环在做什么

  1. min = i,表示当前最小值下标先假设为 i
  2. ji + 1 扫描到 9
  3. 若发现 a[j] < a[min],就更新 min = j
  4. 内层循环结束后,min 就是本趟最小元素的位置。

交换过程在做什么

  1. min == i,说明当前位置已经是最小值,不需要交换。
  2. 否则交换 a[i]a[min]
  3. 汇编中交换的本质就是:
    • 先把两个位置的值分别读到寄存器;
    • 再把它们写回对方所在位置。

地址计算为什么要左移 2 位

  1. 这里数组元素类型是 int,每个元素占 4 字节。
  2. 数组下标 k 对应地址偏移量是 k * 4
  3. 在汇编中,乘 4 常写成:
    • LSL #2
  4. 所以:
    • a[k] 的地址 = 数组首地址 + (k << 2)

6. 作答思路

  1. 选择排序思想:每趟从未排序区中选最小元素,与当前首元素交换。
  2. ARM 汇编函数接收数组首地址 R0,通过双重循环实现 10 个整数升序排列。
  3. 外层循环控制趟数,内层循环寻找最小值下标,最后完成交换。
  4. C 程序通过 extern 声明该汇编函数,传入数组后调用,再循环输出即可。

这样既写出了算法思想,也体现了 ARM 与 C 的接口调用关系。


在 Github 上编辑此页
分享这篇资料:

上一篇
嵌入式系统设计与应用-2025sp-回忆版
下一篇
嵌入式系统设计与应用-2026sp-重点