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

devtools/2025/2/8 14:14:51/

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

计算机组成原理资源网

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.ppmy.cn/devtools/157106.html

相关文章

反向代理模块vk

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

调用腾讯云批量文本翻译API翻译srt字幕

上一篇文章介绍了调用百度翻译API翻译日文srt字幕的方法。百度翻译API是get方式调用&#xff0c;参数都放在ur中&#xff0c;每次调用翻译文本长度除了接口限制外&#xff0c;还有url长度限制&#xff0c;而日文字符通过ur转码后会占9个字符长度&#xff0c;其实从这个角度来讲…

.Net Core笔记知识点(跨域、缓存)

设置前端跨域配置示例&#xff1a; builder.Services.AddCors(option > {option.AddDefaultPolicy(policy > {policy.WithOrigins(originUrls).AllowAnyMethod().AllowAnyHeader().AllowCredentials();});});var app builder.Build();app.UseCors(); 【客户端缓存】接…

从零开始:OpenCV 图像处理快速入门教程

文章大纲 第1章 OpenCV 概述 1.1 OpenCV的模块与功能  1.2 OpenCV的发展 1.3 OpenCV的应用 第2章 基本数据类型 2.1 cv::Vec类 2.2 cv&#xff1a;&#xff1a;Point类 2.3 cv&#xff1a;&#xff1a;Rng类 2.4 cv&#xff1a;&#xff1a;Size类 2.5 cv&#xff1a;&…

微信小程序~django Petting pets(爱抚宠物)小程序

博主介绍&#xff1a;✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Redis基础--常用数据结构的命令及底层编码

零.前置知识 关于时间复杂度,按照以下视角看待. redis整体key的个数 -- O(N)当前key对应的value中的元素个数 -- O(N)当前命令行中key的个数 -- O(1) 一.string 1.1string类型常用命令 1.2string类型内部编码 二.Hash 哈希 2.1hash类型常用命令 2.2hash类型内部编码 2.3ha…

【CPP】CPP经典面试题

文章目录 引言1. C 基础1.1 C 中的 const 关键字1.2 C 中的 static 关键字 2. 内存管理2.1 C 中的 new 和 delete2.2 内存泄漏 3. 面向对象编程3.1 继承和多态3.2 多重继承 4. 模板和泛型编程4.1 函数模板4.2 类模板 5. STL 和标准库5.1 容器5.2 迭代器 6. 高级特性6.1 移动语义…

(2024|Nature Medicine,生物医学 AI,BiomedGPT)面向多种生物医学任务的通用视觉-语言基础模型

BiomedGPT: A generalist vision–language foundation model for diverse biomedical tasks 目录 1. 摘要 2. 引言 3. 相关研究 3.1 基础模型与通用生物医学 AI 3.2 生物医学 AI 的局限性 3.3 BiomedGPT 的创新点 4. 方法 4.1 架构及表示 4.1.1 模型架构选择 4.1.2 …