当前位置: 首页 > article >正文

计算机组成原理——指令系统(五)

在这片广袤无垠的宇宙中,每一颗星辰都在诉说着自己的故事,每一次日出都是新的希望的开始。我们每个人都是自己命运的舵手,航行在未知的大海上。尽管波涛汹涌,风暴肆虐,但正是这些挑战塑造了我们的灵魂,让我们变得更加强大。不要害怕失败,因为它只是通往成功的必经之路;也不要畏惧孤独,因为在追求梦想的道路上,你从来都不是一个人。记住,最美好的事物往往出现在那些未曾预料到的时刻。所以,请带着你的勇气和希望,继续前行,因为只有不断超越自我,才能触摸到那片属于你的星空。无论前方的路多么崎岖不平,都请相信,你的努力终将绽放出最耀眼的光芒。

计算机组成原理资源网

https://www.wenjingketang.com/这里面有ppt课后习题及答案,需要的可以自行下载

目录

5.1 指令格式

5.1.1 操作码

5.1.2 地址码

5.1.3 指令字长度

5.1.4 指令助记符

5.1.5 指令格式举例

5.2 操作数的存储及其寻址方式

5.2.1 各种寻址方式下的地址计算方法

5.2.2 寻址方式举例

5.2.3 数据存储的字节顺序


5.1 指令格式

计算机指令是控制计算机执行特定操作的命令,其格式设计直接影响硬件实现的复杂性和编程效率。一条完整的指令通常包含操作码和地址码两部分,还可能包含其他辅助信息。本节将详细探讨指令格式的各个组成部分。

5.1.1 操作码

定义与作用
操作码(Opcode)是指令的核心部分,用于指示CPU执行的具体操作类型,如加法、减法、数据移动等。每条指令对应唯一的操作码,其长度决定了指令集的大小。例如,一个8位操作码最多支持256种不同的操作。

编码方式

  • 固定长度操作码:所有指令的操作码长度相同,译码简单,但扩展性差。

  • 可变长度操作码:根据指令功能分配不同长度的操作码,可优化指令空间利用率,但增加译码复杂度。

扩展操作码技术
通过将操作码与地址码字段结合使用,扩展可用操作码数量。例如,在指令字长受限时,通过减少地址码位数来增加操作码位数,允许更多指令类型。

设计考量

  • 指令功能覆盖:需涵盖算术运算、逻辑运算、数据传输、控制流等基本操作。

  • 硬件实现复杂度:复杂的操作码编码可能增加控制单元的设计难度。


5.1.2 地址码

功能与结构
地址码指定操作数的来源或结果的存储位置,可能指向内存地址、寄存器或立即数。根据指令中地址码的数量,可分为以下类型:

  1. 三地址指令
    格式:操作码 地址1 地址2 地址3
    功能:地址3 = 地址1 OP 地址2
    优点:表达式计算直观;缺点:指令长度较长。

  2. 二地址指令
    格式:操作码 地址1 地址2
    功能:地址1 = 地址1 OP 地址2
    常见于x86架构,需覆盖源和目的操作数,可能导致数据覆盖。

  3. 一地址指令
    格式:操作码 地址
    功能:隐式使用累加器(ACC)作为默认操作数,如ACC = ACC OP 地址
    适用于早期资源有限的计算机。

  4. 零地址指令
    格式:操作码
    功能:操作数通过堆栈隐式指定,如PUSH/POP操作。
    示例:后缀表达式计算(逆波兰表示法)。

地址码设计权衡

  • 指令长度:地址码数量增加导致指令字长增加,影响程序存储密度。

  • 灵活性:更多地址码提供更强的表达能力,但可能增加硬件复杂度。


5.1.3 指令字长度

定义与分类
指令字长指一条指令占用的二进制位数,分为以下类型:

  1. 定长指令:所有指令长度相同(如RISC架构的32位指令),简化译码逻辑。

  2. 变长指令:指令长度可变(如x86的1-15字节),提高代码密度但增加译码复杂度。

