计算机组成原理的学习笔记(8)--指令系统·其一 指令的组成以及数据寻址方式RISK和CISK
1. 指令
1.1 组成
操作码(Opcode):指指令中执行特定操作的部分。
地址码:指令中用于指定操作数位置的部分。
1.2 扩展操作码
变化长度操作码:采用哈夫曼编码等技术确保操作码不重复。
实现步骤:需求分析、设计、硬件实现、软件支持、验证测试和文档发布。
2. 常见的数据寻址方式
2.1 立即寻址
定义:操作数直接写在指令中,不需要访问内存。
实现:指令的操作数就是数据。
应用场景:常用于赋值操作,例如
MOV AX, 5
,将数值 5 加载到寄存器AX
。优点:简单,速度最快。
缺点:数据范围小。
2.2 直接寻址
定义:指令中给出的是一个内存地址,CPU 直接访问该地址的内容。
实现:从内存中直接读取数据。
应用场景:简单的内存访问,如
MOV AX, [0x2000]
。优点:简洁
缺点但不灵活,无法动态计算地址。
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
)决定。应用场景:函数调用、局部变量管理、返回地址管理等。
优点:支持动态的函数调用和局部数据存取,常用于递归和函数栈。
缺点:操作栈需要使用专门的寄存器和管理机制。
最后更新于