一、指令寻址
1.1 本节大纲
- 基本概念: 指令寻址是指确定下一条指令在主存中存放地址的过程,由程序计数器(PC)实现
- 两种方式:
- 顺序寻址:(PC)+”1″→PC
- 跳跃寻址:通过转移指令改变PC值
- 指令结构: 一条指令包含操作码(OP)和地址码(可能有多个)
1.2 回忆:计算机的工作过程
- 程序计数器作用: PC始终指向下一条待执行指令的地址
- 执行流程:
- 初始PC=0,指向第一条指令
- 取指令后PC自动加”1″(具体加值取决于系统特性)
- 执行当前指令
- 重复上述过程
1.3 指令寻址 – 顺序寻址
主存的编址发生概念,地址也发生改变
1.4 跳跃寻址 – 由转移指令指出
- 实现方式: 通过转移类指令(如JMP)直接修改PC值
- 执行过程:
- 取指令后PC仍按顺序+1
- 执行转移指令时强制修改PC为目标地址
- 示例:执行JMP7指令后PC值被强制改为7
- 特点: 改变程序正常执行流,实现非顺序执行
1.5 本节回顾
- 核心概念: 通过PC确定下条指令地址
- 顺序寻址要点:
- 取指令后PC必然更新
- “1”代表指令字长单位
- 跳跃寻址要点: 执行转移指令导致PC值改变
- 执行阶段: 所有指令都包含”取指令”和”执行指令”两个阶段
二、数据寻址
2.1 数据寻址 VS 数据寻址
指令寻址的定义
- 核心概念:确定CPU下一条要执行指令的存放地址
- 实现方式:始终由程序计数器PC给出指令地址
- 两种类型:
- 顺序寻址:PC自动+1
- 跳跃寻址:通过JMP等指令改变PC值
数据寻址的定义
- 核心概念:确定指令中地址码(A)指明的真实操作数地址
- 组成部分:指令由操作码(OP)和地址码(A)组成
- 典型示例:
- LDA 1000:操作码为LDA,地址码为1000
- ADD 1001:操作码为ADD,地址码为1001
数据寻址的复杂性
- 地址解释多样性:地址码可能表示真实地址、偏移量或立即数
- 程序存储问题:程序不一定从地址0开始存储,需要灵活解释地址
- 示例说明:
- 程序从地址100开始存储时,JMP 7应解释为跳转到107(100+7)
- 程序从地址0开始存储时,JMP 7直接跳转到7
2.2 知识总览 – 10种寻址方式
- 指令结构发展:
- 原始结构:操作码(OP) + 地址码(A)
- 改进结构:操作码(OP) + 寻址特征 + 形式地址(A)
- 寻址特征作用:用4位二进制标识10种寻址方式
- 术语说明:
- 形式地址(A):指令中给出的地址
- 有效地址(EA):最终的操作数真实地址
2.3 数据寻址 – 直接寻址
- 定义:EA = A,形式地址即真实地址
- 优点:
- 执行简单,无需地址转换
- 执行速度快
- 缺点:
- 寻址范围受限(受地址码位数限制)
- 地址修改不灵活
2.4 数据寻址 – 间接寻址
- 定义:EA = (A),形式地址指向存有真实地址的单元
- 访存次数:
- 一次间址:执行期间2次
- 多次间址:每多一级多1次访存
- 优点:
- 扩大寻址范围(可用更长地址)
- 便于编程(支持多级调用)
- 缺点:执行效率低(多次访存)
2.5 数据寻址 – 寄存器寻址
- 定义:EA =Ri,操作数直接在寄存器中
- 访存次数:执行期间0次
- 优点:
- 执行速度最快
- 指令字长短
- 支持向量/矩阵运算
- 缺点:寻址能力有限(寄存器数量少)
2.6 数据寻址 – 寄存器间接寻址
- 定义:EA =(Ri),寄存器内容为操作数地址
- 访存次数:执行期间1次
- 特点:比主存间接寻址更快(寄存器访问快)
2.7 数据寻址 – 隐含寻址
- 定义:操作数地址隐含在指令中(如ACC)
- 访存次数:取决于隐含位置
- 特点:
- 缩短指令字长
- 需要专用硬件支持
2.8 数据寻址 – 立即寻址
- 定义:A即是操作数本身(立即数)
- 访存次数:执行期间0次
- 表示方法:常用#前缀标识(如#3)
- 优点:执行速度最快
- 缺点:数值范围受限(受地址码位数限制)
2.9 本节回顾
- 关键对比:
- 直接寻址:EA=A,访存1次
- 一次间址:EA=(A),访存2次
- 寄存器寻址:EA=Rii,访存0次
- 立即寻址:A为操作数,访存0次
- 学习重点:
- 各种寻址方式的有效地址计算规则
- 不同寻址方式的访存次数差异
- 各种寻址方式的优缺点比较
三、数据寻址 – 偏移寻址
3.1 数据寻址示例
- 直接寻址应用:当程序从地址0开始存放时,指令”LDA 1000″中的地址码1000可直接作为有效地址访问操作数
- 基址寻址应用:当程序从地址100开始存放时,jump指令的地址码7应解释为从起始地址100偏移7个单位(即107)
- 相对寻址应用:PC当前指向104时,地址码3应解释为从PC值104偏移3个单位(即107)
3.2 知识总览
- 偏移寻址大类:包含基址寻址、变址寻址和相对寻址三种方式,共同特征是以特定地址为起点加上形式地址的偏移量
- 有效地址计算:操作数的真实地址称为有效地址(EA),由操作码(OP)、寻址特征和形式地址(A)共同决定
3.3 偏移寻址的概念
3.4 基址寻址
基址寻址原理
- 专用基址寄存器实现
- 计算公式:EA=(BR)+A,其中BR为基址寄存器内容,A为指令中的形式地址
- 硬件实现:通过ALU将BR内容和形式地址A相加得到有效地址
- 操作系统关联:基址寄存器相当于操作系统中的重定位寄存器,用于程序装入管理
- 通用寄存器实现方式
- 寄存器指定:当使用通用寄存器作为基址寄存器时,指令中需包含寄存器编号字段
- 位数确定:寄存器编号字段的比特数由通用寄存器总数决定(如8个寄存器需要3位)
- 访问限制:被指定为基址寄存器的通用寄存器内容不可被用户程序修改
3.5 基址寻址的作用
- 程序浮动支持:允许程序从内存任意地址开始存放,只需修改BR值即可适应不同装入地址
- 多道程序实现:不同程序的BR值保存在各自PCB中,实现多程序并发运行时的地址转换
- 寻址范围扩展:通过基地址+偏移量的方式,突破形式地址位宽限制,扩大可访问地址空间
- 管理权限:基址寄存器内容只能由操作系统修改,保证内存管理的安全性和统一性
基址寻址的核心是通过 “基址寄存器内容 + 指令中的位移量” 计算有效地址,主要作用有:
方便程序重定位:程序加载到内存不同位置时,无需修改指令中的位移量,只需调整基址寄存器的值,就能让程序正确访问数据,这对操作系统中程序的灵活加载很重要。
扩大寻址范围:基址寄存器的位数通常比指令中位移量的位数多,两者相加后可访问的内存空间比仅用位移量大得多。
3.6 变址寻址
基本概念与原理
- 有效地址计算:EA=(IX)+A,其中IX为变址寄存器(专用或通用寄存器),A为指令中的形式地址
- 寄存器类型:系统可能专门设置变址寄存器IX(Index Register),也可能使用通用寄存器作为变址寄存器
- 面向用户特性:与基址寻址的关键区别在于,变址寄存器IX的内容可由程序员修改,属于用户可见寄存器
寻址特点与应用
- 角色分配:
- 形式地址A:作为基地址(固定值)
- 变址寄存器IX:作为偏移量(可变值),与基址寻址的角色分配相反
- 数组处理优势:将数组首地址设为A,通过修改IX值即可访问数组任意元素,特别适合循环程序
- 例:对数组a0到a9求和时,只需保持A指向数组首地址,循环修改IX值从0递增到9
3.7 变址寻址的作用
编程实例解析
- 传统实现缺陷:需要10条独立加法指令(地址码分别为12-21),无法适应数组规模变化
- 变址优化方案:
- 执行过程:
- 第一轮:IX=0,访问地址7+0=7(a0)
- 第二轮:IX=1,访问地址7+1=8(a1)
- …
- 终止条件:当IX=10时,10-IX≤0终止循环
3.8 变址寻址的优缺点
关键区别总结
- 与基址寻址对比:
- 修改权限:基址寄存器内容由OS管理,变址寄存器内容由用户程序修改
- 角色定位:基址寻址中形式地址为偏移量,基址寄存器提供基地址;变址寻址中角色互换
- 硬件实现提示:比较操作实际执行10−IX运算,结果>0时触发条件跳转(PC←2)
3.9 基址和变址复合寻址
例题:基址变址复合寻址应用
- 复合寻址原理: 将基址寻址和变址寻址结合使用,先进行基址寻址(形式地址A+基址寄存器BR内容),再进行变址寻址(加上变址寄存器IX内容),最终得到有效地址EA。
- 地址计算示例: 当程序起始地址为100,BR=100,A=7,IX=2时,EA=(100+7)+2=109,正好访问数组元素a2。
- 寻址方式类比: 每种寻址方式可视为将形式地址A映射为有效地址EA的函数,复合寻址相当于数学中的复合函数。
- 实际应用场景: 当程序在内存中的存放位置改变时(如从地址0改为地址100),单独使用变址寻址会失效,必须结合基址寻址才能正确定位数据。
3.10 相对寻址
注:王道书上错的
3.11 相对寻址的作用
相对寻址优点
3.12 本节回顾
- 隐含寻址:操作数由程序指定,执行期间不需要访存
- 立即寻址:指令中的地址字段A直接就是操作数,执行期间不需要访存
- 寄存器寻址:有效地址EA等于寄存器R的内容,执行期间不需要访存
- 寄存器间接寻址:有效地址EA等于寄存器R中存储的地址,执行期间需要访存1次
- 相对寻址:有效地址EA等于PC值加上偏移量A,执行期间需要访存1次
- 直接寻址:有效地址EA等于指令中的地址字段A,执行期间需要访存1次
- 间接寻址:有效地址EA等于地址A中存储的内容,执行期间需要访存2次
- 偏移寻址分类:相对寻址、基址寻址和变址寻址都属于偏移寻址,都是通过基地址加上偏移量来计算有效地址
- 相对寻址特点:常用于转移指令,偏移量是相对于下一条指令的地址(PC已自动更新),而非当前指令
- 基址寻址应用:多用于多道程序并发运行,由操作系统管理基址寄存器
- 变址寻址优势:便于实现循环程序和对数组的访问
- 访存次数:这三种偏移寻址方式在指令执行期间都只需要访存1次
四、堆栈寻址
4.1 堆栈寻址概念
- 定义:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址的寻址方式
- 核心特征:采用”后进先出(LIFO)”原则管理存储区,通过专用寄存器SP(堆栈指针)指示当前栈顶位置
- 操作特点:指令中不需要显式给出操作数地址,地址信息隐含在SP寄存器中
4.2 寄存器实现堆栈 – 硬堆栈
4.3 寄存器实现堆栈 – 软堆栈
- 软堆栈实现:从主存中划分特定区域作为堆栈空间
- 与硬堆栈对比:
- 速度:硬堆栈(寄存器实现)速度更快
- 成本:软堆栈(主存实现)成本更低
- 访存:软堆栈每次操作需1次访存,硬堆栈无需访存
- 实际应用:
- 系统通常采用软堆栈实现
- 用于存储函数调用信息、局部变量等程序运行数据
- 是实现函数调用的基础机制
- 有效地址确定:
- 出栈时:当前SP值即为有效地址
- 入栈时:需先调整SP(±1),新SP值才是有效地址
4.4 本节回顾
- 堆栈寻址关键参数:
- 有效地址:由SP指针隐含指示
- 访存次数:硬堆栈0次,软堆栈1次
- 操作特点:
- 入栈/出栈时EA确定方式不同
- 硬件自动完成SP指针的增减操作
- 系统重要性:
- 是实现函数调用的关键机制
- 程序运行时管理调用栈的基础
- 学习要点:
- 需掌握不同栈顶方向(地址增大/减小)时SP的变化规律
- 理解硬/软堆栈的实现差异及访存特性
- 结合数据结构中栈的操作理解寻址过程
五、硬件如何实现数的“比较”?
1)高级语言中的比较操作与硬件实现
- 高级语言表现:如if a>b这样的条件判断语句
- 硬件本质:CPU执行compare指令,实质是通过a−b运算实现比较
2)硬件比较的过程:减法操作
- 运算结果:a−b可能得到零、正数、负数或产生溢出
- 结果记录:运算结果信息被存入程序状态字寄存器(PSW)
3)PSW中的标志位
- CF(进位标志):记录运算是否产生进位/借位(1表示有,0表示无)
- ZF(零标志):记录运算结果是否为零(1表示是,0表示否)
- SF(符号标志):记录运算结果是否为负(1表示是,0表示否)
- OF(溢出标志):记录运算是否产生溢出(1表示是,0表示否)
4)条件跳转指令的执行原理
- 判断机制:CPU根据PSW标志位决定是否转移程序执行流
- 示例分析:当a>b时,a−b结果会使ZF=0且SF=0,硬件电路据此修改PC值
5)汇编语言中的条件跳转指令
- je指令:jump when equal,当比较结果相等时跳转
- jg指令:jump when greater,当前数大于后数时跳转
- 其他指令:参考王道书总结的其他条件跳转指令
6)无条件跳转指令
- jump指令:不进行条件判断,直接修改PC值实现跳转
实例解析:与IX寄存器内容比较
- 比较过程:用立即数10减去IX寄存器内容,结果存入PSW
- 跳转判断:根据结果是否>0决定是否跳转到指定位置
PSW的其他称呼:标志寄存器
术语说明:程序状态字寄存器(PSW)在某些机器中也称为标志寄存器
本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客