嵌入式系统/汇编语言
本书将演示使用汇编语言编程嵌入式系统的技术。
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 硬件通信。
在任何时候,都可以访问 17 个寄存器:R0 到 R14(具有相同的硬件)、R15 和状态寄存器 CPSR。
(为了减少 延迟 在中断处理中,这些寄存器和 SPSR“保存的程序状态寄存器”在中断期间被“镜像”。包括这些镜像,典型的 ARM 处理器总共有 37 个寄存器)。
ARM 的标准 C 调用约定是:[1]
- R15:PC:程序计数器
- R14:LR:链接寄存器(保存最近子程序调用的返回地址)
- R13:SP:堆栈指针(用于嵌套子程序调用)
- R12-R4:长期变量:仅在子程序在返回之前恢复原始值时才由子程序使用
- R3-R0:临时变量和子程序调用参数以及子程序返回值。
I/O 硬件通常是“内存映射”。
- 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 个单独的小寄存器视为一个大的寄存器。本章将稍微讨论一下这个主题。