学习笔记
前言
本文主要是对于b站尚硅谷的计算机组成原理的学习笔记,仅用于学习交流。
1. 指令
1.1 组成
- 操作码(Opcode):指指令中执行特定操作的部分。
- 地址码:指令中用于指定操作数位置的部分。
1.2 扩展操作码
- 变化长度操作码:采用哈夫曼编码等技术确保操作码不重复。
- 实现步骤:需求分析、设计、硬件实现、软件支持、验证测试和文档发布。
2. 常见的数据寻址方式
2.1 立即寻址
- 定义:操作数直接写在指令中,不需要访问内存。
- 实现:指令的操作数就是数据。
- 应用场景:常用于赋值操作,例如
MOV AX, 5
,将数值 5 加载到寄存器AX
。 - 优点:简单,速度最快。
- 缺点:数据范围小。
2.2 直接寻址
- 定义:指令中给出的是一个内存地址,CPU 直接访问该地址的内容。
- 实现:从内存中直接读取数据。
- 应用场景:简单的内存访问。
- 优点:简洁
- 缺点:不灵活,无法动态计算地址。
2.3 间接寻址
- 定义:指令中给出的地址是一个指针,指向另一个内存地址,CPU 需要先从该指针中获取目标地址,再访问数据。
- 实现:首先从给定的地址获取一个指向数据的地址,然后再访问数据。
- 应用场景:动态数据访问,指针操作等。
- 优点:灵活,可以访问不同的内存位置,尤其适用于复杂数据结构。
- 缺点:需要两次内存访问,速度较慢。
2.4 隐含寻址
定义:指令的操作数由指令本身隐含或自动确定,操作数的位置不需要显式提供。CPU 在执行指令时自动操作特定的寄存器或内存位置。
实现:操作码本身决定了操作数的位置,通常固定与某些寄存器或硬件资源关联。
应用场景:适用于寄存器操作、堆栈操作、状态寄存器操作等简单且快速的操作。
优点:
- 无需显式地址,指令格式简洁。
- 操作快速,无需地址计算或内存访问。
缺点:
- 灵活性较差,操作数位置固定,无法动态指定或变更。
2.5 寄存器寻址
- 定义:操作数直接存储在寄存器中,指令通过指定寄存器来访问数据。
- 实现:指令操作数本身是寄存器的值,无需访问内存。
- 应用场景:寄存器之间的操作,如
MOV AX, BX
,将寄存器BX
的值复制到AX
。 - 优点:访问速度非常快,因为寄存器访问是最快的。
- 缺点:数量有限,无法存储大量数据。
2.6 寄存器间接寻址
- 定义:使用寄存器存储数据的地址,寄存器中存储的是指向数据的内存地址,CPU 通过寄存器访问内存。
- 实现:寄存器中的值指向目标数据的内存地址,CPU 通过该寄存器来间接访问数据。
- 应用场景:通过寄存器指向内存地址的操作,如
MOV AX, [BX]
,将BX
指向的内存地址中的值加载到AX
寄存器中。 - 优点:灵活,寄存器间接寻址支持动态访问内存。
- 缺点:需要管理寄存器中的地址,速度较直接寻址慢。
2.7 基址寻址
- 定义:通过基地址寄存器和偏移量计算最终地址。
- 实现:将基址寄存器和偏移量相加,得到内存地址。
- 应用场景:数组或结构体的访问。
- 优点:适合访问连续的数据块,灵活,常用于数组和结构体。
- 缺点:需要管理基址寄存器和偏移量。
2.8 变址寻址
- 定义:基址寻址的一种扩展,使用基址寄存器和索引寄存器的组合来计算地址。
- 实现:基址寄存器 + (索引寄存器 × 步长) + 偏移量。
- 应用场景:访问数组元素。
- 优点:支持灵活的内存访问,尤其适用于数组访问。
- 缺点:需要使用多个寄存器,增加了计算复杂度。
2.9 相对寻址
- 定义:相对地址是指相对于当前指令的地址(或程序计数器
PC
)的偏移量。 - 实现:通过当前地址(
PC
)加上偏移量计算最终地址,常用于跳转或分支指令。 - 应用场景:程序跳转、分支语句、函数调用等。
- 优点:常用于控制流操作,支持代码独立性和程序重定位。
- 缺点:只能用于跳转和分支指令,通常不适用于数据访问。
2.10 堆栈寻址
- 定义:通过栈顶指针(
SP
)来访问数据。 - 实现:栈顶元素的地址由栈指针寄存器(
SP
)决定。 - 应用场景:函数调用、局部变量管理、返回地址管理等。
- 优点:支持动态的函数调用和局部数据存取,常用于递归和函数栈。
- 缺点:操作栈需要使用专门的寄存器和管理机制。
**CISC 和 RISC **
1. CISC(复杂指令集计算机)
- 定义:CISC 是一种复杂指令集架构,其指令设计旨在让每条指令能够完成更多复杂的操作,从而减少程序代码长度。
特点
- 复杂指令:
- 每条指令可能完成多个操作,如加载数据、计算结果、存储数据。
- 指令长度不固定。
- 多种寻址方式:
- 支持多种复杂的寻址模式(如直接寻址、间接寻址、变址寻址等)。
- 微代码控制:
- CISC 使用微代码来解释复杂指令,并将其转化为多个基本的硬件操作。
- 高指令密度:
- 程序代码更短,因为每条指令能完成更复杂的操作。
- 硬件复杂:
- 由于需要支持多种复杂指令和寻址方式,硬件设计复杂。
优点
- 程序代码短,适合内存较小的环境。
- 单条指令完成更多操作,减少了程序员编写代码的复杂性。
缺点
- 执行复杂指令可能需要多个时钟周期,性能不如精简架构高效。
- 硬件设计复杂,增加了成本和功耗。
代表
- x86 架构:Intel 和 AMD 的大多数处理器都属于 CISC。
2. RISC(精简指令集计算机)
- 定义:RISC 是一种精简指令集架构,其设计目标是提供少而简单的指令集,以提高指令执行效率。
特点
- 精简指令:
- 每条指令执行一个基本操作,如加法、存储、加载等。
- 指令长度固定,通常为 32 位。
- 单周期执行:
- 大多数指令在一个时钟周期内完成。
- 少寻址方式:
- 通常支持少量简单的寻址模式(如寄存器寻址和立即寻址)。
- 硬连线控制:
- 指令直接由硬件实现,无需微代码解释。
- 依赖寄存器:
- RISC 处理器通常配备大量的通用寄存器,用于存储中间数据,减少对内存的访问。
优点
- 每条指令执行快,指令执行效率高。
- 硬件设计简单,功耗低,易于优化和扩展。
缺点
- 程序代码长度较长,因为复杂操作需要多条指令组合实现。
- 对编译器要求较高,需要优化生成高效的指令序列。
代表
- ARM 架构:大多数移动设备(如智能手机、平板电脑)的处理器都使用 ARM。
- MIPS 架构:早期嵌入式设备和学术研究中常用的架构。
3. CISC 和 RISC 的对比
特性 | CISC | RISC |
---|---|---|
指令数量 | 多 | 较少 |
编译器 | 要求低 | 要求高 |
指令字长 | 不固定 | 固定 |
执行时间 | 多个时钟周期 | 大多为单个时钟周期 |
通用寄存器数量 | 少 | 多 |
各种指令使用频率 | 相差较大 | 相差不大 |
寻址方式 | 支持多种复杂的寻址方式 | 支持少量简单的寻址方式 |
硬件设计 | 复杂,依赖微代码 | 简单,硬连线控制 |
代码长度 | 短 | 长 |
功耗 | 较高 | 较低 |
兼容性 | 较好 | 较差 |
典型应用 | PC、服务器(如 x86 架构) | 嵌入式系统、移动设备(如 ARM) |
结语
好累,好多没看懂的都得问问AI,寻址什么的…好麻烦。