跳转到内容

嵌入式系统/汇编语言

来自维基教科书,开放书籍,开放世界

本书将演示使用汇编语言编程嵌入式系统的技术。

x86 汇编回顾

[编辑 | 编辑源代码]

x86 微处理器至少有:

4 个通用寄存器
AX、BX、CX 和 DX。AX 是快速累加器。
4 个段寄存器
CS(代码段)、DS(数据段)、ES(额外段)、SS(堆栈段)。
5 个指针寄存器
SI(源索引)、DI(目标索引)、IP(指令指针)、SP(堆栈指针)、BP(基址指针)。
1 个标志寄存器
标志('7' 个标志,例如零标志、进位标志)

与“内存映射”处理器不同,x86 具有特殊的“I/O”指令(inp、outp),用于与 I/O 硬件通信。

ARM 汇编回顾

[编辑 | 编辑源代码]

在任何时候,都可以访问 17 个寄存器:R0 到 R14(具有相同的硬件)、R15 和状态寄存器 CPSR。

(为了减少 延迟 在中断处理中,这些寄存器和 SPSR“保存的程序状态寄存器”在中断期间被“镜像”。包括这些镜像,典型的 ARM 处理器总共有 37 个寄存器)。

ARM 的标准 C 调用约定是:[1]

  • R15:PC:程序计数器
  • R14:LR:链接寄存器(保存最近子程序调用的返回地址)
  • R13:SP:堆栈指针(用于嵌套子程序调用)
  • R12-R4:长期变量:仅在子程序在返回之前恢复原始值时才由子程序使用
  • R3-R0:临时变量和子程序调用参数以及子程序返回值。

I/O 硬件通常是“内存映射”。

摩托罗拉/飞思卡尔 HCS12(Star 12)回顾

[编辑 | 编辑源代码]
16 位累加器寄存器
D,可以作为两个 8 位寄存器访问:A(高位)和 B(低位)
2 个 16 位索引寄存器
X、Y
16 位堆栈指针寄存器
SP
16 位程序计数器
PC
8 位条件代码寄存器
CC

HCS12 基于旧的 68HC11,指令集非常相似。HCS12 是一个“大端”处理器:多字节值从最高有效字节到最低有效字节以递增的内存地址存储。

现代台式机几乎都是 32 位机器,下一代处理器将完全是 64 位。这对普通程序员来说很好,但当你处于一个嵌入式环境中,使用一个只有指甲盖大小的微控制器,它只能执行 4 位算术运算时,你会怎么做?32 位可能是台式机市场的标准,但嵌入式芯片没有金标准:更多位占用更多空间,成本更高。本质上,优秀嵌入式系统工程师的工作是找到最小、最便宜的微控制器来完成需要完成的任务。考虑以下表格

最大无符号数 最大有符号数 最小有符号数*
4 15 7 -8
8 255 127 -128
16 65,535 32,767 -37,768
* 2 的补码格式

即使是 16 位处理器也远不如标准 32 位处理器的 40 亿整数范围。假设我们有一个 4 位微控制器,它有 4 个可用的内部寄存器(每个 4 位),以及 256 字节的板载可编程内存。这个处理器除了最简单的任务之外什么也处理不了!如果我们需要在这个微处理器上操作一个 8 位数怎么办?例如,如果我们想用它制作一个数字时钟?这个 4 位微处理器将需要处理高达 59 的数字(在下一个小时之前显示的分钟数)。这将需要超过分配的 4 位,实际上将需要至少 6 位的空间。我们需要做的就是找到一种方法将 2 个单独的小寄存器视为一个大的寄存器。本章将稍微讨论一下这个主题。

进一步阅读

[编辑 | 编辑源代码]

参考文献

[编辑 | 编辑源代码]
  1. "ARM 架构的程序调用标准"
华夏公益教科书