学习笔记
前言
本文主要是对于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
)决定。 - 应用场景:函数调用、局部变量管理、返回地址管理等。
- 优点:支持动态的函数调用和局部数据存取,常用于递归和函数栈。
- 缺点:操作栈需要使用专门的寄存器和管理机制。
结语
好累,好多没看懂的都得问问AI,寻址什么的…好麻烦。