影响因素

  • 操作码长度:复杂指令集需要更多操作码位数。

  • 地址码数量:多地址指令需更多位指定操作数位置。

  • 硬件架构:总线宽度和寄存器大小影响指令字长选择。

优化技术

  • 指令压缩:通过编码技术减少常用指令的位数。

  • 多字指令:超长指令字(VLIW)通过并行执行提高效率。


5.1.4 指令助记符

定义与用途
指令助记符是操作码的符号化表示,便于程序员编写和阅读汇编代码。例如:

  • MOV 表示数据传送

  • ADD 表示加法操作

与机器码的映射
汇编器将助记符转换为二进制操作码。例如,在x86中:

ADD AX, BX  →  机器码 01 D8

常见助记符设计原则

  • 简洁性:如SUB(Subtract)、JMP(Jump)。

  • 一致性:类似操作使用相关缩写,如CMP(Compare)、INC(Increment)。


5.1.5 指令格式举例

MIPS指令格式
MIPS采用定长32位指令,分为三种类型:

  1. R型(寄存器型)

    • 结构:操作码(6) 源寄存器1(5) 源寄存器2(5) 目的寄存器(5) 移位量(5) 功能码(6)

    • 示例:ADD $t0, $t1, $t2 → 操作码为0,功能码为32。

  2. I型(立即数型)

    • 结构:操作码(6) 源寄存器(5) 目的寄存器(5) 立即数(16)

    • 示例:ADDI $t0, $t1, 100

  3. J型(跳转型)

    • 结构:操作码(6) 跳转地址(26)

    • 示例:J 0x00400000

x86指令格式
x86采用变长指令,结构复杂,包含以下字段:

  • 前缀(Prefix):如锁前缀(LOCK)或段覆盖(ES:)。

  • 操作码:1-3字节,可能包含寄存器编码。

  • ModR/M:指定寻址方式和寄存器。

  • SIB(Scale-Index-Base):用于复杂内存寻址。

  • 位移(Displacement)立即数(Immediate)

示例:

MOV EAX, [EBX+4*ESI+10]  
→ 操作码:8B  
→ ModR/M:84 B3(指定基址+变址+位移)  
→ SIB:10(比例因子=4)  
→ 位移:0A  

5.2 操作数的存储及其寻址方式

操作数的存储位置和访问方式是计算机体系结构设计的核心问题,直接影响程序效率和硬件实现。

5.2.1 各种寻址方式下的地址计算方法
  1. 立即寻址(Immediate Addressing)

    • 地址计算:操作数直接包含在指令中。

    • 示例MOV AX, 1234H → 将立即数1234H加载到AX寄存器。

    • 优点:快速,无需内存访问;缺点:数值范围受指令长度限制。

  2. 直接寻址(Direct Addressing)

    • 地址计算:地址码字段直接给出操作数内存地址。

    • 示例MOV AX, [2000H] → 从地址2000H读取数据到AX。

    • 优点:访问速度快;缺点:地址空间受限。

  3. 间接寻址(Indirect Addressing)

    • 地址计算:地址码字段指向存放实际地址的寄存器或内存单元。

    • 示例MOV AX, [BX] → 从BX寄存器指定的地址读取数据。

    • 优点:灵活,支持动态地址计算;缺点:需额外内存访问。

  4. 寄存器寻址(Register Addressing)

    • 地址计算:操作数位于寄存器中。

    • 示例ADD AX, BX → AX和BX均为寄存器。

    • 优点:速度最快;缺点:寄存器数量有限。

  5. 寄存器间接寻址(Register Indirect Addressing)

    • 地址计算:寄存器内容为操作数的内存地址。

    • 示例MOV AX, [SI] → SI寄存器存放操作数地址。

    • 应用:遍历数组或字符串。

  6. 基址寻址(Base Addressing)

    • 地址计算有效地址 = 基址寄存器 + 偏移量

    • 示例MOV AX, [BP+10] → BP为基址寄存器,10为偏移。

    • 用途:访问局部变量或栈帧数据。

  7. 变址寻址(Indexed Addressing)

    • 地址计算有效地址 = 变址寄存器 × 比例因子 + 偏移

    • 示例MOV EAX, [ESI*4 + 100] → 用于数组元素访问(元素大小为4字节)。

  8. 相对寻址(Relative Addressing)

    • 地址计算目标地址 = PC + 偏移量

    • 示例JMP +100 → 跳转到当前指令地址+100的位置。

    • 应用:位置无关代码(PIC)。

  9. 堆栈寻址(Stack Addressing)

    • 地址计算:隐式使用堆栈指针(SP)进行操作。

    • 示例PUSH AX → 将AX压入堆栈,SP自动递减。


