精华内容
下载资源
问答
  • 三菱PLC的指令系统

    2018-08-27 16:37:02
    三菱的指令系统在国内是被研究的比较深入的指令系统,因而国内仿三菱的PLC 也是最 多的。原因是三菱的PLC 比较简单,主要体现在以下几个方面:1、通讯协议简单,大约只有 4~5 个命令(读/写,force on/force off 等)...
  • 指令系统之指令格式

    千次阅读 2020-08-13 09:51:10
    指令系统一般和硬件设计耦合比较高,硬件一般跟随指令来设计,所以不同的硬件,同一套指令系统是不能兼容的(同一个厂商制作的硬件可能会支持)。 指令格式 一条指令就是机器语言的一个语句,它是一组有意义的二...

    一、指令格式

     

    • 什么是指令?

    指令其实就是机器语言0和1组成的语句,指令可以操控硬件来实现某种基本功能。多个指令组成的系统就叫指令系统。

    指令系统一般和硬件设计耦合比较高,硬件一般跟随指令来设计,所以不同的硬件,同一套指令系统是不能兼容的(同一个厂商制作的硬件可能会支持)。

    • 指令格式

    一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。

    一条指令通常由操作码地址码来组成:

    指令格式
    图 1 指令格式

    上图表示的只是一个抽象的概念,并没有指出其中具体的内容。下面举个实际的例子:

    图 2 指令格式
    图 2 指令格式

    图2是A1与A2操作后将结果放在A3中,A4是下一条指令的地址,以便当前指令执行完后继续执行下一条指令。简化后就是:A1 (OP) A2 -> A3, A4=.....

    • 地址指令

    上面说的指令格式其实就叫四地址指令,因为有四个地址。一个地址就是一个二进制串。

    OP是整条指令需要完成的功能,后面四个是主存中取的地址。假设这条四地址指令为OP(00000000) A1( 000001) A2( 000010) A3(占位,存放结果位) A4( 000100)

    设OP=00000000 代表“+”法操作,A1=000001,A2=000010, A3=000001 + 000010 = 000011,A4=000100,那么执行的过程如下图:

    图 3 指令执行过程
    图 3 指令执行过程

    指令对应主存中的内容为了识别方便,采用了16进制表示。

    假设指令字长为32位,操作码占8位,4个地址码字段各占6(32-8=24,24/4=6)位。设存储字长为32位,即4Bit。那么A1可直接表示2^6 = 64个不同位置。一条指令的执行(假设每个地址都是主存地址):

    1. 取指令 访问1次 (假设指令字长=存储字长,为了一次就可以取完)
    2. 取2个操作数 访存2次
    3. 存回结果 访存1次

    共计4次

     

    二、指令寻址方式

     

    上面介绍了四地址指令,那么可不可以省点地址呢?上面的情况是指令和地址存放在一起,如果我们把指令归为一类,操作地址归为一类,是不是就可以不需要下一个指令地址呢?

    图 4 程序计数器
    图 4 程序计数器

     

    有了程序计数器单元的加入,我们的指令变得精简和容易了。指令的下一条地址可以根据地址位顺位移动即可,方便查找;我们也不需要每次重复的单独给出指令地址空间,来存放下一条指令了。经过这样优化以后,就变成了“三地址指令”格式了。

    寻址范围

    上面说指令格式时说过,设指令字长及存储字长均为32位,操作码占8位。

    图 5 四地址指令
    图 5 四地址指令

    4个地址码字段各占6位(32-8=24,24/4=6),指令操作数直接寻址范围为2^6=64,完成一条指令需要访存4次。

    图 6 三地址指令
    图 6 三地址指令

    因为有了“程序计数器”,可以省略下一个指令地址存放空间。3个地址各占8位(32-8 = 24,24/3 =8),指令操作数直接寻址范围为2^8=256,完成一条指令需要访存次数还是4次(取指令,取A1,取A2,结果存回A3)

    图 7 二地址指令
    图 7 二地址指令

    二地址指令是A1既可以当操作数也可以当结果,是比较常见的一种格式。由于又少了一位地址,2个地址各占12位(32-8=24,24/2=12),指令操作数的直接寻址范围为2^12=4096,完成一次指令需要访存4次。

    图 8 一地址指令
    图 8 一地址指令

    一地址指令有2种情况,

    第一种:比如加1、减1、取反、求补等,完成一次指令需要访存3次;

    第二种:自身与ACC(寄存器)操作,完成一次指令需要访存2次(寄存器不是主存,所以不算访存次数)。

    这个时候除了操作码,所有的地址都能用于寻址了,1个地址占24位,指令操作数的直接寻址范围为2^24=16777216。

    图 9 零地址指令
    图 9 零地址指令

     

    三、指令的设计

    以上的5种指令设计就是地址码的设计,在减少地址的情况下并没有改变地址的长度,这种指令集的结构叫定长指令字结构(指令长度固定)。如果随着地址码的减少,我们改变了指令字的长度,就叫做变长指令字结构(指令长度不等)。

    定长指令字和变长指令字结构看的是整条指令的长度。操作码也有定长操作码(n位->2^n条指令)和扩展操作码(操作码长度可变)。我们需要关注的是操作码而不是整条二进制的数量变化。

    扩展操作码(不定长操作码)是变长操作码最常见的一种,扩展操作码是需要设计的。

    图 10 扩展操作码
    图 10 扩展操作码

    举例:

    指令字节长度为16位:前4位为基本操作码字段OP,另有3个4位长的地址字段A1、A2和A3。4位基本操作码若全部用于三地址指令,则有2^4=16条指令范围组合。但是至少需要留出一位做为扩展操作码使用,即三地址指令为15条,依次类推,见图10。

    操作码的长度在变化,如果把1111在三地址指令中被占用了,在二地址指令中就没法区分是操作码还是操作数地址码了。所以在每个高地址指令中留出一位用于低地址指令中使用,4变8,8变12……即是前面留出的一位用做操作码,读取到这一位就知道是操作码,那么就继续往后寻址,这样就实现了扩展操作码了。那么我们想一想,能不能上层多留几位来作为下层的前缀操作码呢?

    在设计扩展操作码指令格式时,必须注意以下两点:

    1. 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。
    2. 各指令的操作码一定不能重复。

    通常情况下,对使用率较高的指令,分配较短的操作码,对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。具体可以参考哈夫曼编码,这里就不再详细叙述了。

    对于留多位是可以的,只是需要注意以上2点。这里有个公式:设地址长度为n,上一层留出m种状态,下一层可扩展出m*2^n种状态。

    图 11 不定长操作码设计
    图 11 不定长操作码设计

     

    四、总结

    操作码是指出指令中该指令应该执行什么性质的操作和具有何种功能。

    操作码是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。例如,指出是算术运算,还是减运算;是程序转移,还是返回操作。

    操作码分类

    定长操作码:在指令字的最高位部分分配固定的若干位(定长)表示操作码。

    优点:简化计算机硬件设计,提高指令译码和识别速度;

    缺点:指令数量增加时会占用更多固定位,留给表示操作数的地址位数受限。

    扩展操作码(不定长操作码):全部指令的操作码字段的位数不固定,且分散放在指令字的不同位置上。

    优点: 对应定长操作码的缺点,在指令字长有限的前提下仍保持比较丰富的指令条种类;

    缺点:增加了指令译码和分析的难度,使控制器的设计复杂化。

    展开全文
  • 从指令执行周期看指令设计涉及的问题三、指令系统设计1. 设计指令系统(1)设计原则(2)设计的重要方面2. 操作数类型和存储方式(1)指令应涉及的基本数据类型(2)IA32和MIPS中的数据类型3. 寻址方式(1)关于...

    一、指令集体系结构(ISA)的基础概念

    1. 指令相关概念

    • CPU只能识别指令形式的机器语言(01序列),不管C、python还是什么高级语言,都需要翻译(编译、汇编、解释)为机器语言才能执行
    • 指令可以分为三个类型
      1. 微指令微程序级的命令,它属于硬件
      2. 宏指令(伪指令):由若干条机器指令组成的软件指令,它属于软件;
      3. 机器指令:介于微指令和伪指令之间,处于硬件和软件的交界面,每一条指令可完成一个独立的算术运算或逻辑运算操作。一般讲的指令就是指机器指令
        • 一条机器指令对应了硬件层面的一段微程序,微程序由若干微指令组成。比如在多周期CPU中执行一个加法指令,它可能对应了类似这样的一段微程序:从寄存器取操作数 -> 运算 -> 结果写回寄存器,这里就是三条微指令,每个机器周期执行一条。
        • 机器指令就是一串二进制的01序列
    • 指令集(指令系统):一台机器可以执行的机器指令的集合,它是ISA的核心组成部分
    • 微架构:处理器核心的实现方式,是将一种给定的ISA在处理器中执行的方法

    2. 什么是ISA

    • ISA(指令集体系结构)是一种规约(Specification),它规定了如何使用硬件,是一种对硬件的抽象
      在这里插入图片描述

    • 关系图
      在这里插入图片描述

    3. ISA的地位

    (1)ISA是软件和硬件的交界面(接口)

    • 计算机体系结构示意
      在这里插入图片描述
    • 指令系统处在软/硬件交界面,同时被硬件设计者和系统程序员看到
      • 硬件设计者角度:指令系统为CPU提供功能需求,要求易于硬件设计
      • 系统程序员角度:通过指令系统来使用硬件,要求易于编写编译器
    • ISA是对硬件的抽象,所有软件功能都建立在 ISA之上

    (2)ISA是计算机的必要组成部分

    • ISA是最贴近CPU的,它规定了CPU可以理解的机器码语法以及部分CPU设计要求,因此它在计算机体系结构的发展中一直存在。它是CPU的接口,只要有计算机硬件,就有ISA。
    • 操作系统、各种层次的编程语言等等都是建立与ISA之上的,它们即使这些都没有,我们直接写机器码也可以让计算机正常工作
    • 计算机体系结构的发展简图如下,可以看到其中都有ISA
      1. 最早的计算机,用机器语言编程
        在这里插入图片描述
      2. 之后出现了OS和汇编语言,可以执行多道程序
        在这里插入图片描述
      3. 现代计算机体系结构
        在这里插入图片描述
    • 最后附一张不同层次的计算机工作者对计算机的认识
      在这里插入图片描述
    • 下面,针对ISA的核心组成部分——指令集(指令系统),进行进一步介绍

    二、指令格式设计

    1. 一条指令必须包含的信息

    在这里插入图片描述

    2. 不同地址码个数的指令

    • 这里的地址是指一个操作数所在的地址。它具体可能是寄存器编号、存储器地址、I/O端口或指令立即数等等…
      在这里插入图片描述

    3. 从指令执行周期看指令设计涉及的问题

    • CPU的运行流程:
      • 取指令 - 指令译码 - 计算地址取操作数 - 进行运算,得标志位 - 计算结果送目的地 - 计算下条指令地址在这里插入图片描述

      • 上面这种划分得比较细,一个标准五级流水线中是这样划分的:取指 - 译码 - 执行 - 访存 - 写回

    三、指令系统设计

    1. 设计指令系统

    (1)设计原则

    • 应尽量短
    • 要有足够的操作码位数
    • 指令编码必须有唯一的解释,否则是不合法的指令
    • 指令字长应是字节的整数倍
    • 合理地选择地址字段的个数
    • 指令尽量规整

    (2)设计的重要方面

    • 操作码的全部组成:操作码个数 / 种类 / 复杂度 (主存读写、自增、跳转四种指令已足够编制任何可计算程序,但程序会很长)
    • 数据类型:对哪几种数据类型完成操作
    • 指令格式:指令长度 / 地址码个数 / 各字段长度(看上面一、2部分)
    • 通用寄存器:个数 / 功能 / 长度
    • 寻址方式:操作数地址的指定方式
    • 下条指令的地址如何确定:顺序,PC+1;条件转移;无条件转移;……
    • 一条指令的功能,一般通过对操作码进行不同的编码来定义; 操作码相同时,再由功能码进行区分(例如MIPS的R型指令)

    2. 操作数类型和存储方式

    • 操作数:指令处理的对象,与高级语言的数据类型对应
    • 操作数存放在寄存器内存单元

    (1)指令应涉及的基本数据类型

    在这里插入图片描述

    (2)IA32和MIPS中的数据类型

    1. IA-32(英特尔32位体系架构,80386开始采用)

      • 基本类型:字节、字(16位)、双字(32位)、四字(64位)
      • 整数: 16位、32位、64位三种2-补码表示的整数;18位压缩8421 BCD码表示的十进制整数
      • 无符号整数(8、16或32位)
      • 近指针:32位段内偏移(有效地址)
      • 浮点数:IEEE 754(80位扩展精度浮点数寄存器)
    2. MIPS

      • 基本类型:字节、半字(16位)、字(32位)、四字(64位)
      • 整数: 16位、32位、64位三种2-补码表示的整数
      • 无符号整数:(16、32位)
      • 浮点数:IEEE 754(32位/64位浮点数寄存器)

    3. 寻址方式

    (1)关于寻址

    • 寻址方式:指令或操作数地址的指定方式。即:根据地址找到指令或操作数的方法,通常特指 “操作数的寻址”
    • 指令中如何表示寻址方式
      1. 没有专门的寻址方式位(由操作码确定寻址方式):如MIPS指令,一条指令中最多仅有一个主(虚)存地址,且仅有一到两种寻址方式。
      2. 有专门的寻址方式位:如X86指令,一条指令中有多个操作数,且寻址方式各不相同, 需要各自说明寻址方式,因此每个操作数有专门的寻址方式位
    • 常用寻址方式:立即 / 直接 / 间接 / 寄存器 / 寄存器间接 / 偏移 / 堆栈…

    (2)有效地址和地址编码

    1. 有效地址
      在这里插入图片描述
    2. 地址编码
      在这里插入图片描述

    (3)指令的寻址

    1. 指令寻址
      在这里插入图片描述

    (4)操作数的寻址

    1. 常用寻址方式

    在这里插入图片描述

    • EA是操作数在主存中的地址,得到EA后,还要访存才能得到操作数
    • 操作数的真实位置
      • 在指令中直接给出:立即寻址
      • 在寄存器中:寄存器寻址
      • 在主存中:以上除了立即和寄存器之外所有
      • 在磁盘中:对于在主存中的操作数,可能发生 “缺页” ,此时操作数在磁盘中,需要被置换进主存
    • 偏移寻址有三种,这块比较复杂,下面逐一分析

    2. 三种偏移寻址方式详述

    1. 寻址算法思想

      1. 思维导图
        在这里插入图片描述
      2. 可见,所谓偏移寻址就是利用基地址和地址偏移量计算目标地址,根据地址给出形式的不同,可以分成三种类型。
      3. 一般RISC机器不提供自动变址寻址,并将变址和基址寻址统一成一种 “偏移寻址方式”。比如MIPS就是这样的
    2. 相对寻址: EA=A+(PC)

      • 定义:目标地址 = 相对于PC寄存器当前值的位移量为A的存储单元。指令地址码给出一个偏移量(带符号数),基准地址由PC寄存器隐含给出
      • 注意:当前PC值可能是本条指令(没有指令预取,如单周期CPU)或下一条指令的地址(有指令预取,如流水线CPU)
      • 可用来实现程序(公共子程序)的浮动指定转移目标地址
        • 公共子程序的浮动:
          在这里插入图片描述

        • 相对寻址实现相对转移

          • 举例:双字节(2个字节)定长指令字,第一字节是操作码Jxx,第二字节是位移量D,用补码表示。目标地址范围不等于位移量D的表示范围,只有确定了是按字还是字节编址、位移量D是指指令条数还是单元数,才能确定目标地址范围。若D为字节单元数,跳转范围[-126,128]单元,[-63,64]条指令
            在这里插入图片描述

          • 假设使用流水线技术,有指令预取,按字节编址,指令长度为双字节,D代表单元数,则目标地址 = (PC) +2 +D。由于流水线,在取这条Jxx指令的时候,PC已经+1了,指令长度又是双字节,所以要先加2得到此刻Jxx指令的地址,然后再加单元偏移D得到目的地址

          • 举例:若转移指令地址为2000H,转移目标地址为1FF0H,总是在取指令同时对PC增量(流水线),则转移指令第二字节位移量为多少?
            在这里插入图片描述

          • 举例:MIPS指令beq $1, $2, Label_25的转移目标地址为(PC)+4+4*25,这里的25是指令条数而不是单元数,MIPS采用定长指令字,按字节编址,所有指令的长度都是32位(4字节)。

          • 说明:MIPS采用定长指令字,按字节编址, 所有指令的长度都是32位(4字节)

    3. 基址寻址:EA=A+(B)

      • 定义:目标地址 = 相对于基址(B)处位移量为A的单元。指令地址码给出一个偏移量,基准地址 由基址寄存器B给出。 (例如MIPS指令lw / sw $s2, 0x40($t1)
      • 可用来实现多道程序重定位过程调用中参数的访问
        • 基址寻址实现程序重定位
          在这里插入图片描述
    4. 变址寻址: EA=A+(I)

      1. 定义:目标地址 = 相对于首址A处位移量为(I)的单元。指令地址码给出一个基准(形式)地址A ,而偏移量(无符号数) 由变址寄存器 I 给出。(例如Intel 8086指令MOV AL, [SI+1000H],这里SI就是I, 1000H就是A。)
      2. MIPS中没有变址寄存器;IA32中有
      3. 可为循环重复操作提供一种高效机制,如实现对线性SK表IP的方便操作
        在这里插入图片描述

    4. 操作码编码

    在这里插入图片描述

    (1)定长操作码编码

    1. 思维导图
      在这里插入图片描述

    2. 举例:IBM360/370的指令格式
      在这里插入图片描述
      在这里插入图片描述

      • 可以看到,各种指令类型中,OP段(操作码)的编码长度都是一致的
      • IBM360/370使用了定长操作码,变长指令字

    (2)变长操作码编码

    • 基本思想
      • 操作码的编码长度分成几种固定长的格式
      • 指令格式:变长操作码、变长指令字
    • 变长操作码编码有两种
      • 扩展编码
      • 哈夫曼编码
    • PDP-11是典型的变长操作码机器
    • 大多数指令集采用变长操作码编码这种方式

    1. 哈夫曼编码

    • 这就是数据结构中学习过的哈夫曼编码,可以有效压缩操作码的平均长度
    • 通过构造一棵哈夫曼数,我们可以轻松获取每个操作码的哈夫曼编码,这里不展开说了
    • 哈夫曼编码应用于指令设计时存在一些问题
      • 操作码长度很不规整;
      • 硬件译码困难
      • 与地址码共同组成固定长的指令比较困难

    2. 扩展编码

    1. 核心原则:任意操作码的编码不能是另一个操作码的编码的前缀

    2. 等长15/15/15扩展编码
      在这里插入图片描述

    3. 等长8/64/512扩展编码
      在这里插入图片描述

    4. 不等长操作码4/6/10扩展编码法
      在这里插入图片描述

    3. 设计操作码编码示例

    • 设某指令系统指令字是16位,操作码从最高位开始,地址码都在最低位,每个地址码为6位。包含三类指令

      1. 二地址指令15条
      2. 一地址指令34条
      3. 其余为零地址指令
    • 分析:

      1. 二地址指令格式:4位操作码 | 6位地址 | 6位地址
      2. 一地址指令:10位操作码 | 6位地址
      3. 零地址指令:16位操作码
    • 编码设计:
      在这里插入图片描述

    5. 标志信息的生成与使用

    (1)条件测试方式

    • 在一些CPU设计中,条件转移指令通常根据Condition Codes (条件码/CC) 决定是否转移。如IA-32结构中的Jcc系列指令

    • IA-32的Jcc指令示例,可见条件码cc本质上是由一些标志位的逻辑运算结果决定的,也就是说:标志位经过逻辑运算,可以进行逻辑判断或溢出检测等
      在这里插入图片描述

    • 常见的标志位由以下四种,对于带符号和无符号运算,标志生成方式有没有不同,因为电路不知道是无符号数还是带符号整数!
      在这里插入图片描述

    • 通过执行算术指令显式地由比较和测试指令来设置CC(即设置标志位),它们(尤其是第二类)往往配合跳转转移系列指令Jcc使用

      1. 第一类:如IA-32中的addsub等算术指令
      2. 第二类:如IA-32中的cmptest等指令
    • 更多关于IA-32中标志相关的内容,请参考:IA-32汇编语言笔记(3)—— 简单传送、加减指令 & 标志寄存器

    (2)标志寄存器

    • IA-32系列结构中使用了标志寄存器(程序状态字寄存器)PSW,这是一个16位的寄存器。 它反映了CPU运算的状态特征并且存放某些控制标志。8086使用了16位中的9位,包括6个状态标志位和3个控制标志位
      在这里插入图片描述
      在这里插入图片描述

    (3)MIPS中没有标志位

    • MIPS架构和IA-32的一个大区别就是MIPS没有标志位的概念,自然也没有标志寄存器PSW
    • MIPS架构中,直接在ALU部件运算时生成转移发生、溢出发生等信号,这些信号被传输到其他部件控制动作发生

    6. 指令设计风格

    (1)按操作数位置指定风格

    1. 四种指令风格
      在这里插入图片描述

    2. 指令风格比较
      在这里插入图片描述

      • 累加器型,因为所有运算都要用累加器,表达式复杂时,程序中移入移出累加器的指令增多
      • 1975年开始,寄存器型指令集占主导地位。寄存器速度快,使用大量通用Reg减少访存;与堆栈型指令用到堆栈相比,编译高级语言中变量时,不用考虑顺序
    3. 不同指令集关于访存的比较
      在这里插入图片描述

    (2)按指令格式的复杂度来分

    1. 复杂指令集计算机CISC

    在这里插入图片描述

    2. 精简指令集计算机RISC

    在这里插入图片描述

    展开全文
  • 计算机指令系统

    千次阅读 多人点赞 2020-05-27 12:01:48
    计算机指令系统性的发展,指令系统的性能要求,指令格式,操作数类型,指令和数据的寻址方式。

    指令系统的发展和性能要求

    1.1指令系统的发展

    程序一一用于解决实际问题的一系列的指令;
    指令一一使计算机执行某种操作的命令
    从组成的层次结构来说,计算机的指令可分为如下3类:

    • 微指令:微程序级的命令,它属于硬件;
    • 机器指令(指令):可完成一个独立的算术或逻辑运算;
    • 宏指令:由若干条机器指令组成的软件指令,它属于软件

    指令系统: 一台计算机中所有机器指令的集合,指令系统的格式和功能直接影响机器的硬件结构、软件系统、以及机器的适用范围。

    计算机指令系统的发展过程:
    ● 50年代:只有定点加减、逻辑运算、数据传送、转移等十几至几十条指令。
    ● 60年代后期:增加了乘除运算、浮点运算、十进制运算、字符串处理等指令,指令数目多达一二百条,寻址方式也趋多样化,出现了系列计算机
    ● 70年代末期:复杂指令系统计算机(CISL)、精简指令系统计算机(RSC),早期的X86处理器(486之前)都是CISL指令系统,奔腾系列CPU使用了RSC和CC构架相结合的办法;

    系列计算机:
    基本指令系统、基本体系结构相同的一系列计算机,不过具体的器件、结构和性能都不会完全相同,一般新机种在各方面要优于旧机种。一个系列往往有多种型号,各型号计算机的指令系统是向下兼容的,新机种的指令系统包含旧机种的全部指令,如 Pentiu系列PC机。

    CISC (complex instruction set computer) 采用复杂的的指令系统,来达到增强计算机的功能、提高机器速度的目的
    CISC指令系统的特点:
    1.指令系统复杂庞大,指令数目多
    2.指令格式多,字长不固定,多种寻址方式;
    3.可访存指令不受限制;
    4.各种指令的执行时间相差很大;
    5.大都采用微程序控制器;

    RISC (Reduced instruction set computer) 从简化指令系统和优化硬件设计的角度来提高系统的性能与速度。
    RISC指令系统的主要特点:
    1.选取使用频率高的简单指令;
    2.指令长度固定,指令格式少,寻址方式种类少
    3.采用流水线技术
    4.使用较多的通用寄存器,减少访存;
    5.控制器以组合逻辑控制为主;
    6.采用优化编译技术;

    1.2 指令系统性能的要求
    指令系统的性能决定了计算机的基本功能,它的设计直接关系到计算机的硬件结构和用户的需要。
    一个完善的指令系统应满足如下四方面的要求:
    ①.完备性常用指令齐全,编程方便;
    ②.有效性程序占用内存少,运行速度快;
    ③.规整性指令和数据的使用规则统一,易学易记;
    ④.兼容性:同一系列的低档计算机的程序能够在新的高档计算机上运行;

    指令系统的规整性要求: 规整性包括对称性、匀齐性、指令格式和数据格式的一致性三方面的要求。
    1.对称性:所有的指令都可使用各种寻址方式
    2.匀齐性:一种操作性质的指令可以支持各种数据类型
    3.指令格式和数据格式的一致性:指令长度和数据长度有一定的关系,以方便处理和存取

    1.3 低级语言与硬件结构的关系
    ● 低级语言: 机器语言、汇编语言,是一种面向机器的语言,和具体机器的指令系统密切相关。
    ● 高级语言与低级语言的比较如表所示:

    比较内容高级语言低级语言
    1对机器独立的程度独立不独立
    2编制程序的难易程度
    3编制程序所需的时间较长
    4程序执行时间较长
    5编译过程对计算机资源的要求
    对程序员的训练要求高级语言低级语言
    通用算法需要需要
    语言规则了解较多了解
    硬件知识不需要需要

    指令格式

    指令的一般格式:
    指令字(简称指令):表示一条指令的机器字。
    指令格式:指令字用二进制代码表示的结构形式,由操作码字段和地址码字段组成。
    在这里插入图片描述
    操作码字段: 表征指令的操作特性与功能
    地址码字段: 通常指定参与操作的操作数的地址。

    2.1 操作码
    操作码字段的位数取决于指令系统的规模;
    操作码的类型:

    • 固定长度的操作码:
      操作码字段为4位,则指令系统中的指令数目为24=16条。
      ◆特征:所有指令长度均相同。
      ◆优点:控制简单,速度快,适用于指令条数不多的场合
    • 可变长度的操作码
      ◆特征:利用操作码扩展技术将操作码扩展到地址码字段,使各类指令的操作码长度不相同;
      ◆优点:充分利用软硬件资源,适用于大规模的指令系统。

    2.2 地址码
    一条指令格式中有几个地址码字段,就称为是几地址指令;

    • 零地址指令:
      在这里插入图片描述
      ①无任何操作数运算。(如NOP、HALT等指令)。
      ②单操作数运算:隐含一个操作数,如Acc。(如CBW指令)
      OP (Acc) → Acc

    • 一地址指令
      在这里插入图片描述
      ①单操作数运算:OP (A1) → A1(如INC指令)
      ②双操作数运算:隐含一个操作数,如Acc
      A(cc) OP (A1)→Acc/A1 (如MUL指令)

    • 两地址指令
      在这里插入图片描述
      功能:(A1) OP (A2) → A1 (如ADD、XOR等指令)

    • 三地址指令
      在这里插入图片描述
      功能:(A1) OP (A2) → A3

    • 多地址指令(如四地址)
      这类指令功能强,一般用高档小型机或中大型机,用于实现成批数据处理,字符串处理、向量或矩阵运算指令等

    两地址指令的分类:
    在这里插入图片描述

    • 根据操作数的物理位置分:
      存储器-存储器(SS)型指令
      A1、A2均为存储单元;
      这类指令的操作时都涉及到内存单元,参与操作的数都放在内存内。
      寄存器-寄存器(RR)型指令
      A1、A2均为寄存器;
      这类指令执行过程中,需要多个通用寄存器或个别专用寄存器,从寄存器中取操作数,把操作数结果存放到另一个寄存器中,执行时不需要访问内存。
      寄存器-存储器(RS)型指令
      A1、A2中一个为寄存器,一个为存储单元;
      执行此类指令时,既要访问内存单元,又要访问寄存器。

    • 指令的操作码扩展技术
      一个指令系统中,若操作码长度固定,且指令格式不同
      指令格式如图:
      在这里插入图片描述
      操作码字段长度取决于指令系统中的指令总数目,地址码较少的指令,编码浪费。

      操作码扩展
      对于不需要某个地址码的指令,把它们的操作码扩充到该地址字段;既充分利用指令字的各字段,又在不增加指令长度的情况下扩展操作码的长度;
      举例:设某指令长16位,包括4位基本操作码字段和3个4位地址码字段。
      在这里插入图片描述
      ① 若全是三地址指令,则最多能有多少条指令?
      操作码为4位的,则指令条数为2<sup>4</sup>=16。

      ② 若三地址指令需15条,两地址指令需15条,单地址指令需15条零地址指令需16条应如何安排?
      可使用操作码扩展技术,缩短固定操作码长度
      在这里插入图片描述
      ① 为了缩短指令的平均长度,应用频率比较高的指令应该分配较短的操作码。
      ② 确保指令码的唯一性。

    在这里插入图片描述
    在这里插入图片描述

    2.3 指令字长度

    • 机器字长
      运算器一次能处理的二进制数的位数。机器指令的长度直接决定着CPU运算的精度直接寻址能力的大小
    • 指令字长
      一个指令字中包含二进制代码的位数;
      指令字长由操作码长度操作数长度个数共同决定。
      ● 指令有半字长单字长双字长多字长等不同的长度类型。
      ● 指令系统可分为等长指令字结构变长指令字结构两种。

    2.4 指令助记符

    • 指令助记符:使用3~4个英文缩写字母来表示的指令操作码
    • 在不同的计算机中,指令助记符的规定是不一样的,指令助记符只是指令操作码字段的一种表示方法;机器内部保存的还是二进制代码形式的机器指令;
      由汇编或编译程序,将助记符翻译成机器代码。
      在这里插入图片描述
      在这里插入图片描述
      指令举例:
      在这里插入图片描述

    操作数类型

    机器指令对数据进行操作,数据通常分为以下四类:

    • 地址数据无符号整数,通过某种运算确定操作数在主存中的有效地址;
    • 数值数据定点整数、小数;浮点数;压缩十进制数
    • 字符数据文本数据或字符串;
    • 逻辑数据由若干二进制位组成,每位的值可以是1或0。

    指令和数据的寻址方式

    4.1指令的寻址方式

    • 1.顺序寻址方式
      当程序执行的流向不发生变化时,指令的寻址方式;由程序计数器记录所要执行指令的地址;一般在每次取指之后,其值加本条指令所占存储单元数。

    • 2.跳跃寻址方式
      当程序转移执行时的指令寻址方式,程序计数器的内容由本条指令给出,而不是顺序改变。

      • 直接寻址方式:指令中给出要转向的有效地址
      • 相对寻址方式:指令中给出要转向单元与当前单元的偏移量
      • 间接寻址方式:指令中给出保存要转向地址的寄存器或存储单元
        在这里插入图片描述

    4.2 操作数的寻址方式
    一种单地址码指令的结构如下图:
    在这里插入图片描述

    • 将指令中的形式地址A变换成操作数有效地址的过程,称为寻址过程。
    • 典型而常用的寻址方式有:隐含寻址、立即寻址、直接寻址、间接寻址、寄存器寻址、寄存器间接寻址、偏移寻址、堆栈寻址。
    隐含寻址立即寻址
    在这里插入图片描述在这里插入图片描述
    直接寻址间接寻址
    在这里插入图片描述在这里插入图片描述
    寄存器寻址寄存器间接寻址
    在这里插入图片描述在这里插入图片描述
    偏移寻址相对寻址
    在这里插入图片描述在这里插入图片描述
    变址寻址基址寻址
    在这里插入图片描述在这里插入图片描述
    堆栈寻址
    在这里插入图片描述
    • 隐含寻址
      ● 操作数地址隐含在操作码中;
      ● 如8086的MUL指令,被乘数隐含在AX(16位)或AL(8位)中
      ●指令字中少了一个地址字段,可缩短指令字长;

    • 立即寻址
      ● 形式地址A就是操作数;
      ● 优点:指令执行阶段不需要访存,速度快
      ● 缺点:形式地址A字段的位数限制了立即数的范围

    • 直接寻址
      ● 有效地址由形式地址字段A直接给出;
      ● EA=A
      ● 特点:执行阶段访问一次存储器,A的位数决定了该指令操作数的寻址范围;操作数的地址不易修改(必须修改A)

    • 间接寻址
      ● 有效地址由形式地址字段A间接提供,
      ● EA=(A)
      ● 特点:可扩大寻址范围;A字段的长度受指令字长和指令格式的限制;寻址时,可根据需要进行多次间址;可用寻址特制字段区分直接寻址和间接寻址方式

    • 寄存器寻址
      ● 形式地址字段A为寄存器编号
      ● EA=Ri
      ● 特点:执行阶段不访存,只访问寄存器,执行速度快,寄存器个数有限,可缩短指令字长

    • 寄存器间接寻址
      ● 形式地址字段A用于指出存放有效地址的寄存器编号;
      ● OEA=(Ri)
      ● 特点:执行阶段访存;○便于编制循环程序

    • 偏移寻址
      ● 直接寻址和寄存器间接寻址方式的结合
      ● 有效地址EA=A+® A是显式的形式地址字段;OR可以是显式的,也可以隐含的,某个专用的寄存器;
      ● 常用的偏移寻址
      ○ 变址寻址:EA=(变址R)+A,变址R+1变址R
      ○ 基址寻址:EA=(基址R)+A,A+1→A
      ○ 相对寻址:EA=(专用R)+A

    • 变址寻址方式
      ● 形式地址A作为基准地址,
      ● 变址寄存器作为可修改量;变址寄存器可自动增减量
      ● 适用于数组、字符串等成批连续数据的处理;
      ● 变址寄存器:可用通用寄存器充当,一般包含多个,在指令中要用一个字段指明当前所用的变址寄存器;

    • 基址寻址方式
      ● 基址寄存器作为基准地址,形式地址A作为可修改量;
      ● 形式地址相当于位移量,可正可负;一般基址寄存器为专用寄存器
      ● 基址寻址原来用于大型机,用作将用户地址转换成物理地址;可以实现地址的重定位,和扩大直接寻址空间
      ● 用途:
      ○ 大型机中,一般用特权指令来管理;
      ○ 小、微型机中,一般与变址寻址联合使用

    • 相对寻址方式
      ● 寻址特征:是基址寻址的一种变通
      ○ 程序计数器PC提供基准地址;
      ○ 形式地址作为位移量D,专用R可正可负;OEA:(PC )+D:
      ●适用于:所要寻找的操作数与现行指令位置间隔固定的场合

    • 堆栈寻址方式
      ● 隐含寻址方式的一种变形,其隐含的操作数在堆栈段中,由栈顶指针指定
      ● 8086堆栈指令举例
      ○ 入栈指令 PUSH SRC
      SP-2→SP;SRC→[SP]
      ○ 出栈指令 POP DST
      [SP]→DST;SP+2→SP

    例题在这里插入图片描述

    例题:
    在这里插入图片描述

    例题:
    设某机字长16位,直接寻址空间为128字,变址时的位移量为-64~+63,16个通用寄存器都可以作为变址寄存器,请设计一套指令系统,满足下列寻址类型的要求:
    (1)直接寻址的二地址指令3条
    (2)变址寻址的一地址指令6条
    (3)寄存器寻址的二地址指令8条;
    (4)直接寻址的一地址指令12条;
    (5)零地址指令32条。
    ● 直接寻址的二地址指令3条
    在这里插入图片描述
    ○这3条指令的操作码为00、01、10;
    ● 变址寻址的一地址指令6条:
    在这里插入图片描述
    ○这6条指令的操作码为:11000~11101
    ● 寄存器寻址的二地址指令8条:
    在这里插入图片描述
    这8条指令的操作码为11110000~11110111直接寻址的一地址指令12条:

    这12条指令的操作码为:111110000~111111011
    ● 零地址指令32条:
    在这里插入图片描述
    这32条指令的操作码为:
    111111000000000~11111110000111

    例题:
    某计算机数据线和地址线均是8根,有一条相对寻址的无条件转移指令存于内存的20H单元中,指令给出的偏移量是15H,设该指令占用2个字节,请计算:
    (1)取该条指令时PC的内容。
    (2)该指令执行结束时Pc的内容。
    解答:
    (1)取指令时,PC的内容为20H
    (2)转移地址=PC+2+D=20H+2+15H=37H
    该条指令执行结束时PC的内容是37H。

    例题:
    某指令系统指令字长为20位,具有双操作数、单操作数和无操作数3种指令格式,每个操作数地址规定用6位表示,当双操作数指令条数取最大值,而且单操作数指令条数也取最大值时,这3种指令最多可能拥有的指令数各是多少?
    解:按操作码扩展技术来设计,双操作数指令最多28-1条,单操作数指令最多63条,因此无操作数指令条数的最大值为64条
    在这里插入图片描述

    例题
    某机器字长为16位,主存容量是64K字,有专用的变址寄存器,采用单字长单地址指令,共有54条指令。试采用直接、立即、变址、相对四种寻址方式设计指令格式。解答
    在这里插入图片描述
    ○54条指令,故操作码需要6位。因为四种寻址方式,所以寻址特征位取2位,余下的8位作为形式地址D。其指令格式为
    O寻址模式X定义如下:
    X=00直接寻址有效地址E=D(256个单元)
    X=01立即寻址D=操作数
    X=10变址寻址有效地址E=®+D(64K)
    X=11相对寻址有效地址E=(PC)+D(64K)其中R为变址寄存器(16位)、PC为程序计数器(16位)相对寻址和变址寻址中,D可正可负。

    展开全文
  • 计算机组成原理(4.3)—— MIPS指令系统(RSIC)

    千次阅读 多人点赞 2020-08-16 22:03:24
    前一篇文章分析了指令系统(ISA)的设计方法,这里以MIPS指令系统为例进行分析 前文链接:计算机组成原理(4.1)—— 指令系统设计 文章目录一、MIPS架构基础1. 寄存器数据指定(1)MIPS架构中的寄存器安排(2)...
     
    

    一、MIPS架构基础

    • 1981年出现,由MIPS科技公司开发并授权,广泛被使用在许多电子产品、网络设备、个人娱乐装置与商业装置上。最早的MIPS架构是32位,最新的版本已经变成64位。
    • 并行化程度:流水线
    • 指令集类型:RISC

    1. 寄存器数据指定

    (1)MIPS架构中的寄存器安排

    1. 32位通用寄存器GPRs
      • 31+1个(r0是机器零)
      • 寄存器编号5位
    2. 32位浮点寄存器
      • 32个:$f0~$f31
      • 可以两个一起拼成64位的
    3. 专用特殊寄存器
      • 无需编号
      • HI, LO, PC

    (2)寄存器名称、编号和功能

    • 通用寄存器汇总表
      在这里插入图片描述
    • 寄存器的汇编表示用$符号,可以接名称或编号(如$a0$4都表示寄存器a0)
    • 在MIPS指令字中,用5位二进制编码指示通用寄存器
    • 被调用函数把值保存在s0~s7,被掉函数结束后调用函数还可以用这些值;如果存在t0~t7就不能用了(C翻译汇编时要小心)

    2. 存储器数据指定

    • 32位机器:可访问主存空间: 2^32bytes(4GB)
    • MIPS使用装入-存储型指令风格:运算的操作数只能是寄存器,只能通过Load/Store指令访问存储器数据
    • 数据地址通过一个32位寄存器内容(基地址)加16位偏移量得到,16位偏移量是带符号整数,故应符号扩展
    • 数据要求按边界对齐(地址是4的倍数)
    • Big Endian(大端方式)或小端
      在这里插入图片描述

    二、操作数类型和表示方式

    1. 操作数类型

    在这里插入图片描述

    2. 操作数表示方式

    在这里插入图片描述

    三、指令格式

    • 指令字长度:定长指令字,32位宽
      • 按字地址对齐(字地址为4的倍数,即指令地址的最后两位为0
    • 操作码长度:定长操作码编码(op段),6位宽
      • 一般通过对操作码进行不同的编码来定义;
      • 操作码相同时,再由功能码(func段)进行区分(例如MIPS的R型指令)

    1. R型指令

    在这里插入图片描述

    • 两个操作数和结果都在寄存器
    • R型指令功能:
      1. 运算指令:包括各种算数、逻辑、移位运算。R型指令基本都是运算指令
      2. 控制转移指令:有jrjalr

    2. I型指令

    在这里插入图片描述

    • 一个操作数是立即数,另一个操作数和结果在寄存器
    • 16位的立即数需要扩展到32位参与运算,依据具体指令不同可能要进行符号扩展或零扩展
    • I型指令功能:
      1. 运算指令:类似R型指令,只是源操作数之一通过立即数给出
      2. 访存指令:LOAD系列和STORE系列指令。寄存器RS给出基地址,16位立即数(符号扩展)给出偏移量
      3. 条件分支指令:如beq/bne等。比较RS和RT寄存器的值,16位立即数(符号扩展)给出目标指令和当前指令偏差的条数

    3. J型指令

    在这里插入图片描述

    • 操作数只有一个直接地址(用来控制跳转)
    • J型指令功能:
      1. 控制转移:转移到target address所指示的指令执行
    • 目标地址的构成
      1. 32位MIPS机器中,指令储存时按字地址(4字节)对齐,所有指令地址均为4的倍数,故其最后两位总为0
      2. 下图是MIPS架构的memory map,其中Text段用于存储指令,可见指令地址范围是0x0040_00000x0FFF_FFFC,高四位恒为0。为了避免Text段浮动导致问题,我们直接用pc寄存器(当前指令)的高四位作为目标指令的高四位
        在这里插入图片描述
      3. 综上,目标指令地址为:pc高四位 + 26位target address + 0000,共32位

    4. 汇编指令和机器码指令字示例

    • 从以下两个示例表中,可以看出汇编语言到机器指令的一一对应关系。汇编语言本质上就是和机器指令一一对应的,类似助记符的一种语言

    (1)MIPS汇编示例

    在这里插入图片描述

    (2)机器码指令字示例

    在这里插入图片描述

    (3)汇编和反汇编

    1. 汇编:把汇编指令翻译为机器码
      在这里插入图片描述

    2. 反汇编:把机器码翻译为汇编指令
      在这里插入图片描述

    四、寻址方式

    • MIPS不同于IA-32,没有专门的寻址方式字段,各操作数的具体寻址方式由指令格式确定,而指令格式由 op来确定

    1. R型指令的寻址

    在这里插入图片描述

    2. I型指令的寻址

    在这里插入图片描述

    3. J型指令的寻址

    在这里插入图片描述

    五、程序的机器级表示

    1. 算术和逻辑运算指令

    • 没有全部列出,还有其他指令,如addu(不带溢出处理), addiu 等
    • x86 / IA-32没有分add还是addu,因为它只产生各种标志(PSW),由软件根据标志信息来判断是否溢出。而MIPS是由硬件直接判溢出与否,要告诉CPU处不处理理溢出
      在这里插入图片描述
    • 示例
    //示例1:假定给 f, g, h, i, j分别分配 $s1, $s2, $s3, $s4, $s5
    f = (g+h)-(i+j);
    
    add $t0, $s2, $s3
    add $t1, $s4, $s5  
    sub $s1, $t0, $t1
    
    //示例2:16位有符号立即数[-32768,32767]
    f = (g+100) - (i+50);
    
    addi $7, $2, 100  
    addi $8, $4, 50  
    sub $1, $7, $8
    
    //示例3:出现的常数超过16位有符号数范围
    f = (g+65000) - (i+50) 
    
    addi $7, $2, 65000	//错了,因为超过16位立即数表示范围
    addi $8, $4, 50
    sub $1, $7, $8
    
    lui	$3, 0x0  		//正确写法
    ori	$3, 0Xfde8
    addi $8, $4, 50
    sub $1, $7, $8
    

    2. 访存指令

    在这里插入图片描述

    • 为什么指令必须支持不同长度的操作数:因为高级语言中的数据类型有char,short,int,long,……等,故需要存取不同长度的操作数;

    • 指令中操作数长度由什么决定:由不同的操作码指定

    • 示例

      //A是100个字的数组(32位),g在$1, h在$2, A基址在$3
      g = h + A[8];
      
      lw $4, 32($3)  	//注意是4*8 = 32
      add $1, $2, $4
      
    • 如果在一个循环体内执行:g = h + A[i],则能否用基址寻址方式:不行,因为循环体内指令不能变,故首地址A不变,只能把下标 i 放在变址寄存器中,每循环一次下标加1,所以,不能用基址方式而应该用变址方式

      1. 基址寻址是:基址是寄存器给出的,偏移是立即数定值;
      2. 变址寻址是:基址是立即数定值,偏移是寄存器给出的
        在这里插入图片描述
    //A是100个字的数组(32位),g在$1, i在$5, A基址在$3
    g = g+A[i]
    

    3. 分支转移指令

    在这里插入图片描述

    4. 伪指令

    在这里插入图片描述

    5. 过程调用

    1. 过程调用的执行步骤(假定过程P调用过程Q)
      在这里插入图片描述

    2. MIPS中用于过程调用的指令:beqjjrjal一些伪指令

    3. 少量过程调用信息用寄存器传递
      在这里插入图片描述

    4. 如果过程中用到的参数超过4个,返回值超过2个,怎么办

      • 更多的参数和返回值要保存到存储器的特殊区域中
      • 这个特殊区域为:栈(Stack)
      • 一般用“栈”来传递参数、保存返回地址,并用来临时存放过程中的局部变量等。这样可以实现嵌套和递归调用

    (1)MIPS中的栈

    • 栈的基本概念
      在这里插入图片描述
    • MIPS中栈的实现

    在这里插入图片描述

    • 栈帧
      在这里插入图片描述

    (2)调用过程(假定P调用Q)

    • 程序可访问的寄存器组是所有过程共享的资源,给定时刻只能被一个过程使用 ,因此过程中使用的寄存器的值不能被另一个过程覆盖!(主调过程使用的寄存器,被调过程要么不用,要么用完之后返回前把值还回去)

    • MIPS的寄存器使用约定

      1. 保存寄存器$s0 ~$s7的值在从被调用过程返回后还要被用,被调用者需要保留
      2. 临时寄存器$t0 ~$t9的值在从被调用过程返回后不需要被用(需要的话,由调用者保存) ,被调用者可以随意使用
      3. 参数寄存器$a0~$a3在从被调用过程返回后不需要被用(需要的话,由调用者保存在栈帧或其他寄存器中),被调用者可以随意使用
      4. 全局指针寄存器$gp的值不变
      5. 帧指针寄存器$fp用栈指针寄存器$sp-4来初始化
    • 需在被调用过程Q中入栈保存的寄存器(称为被调用者保存

      1. 返回地址$ra (如果Q又调用R,则$ra内容会被破坏,故需保存)
      2. 保存寄存器$s0 ~$s7(Q返后P可能还会用到,Q中用的话就被破坏,故需保存)
      3. 除了上述寄存器以外,所有局部数组结构体等复杂类型变量也要入栈保存
      4. 如果局部变量和临时变量发生寄存器溢出(寄存器不够分配),则也要入栈
    • 各处理器对栈帧规定的 ”调用者保存” 和 ”被调用者保存” 的寄存器可能不同

    • 过程调用时MIPS中栈和栈帧的变化
      在这里插入图片描述
      在这里插入图片描述

    • 过程调用协议
      在这里插入图片描述

    (3)调用的示例

    1. swap函数示例

      1. 现有swap函数如下,主函数caller要调用它

        swap(int v[ ], int k)
        {
        	int temp;  
        	temp = v[k];  
        	v[k] = v[k+1];  
        	v[k+1] = temp;
        }
        
      2. temp对应$t0(局部变量),变量v 和 k分别对应$a0$a1(传入参数)

      3. 根据C语言的逻辑,可以写出以下核心逻辑代码

        sll	$s2, $a1, 2		; $a1=k, mulitply k by 4
        addu $s2 $s2, $a0	; address of v[k]
        lw $t0, 0($s2)		; load v[k]
        lw $s3, 4($s2)		; load v[k+1]
        sw $s3, 0($s2)		; store v[k+1] into v[k]
        sw $t0, 4($s2)		; store old v[k] into v[k+1]
        

        分析这段程序,swap用到了$t0$s2$s3,所以caller中这三个寄存器的值被破坏。根据约定,$t0caller自己保护,$s2$s3需要在swap中保护

      4. 使用jal swap指令调用swap函数。等价于执行以下两条指令

        //jal swap
        $31 = PC+4		; $31=$ra  
        goto swap
        
      5. 程序执行顺序如下
        在这里插入图片描述

      6. 加上保护寄存器和返回指令,完整程序如下
        在这里插入图片描述

      7. 如果swap是叶子过程,无需保存返回地址到栈中。因为$ra的内容不会被破坏;如果将所有内部寄存器都用临时寄存器 (如$t1等),则叶子过程swap的栈帧为空,且上述黑色指令都可去掉

    2. 嵌套调用示例

      1. 原始C程序

        int i;				// 全局变量
        void set_array(int num)
        {
        	int array[10];	// 局部变量
        	for (i = 0; i < 10; i ++) 
        		arrar[i] = compare (num, i);
        }
        
        int compare (int a, int b)
        {
        	if (sub (a, b) >= 0)
        		return 1;	
        	else
        		return 0;
        }
        
        int sub (int a, int b)
        {
        	return a-b;
        }
        
      2. 过程调用时的变量分配

        1. 全局变量一般分配到寄存器R/W存储区

        2. 该例中只有一个简单变量i,假定分配给$s0。无需保存和恢复!

        3. 为减少指令条数,并减少访问内存次数,在每个过程的过程体中总是先使用临时寄存器$t0~$t9;临时寄存器不够或者某个值在调用过程返回后还需要用,就使用保存寄存器$s0~$s7

      3. set_array过程的栈帧分析

        1. 入口参数为num,没有返回参数,有一个局部数组,被调用过程为compare,因此,其栈帧中除了保留所用的保存寄存器外,必须保留返回地址(因为set_array不是叶过程)
        2. 是否保存$fp要看具体情况,如果确保后面都不用到$fp,则可以不保存,但为了保证$fp的值不被后面的过程覆盖,通常情况下,应该保存$fp的值,并给局部数组(int array[10]) 预留4×10=40个字节的空间。
        3. 从过程体来看,从compare返回后还需要用到数组基地址,故将其分配给$s1。因此要用到的保存寄存器有两个:$s0$s1,但只需将$s1保存在栈帧中($s0保存全局变量i不用保护),另外加上返回地址$ra (因为已经保存了前一个函数的返回地址),帧指针$fp(因为已经保存了前一个栈帧的尾地址)、局部数组,其栈帧空间最少为3×4+40=52B
      4. compare过程的栈帧分析

        1. 入口参数为ab,仅一个返回参数,没有局部变量,被调用过程为sub。 过程体中没用到保存寄存器,所以,其栈帧中只需保留返回地址$ra$fp的值
      5. sub过程的栈帧分析:叶子过程,其栈帧为空

      6. 栈的变化示意图
        在这里插入图片描述

    6. 翻译C语言示例

    1. 判断等于

      //i, j, f, g, h, 分别存在 $s1, $s2, $s3, $s4, $s5
      if (i == j)
      	f = g+h ;
      else
      	f = g-h ;
      
      //翻译为汇编
      		bne $s1, $s2, else	//与C语句相反, i!=j, jump to else  
      		add $s3, $s4, $s5
      		j	exit			//jump to exit  
      else:	sub $s3, $s4, $s5
      exit:
      
    2. Loop循环

      //g, h, i, j ~ $1, $2, $3, $4 and base address of array is in $5
      //数组元素为int类型,sizeof(int)=4
      Loop:	g = g +A[i];
      		i = i+ j;
      		if (i != h) go to Loop:
      
      //翻译为汇编
      Loop:	add $7, $3, $3		//i*2,加法快
      		add $7, $7, $7  	//i*4, 得到偏移量,也可用移位
      		add $7, $7, $5  	//加上数组基地址
      		lw $6, 0($7)  		// $6=A[i]
      		add $1, $1, $6  	//g= g+A[i]
      		add $3, $3, $4		//i = i+j;
      		bne $3, $2, Loop	//程序员不必计算分支指令的地址,而只要用标号即可!汇编 器完成地址计算
      
      • 注意最后一句bne $3,$2,Loop怎么翻译机器码。注意imm16的值一定是相对下一条指令说的

    在这里插入图片描述

    展开全文
  • 指令系统结构ISA-CA

    千次阅读 2020-01-18 21:58:20
    文章目录指令系统定义作用重要性国际主流指令系统发展自主软硬件需求自主指令系统指令系统的设计指令系统在计算机中的位置设计原则影响指令系统设计的因素:指令系统的演变指令系统分类:指令系统演变-系统管理MIPS...
  • 1、指令系统概述   计算机的程序时由一系列的机器指令组成的。   指令就是要计算机执行某种操作的命令。从计算机组成层次上看,计算机的指令有微指令、机器指令和宏指令之分。微指令就是微程序...
  • 80x86指令系统,指令按功能可分为以下七个部分。  (1) 数据传送指令。  (2) 算术运算指令。  (3) 逻辑运算指令。  (4) 串操作指令。  (5) 控制转移指令。  (6) 处理器控制指令。  (7) 保护方式指令。
  • 计算机组成原理-指令系统

    千次阅读 2019-03-28 09:27:44
    第四章 指令系统 4.1 指令格式 指令的最基本格式 【操作码 | 地址码】 (1)操作码: 反应机器做什么操作 操作码的长度在RISC中固定,而在CISC中长度可变。CISC的长度可变是指利用指令的其他字段对操作码字段进行...
  • 指令系统——指令格式(详解)

    千次阅读 多人点赞 2020-06-08 20:52:34
    一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。 注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令。 三、指令格式 一条指令就是机器语言的一个语句,它是一组有意义的二进制...
  • 指令系统

    千次阅读 2019-05-16 21:39:00
    指令格式 操作码字段(OP)+地址码字段(A) 操作码 表示操作性质,可扩展 一般来说,一个包含n位的操作码最多能够表示 2^n 条指令 地址码 寄存器编号+寻址方式 根据一条指令中有几个操作数地址,可将该指令...
  • 8086的指令系统

    2015-11-30 23:55:30
    指出下列错误的指令及错误的原因 (1) MOV AH,BX (2) MOV [BX],[SI] (3) MOV AX,[DI][SI] (4) MOV MYDAT[BX][SI],ES:AX (5) MOV BYTE PTR[BX],1000 (6) MOV BX,OFFSET MYDAT[SI] (7) MOV CS,AX
  • 指令系统,寻址方式

    千次阅读 多人点赞 2018-12-23 19:01:52
    用高级语言或者是汇编语言编写的程序,如果要在计算机上执行,必须要利用编译程序或者是汇编程序把高级语言编写的程序,指令,或者是汇编指令变成由0,1...指令集就是计算机系统软件和硬件的交界面。 软件通过指令系...
  • 第五章 指令系统

    千次阅读 2020-06-16 13:15:26
    文章目录指令系统概述指令格式操作码地址码指令长度指令和操作数的寻址方式指令的寻址方式顺序寻址跳跃寻址操作数寻址方式立即数寻址直接寻址间接寻址寄存器寻址寄存器间接寻址相对寻址变址寻址基址寻址堆栈寻址其它...
  • 计算机组成原理 指令系统(一)

    万次阅读 多人点赞 2018-08-14 11:58:15
    一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。指令系统是计算机的主要属性,位于硬件和软件的交界面上。 指令字长度:一个指令包含的二进制数的位数 机器字长:计算机能直接处理的二进制数的位数...
  • 【笔记】指令系统(一)

    千次阅读 2018-04-29 00:50:32
      每一条机器语言的语句称为机器指令,而又将全部机器指令的集合称为机器的指令系统。 1.指令的一般格式   指令是由操作码和地址码两部分组成的。 操作码   操作码用来指明该指令索要完成的操...
  • 《计算机组成原理》— 指令系统

    万次阅读 多人点赞 2017-05-29 10:54:45
    基本知识点:指令系统和指令的基本概念,指令格式,指令操作码扩展技术,各种寻址方式及其特点,RISC 和 CISC 指令系统的特点。 重 点:指令格式,指令操作码扩展技术,各种寻址方式及其特点。 难 点:指令格式,...
  • CPU的指令集(指令系统

    万次阅读 2019-02-06 20:00:09
    CPU的指令集(指令系统
  • 8086CPU指令系统——数据传送类指令

    千次阅读 2019-09-20 14:02:54
    数据传送(Data Transfer)类指令是指令系统中用的最多的一类指令,也是条数最多的一类指令,常用于将原始数据、中间运算结果、最终结果及其它信息在CPU(中央处理器)的寄存器和存储器之间进行传送 ...
  • 4.1 指令系统的发展和性能要求 4.1.1 指令系统的发展 程序——用于解决实际问题的一系列的指令; 指令——使计算机执行某种操作的命令; 从组成的层次结构来说,计算机的指令可分为如下3类: 微指令:微程序级的命令...
  • 本章主要介绍机器指令系统的分类、常见的寻址方式、指令格式以及设计指令系统时应考虑的各种因素。此外对RISC技术也进行简要的介绍,需要进一步地体会指令系统与机器的主要功能以及硬件结构之间存在的密切关系。 1....
  • 指令系统中的寻址方式详解

    千次阅读 2020-03-05 20:16:57
    在8086指令系统中,说明操作数所在地址的寻址方式可分为3大种(7小种) 程序运行时用到的数据决大部分存放在内存中,如何寻找内存中的数据就是存储器寻址方式。 操作数在存储器中,操作数的有效地址EA在指令中,段...
  • MCS-51指令系统中,执行下列程序后,程序计数器PC的内容为 ORG 000H MOV DPDR,#1000 MOV A, #00H MOV 20H,A LJMP 1500 END
  • ARM指令系统

    万次阅读 2017-08-19 22:22:24
    ARM指令系统 3.1 ARM处理器的指令格式 3.1.1 ARM指令集的特点 第3章 ARM指令系统 第3章 ARM指令系统 3.1 ARM处理器的指令格式 3.1.1 ARM指令集的特点 ARM内核属于RISC结构,所以其指令集有着一些独特的...
  • 8086指令系统

    千次阅读 2018-04-08 18:48:23
    源地址寄存器SI,目的变址寄存器DI 指针寄存器:基址指针BP,堆栈指针SP段寄存器: 代码段寄存器CS 堆栈段寄存器SS 数据段寄存器DS 附加段寄存器ES标志寄存器:FLAGS指令指针:IP数据寄存器...
  • 【ARM汇编】第三章:ARM指令系统

    千次阅读 2020-04-25 23:18:15
    文章目录指令基础指令周期和时序程序的执行过程ARM汇编语言指令和指令格式指令和指令系统指令的表示方法汇编的指令格式指令的可选后缀S!指令的条件执行ARM指令分类ARM指令的寻址方式立即寻址寄存器寻址寄存器间接...
  • 第二章 指令系统 指令系统是微处理器CPU所能执行的指令的集合它与微处理器有密切的联系不同的微处理器有不同的指令系统在本章中我们主要讲解INTEL公司生产的8086/8088CPU的寻址方式以及各种指令系统并通过具体实例...
  • 计算机是通过执行指令序列来完成用户的特定任务的,因此每种计算机都有一组指令集供用户使用,这组指令集就称为计算机的指令系统。 主要内容: 1、8086/8088指令格式 2、8086/8088指令系统的寻址方式 3、8086/...
  • 第二章 指令系统 指令系统是微处理器CPU所能执行的指令的集合它与微处理器有密切的联系不同的微处理器有不同的指令系统在本章中我们主要讲解INTEL公司生产的8086/8088CPU的寻址方式以及各种指令系统并通过具体实例...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 425,241
精华内容 170,096
关键字:

下列关于指令系统