5.2.2 寻址方式举例

x86架构中的复杂寻址
示例指令:

assembly

MOV EAX, [EBX + ESI*4 + 20]
  • 计算步骤

    1. ESI内容乘以比例因子4。

    2. 结果加上EBX基址寄存器值。

    3. 加上位移20得到有效地址。

    4. 从该地址读取数据到EAX。

ARM架构的灵活寻址
ARM支持自动变址的前/后索引寻址:

assembly

LDR R0, [R1, #4]!   ; 前索引:R1 = R1 + 4后加载数据到R0
LDR R0, [R1], #4    ; 后索引:加载数据到R0后,R1 = R1 +4

5.2.3 数据存储的字节顺序

大端序(Big-Endian)

  • 定义:最高有效字节存储在最低内存地址。

  • 示例:0x12345678在内存中的存储为:12 34 56 78

  • 应用:网络传输(TCP/IP)、Java虚拟机。

小端序(Little-Endian)

  • 定义:最低有效字节存储在最低内存地址。

  • 示例:0x12345678存储为:78 56 34 12

  • 应用:x86/x64架构、ARM默认模式。

字节顺序的影响

  • 数据交换:网络传输需统一使用大端序(网络字节序),通过htonl()等函数转换。

  • 内存访问:强制类型转换时,字节顺序可能导致数据解释错误。

  • 代码移植:跨平台代码需处理字节序差异。

检测字节序的C代码示例

c

#include <stdio.h>
int main() {
    int num = 0x12345678;
    char *p = (char*)#
    if (*p == 0x78) printf("Little-Endian\n");
    else printf("Big-Endian\n");
    return 0;
}


http://www.kler.cn/a/536050.html

相关文章:

  • langchain教程-11.RAG管道/多轮对话RAG
  • 蓝桥杯之c++入门(六)【string(practice)】
  • solidity高阶 -- 调用接口合约
  • 软件工程导论三级项目报告--《软件工程》课程网站
  • DeepSeek最新图像模型Janus-Pro论文阅读
  • C#属性和字段(访问修饰符)
  • 十一、CentOS Stream 9 安装 Docker
  • 【图像处理】-不同的图像存储格式
  • 蓝桥杯生命之树(DP)
  • 学习笔记:机器学习中的数学原理(一)
  • 【数据安全】现代智能手机的数据加密机制
  • Linux ftrace 内核跟踪入门
  • 可计算性与计算复杂性:理论计算机科学的核心领域
  • osclass增加支持webp格式
  • 【CPP】C++后端开发面试:深入理解编程中的锁机制
  • Linux进阶——web服务器
  • 【Spring Boot】自动配置源码解析
  • TcpClientTest
  • Python中 logging.basicConfig
  • 最新阿里高级Java面试题(首发,70道,带详细答案)
  • 支持向量机(一)
  • VERA: 基于视觉-语言模型的解释性视频异常检测框架
  • 大模型的微调方式
  • 【软件测试入门】Linux操作系统初级命令大全
  • 大模型蒸馏(Model Distillation)的原理及过程
  • 【Git】tortoisegit使用配置