ICS-04

LC-3结构

  • 上节讨论了计算机的基本组成,由内存、处理单元、输入输出设备、控制单元组成,以及指令周期。本节我们来介绍LC-3的指令集结构(ISA)


一、ISA概述

  • ISA定义了软件编程所需要的必要而完整的描述。即ISA向以机器语言编程的程序员提供有关控制机器所需要的必要信息。ISA给出了内存组织方式、寄存器组、指令集(包括操作码、数据类型、寻址模式)等信息。

  • 内存组织

    • LC-3可寻址空间大小为2^16(65536),寻址基本单位是16位。由于LC-3中数据处理的基本单位是16位,所以我们再次称这16位为一个“字”,同时我们也称LC-3是一个“字寻址”机器。

  • 寄存器

    • LC-3和大多数机器一样,提供了临时存储空间,访问速度是一个周期。临时存储空间的实现方式是一组通用寄存器,其中的每个寄存器称为通用寄存器(GPR)

      • 记忆特性:可存储信息并可被再次读出

      • 独立寻址:每个寄存器有唯一的标识

  • 指令集

    • 一条指令可分为两个部分:操作码(做什么)和操作数(对谁操作)。一个ISA的指令集定义包括:操作码的集合,数据类型和寻址模式。

  • 操作码

    • LC-3的ISA结构定义了15条指令,每条指令对应一个操作码(bit[15:12])。其中,操作码值1101没有定义,将其预留(以后再定义)

    • 所有指令可以分为三类

      • 运算:负责处理信息

      • 数据搬移:负责在内存和寄存器之间以及内存/寄存器和输入/输出设备之间转移信息

      • 控制:负责改变指令的执行顺序


指令码对应指令
0001ADD
0101AND
0000BR
1100JMP/RET
0100JSR/JSRR
0010LD
1010LDI
0110LDR
1110LEA
1001NOT
1000RTI
0011ST
1011STI
0111STR
1111TRAP
1101预留

  • 数据类型

    • 数据类型是指信息的表达方式,即意味着ISA的操作码是怎样理解这些表达信息的。

    • 注:ISA所支持的唯一数据类型:补码整数!!!

  • 寻址模式

    • 寻址模式是指定义操作数位置的一种机制。

    • 操作数可能存在的地方

      • 内存

      • 寄存器

      • 指令本身:此时称操作数为“立即数”,从指令中立即获得该操作数,不需要再从别的地方去寻找该操作数。

    • LC-3共支持5中寻址模式

      • 立即数

      • 寄存器

      • 三种内存寻址模式:相对寻址(PC-relative)、间接寻址(indirect)、基址偏移(Base + offset)

  • 条件码

    • LC-3具有三个位寄存器(单bit长度),每当8个通用寄存器中任意一个被修改或写入之时,三个单bit位就会发生对应变化(被置1或清0)。三个位寄存器分别是:N、Z和P,对应的意思是负数、零和整数。即每当任意GPR寄存器被写入时,根据写入结果是负数、零或正数,分别设置三个条件位(0或1)。

    • 我们称这三个单bit寄存器位“条件码”,因为控制指令可根据这些位的“条件”决定执行顺序是否改变。


二、操作指令

  • 操作指令是处理数据的指令。运算操作和逻辑操作都属于典型的擦欧总指令。Lc-3仅支持ADD、AND和NOT。

  • NOT指令(1001)

    • 单操作数指令,按位取反,结果存入目的寄存器。源操作数和目的操作数的访问都是“寄存器寻址模式”。bit[8:6]是源寄存器,bit[11:9]目的寄存器,bit[5:0]全为1。

    • 例:1001 011 101 111111

      • 意指将R5取反存入R3

  • ADD指令(0001)

    • 双操作数指令,需要两个16位源操作数,执行两个操作数的补码加法。bit[8:6]为一源操作数,bit[11:9]为目的操作数,都是寄存器寻址方式,运算结果写入目的寄存器。但第二个源操作数寻址方式,可以是寄存器方式或立即数方式,由bit[5]决定。当bit[5] = 0表明第二个原操作数是寄存器,bit[2:0]代表寄存器,bit[4:3] = 0。当bit[5] = 1时,bit[4:0]做16位扩展之后再参加加法运算(注此处是补码)。

    • 例:0001 001 100 0 00 101

      • 意指将 R4+R5 存入R1

    • 例:0001 001 100 1 11111

      • 意指将 R4-'1' 存入R1中

  • AND指令(0101)

    • 双操作数指令,需要两个16位源操作数,执行两个操作数的按位与操作。bit[8:6]为一源操作数,bit[11:9]为目的操作数,都是寄存器寻址方式,运算结果写入目的寄存器。但第二个源操作数寻址方式,可以是寄存器方式或立即数方式,由bit[5]决定。当bit[5] = 0表明第二个原操作数是寄存器,bit[2:0]代表寄存器,bit[4:3] = 0。当bit[5] = 1时,bit[4:0]做16位扩展之后再参加与运算。

    • 例:0101 010 010 1 00000

      • 寄存器R2被清零

    • 例:0101 010 010 0 00 001

      • 将 R2 & R1 存入R2


三、数据搬移指令

  • 数据搬移指令的任务是在GPR和内存之间、寄存器和输入/输出设备之间搬动数据。

  • 我们称数据从内存移入寄存器为“装载”(load),而从寄存器转入内存为“存储”(store)。

  • LC-3有7种搬移至零:LD、LDR、LDI、LEA、ST、STR和STI

  • 数据搬移指令需要两个操作数:源和目的。源是指将被搬移的数据,目的是指搬移的取出。两个操作数之一必是寄存器,另一个则是内存或设备。本节仅讨论内存,有关设备见后续。

  • bit[11:9]标识了操作数之一、即寄存器。如果是load类型指令,则字段代表DR(Destination Resgister,目的寄存器),来自内存的内容将被写入该寄存器。如果是store类型指令,则字段代表SR(Source Regste,源寄存器),该段内容将被写入内存。

(一)、PC相对寻址

  • LD(0010)和ST(0011)采用PC相对寻址模式,bit[8:0]代表的是相对当前PC的偏移值。地址计算方法:先将bit[8:0]内容做16位扩展,然后与PC值(已增量)相加。该方式寻址只能相对当前指令所在地址+256和-255范围内。

    • LD(0010)

      • load形式,内存载入寄存器

      • 先将已增量PC与IR[8:0]相加,得出的结果装入MAR

      • 读取地址为MAR中的值的内存单元,将内容暂存入MDR

      • 将内容装入R2

      •  DR = *[PC + offset] 

      • 例:0010 010 110101111(补码)

        • 将 (PC)当前指令地址+1-x50处的值 装载入R2

    • ST(0011)

      • store形式,将PC加上偏移量存储入内存

      • 先将已增量PC与IR[8:0]相加,得出的结果装入MAR

      • 将SR内容存入MAR中的地址

      •  *[PC + offset] = SR 

      • 例:0011 010 010101111(补码)

        • 将 R2 中的值存储至 (PC)当前指令地址+1+xAF 处


(二)、间接寻址(类指针)

  • LDI(1010) 和 STI(1011)指令采用的是间接寻址模式。同LD和ST,仅仅是需要多算一次,该操作可寻址的范围是整个内存空间的任意地方。

    • LDI(1010)

      • 将PC与IR的符号扩展值相加,结果存入MAR

      • 读取MAR中存放的地址的内容并存入MDR

      • MDR中的内容仍为地址,将该地址存入MAR

      • 再次读取MAR地址的内容存入MDR

      • MDR内容转入DR

      •  DR = **[PC + offset] 

      • 例: 1010 011 111001100

        • 将 已增PC-x63 地址的内容的内容存入R3

    • STI(1011)

      • 将PC与IR的符号扩展值相加,结果存入MAR

      • 读取MAR中存放的地址的内容并存入MDR

      • MDR中的内容仍为地址,将该地址存入MAR

      • 将SR中的内容存入MAR中的地址

      •  **[PC + offset] = SR 

      • 例: 1011 011 011001100

        • 将 R3的内容 存储至 已增PC+xcc 地址的内容(仍为地址)


(三)、基址偏移寻址

  • LDR(0110)和STR(0111)采用的是基址+偏移的寻址模式。操作数的地址是由6-bit偏移量的符号扩展bit[5:0]和基址寄存器bit[8:6]的内容相加而成的。

    • LDR(0110)

      • 基址寄存器内容与IR内容相加装入MAR

      • 读内存并将MAR中地址的内容装入MDR

      • 将MDR内容装入DR

      •  DR = *[*Base + offset] 

      • 例:0110 001 010 011101

        • 将 R2内容+x1D 地址的内容载入R1

    • STR(0111)

      • 基址寄存器内容与IR内容相加装入MAR

      • 将SR的内容存入MAR中的地址

      •  *[*Base + offset] = SR

      • 例:0111 001 010 111101

        • 将 R1 的内容存储入 R2的内容(地址)-x2 处


(四)、立即数寻址

  • 该模式只适用于有效地址装在指令(LEA)。LEA(1110)将增量PC与bit[8:0]的符号扩展至相加并装入bit[11:9]指定的寄存器。

  • LEA指令的用途是对寄存器做初始化,即向寄存器装入一个地址值,且该地址是与当前指令很相近的一个地址

    • LEA(1110)

      • 直接将增量PC和指令的地址生成bit内容相加,产生的地址装入DR,无需访问内存

      • 例:1110 101 111111101

        • 将 PC - x3 存入 R5中


四、控制指令

  • 控制指令是指那些能够改变执行顺序的指令。

  • LC-3有5中操作码可以打破执行顺序:条件跳转、无条件跳转、子程序(函数)调用、TRAP、中断返回。本节主要探讨条件跳转,其余后续详细探讨。

  • 条件跳转指令(0000)

    • bit[11:9]分别对应了上述的三个条件码“所有”会对寄存器进行写操作的指令都会设置这三个条件码,这些指令包括APP、AND、NOT、LD、LDI、LDR。

    • 地址计算与LD和ST指令相同,属于PC相对寻址

    • 任一条件码为1时,满足条件,即可跳转。bit[11] = negative, bit[10] = zero,bit[9] = positive

    • 如果三个位bit[11:9]都为1时,则三个条件码都将被检测。无论任何情况下,因之前的寄存器装入内容可能时负数、0或正数。故必然跳转,所以我们称该中情况称为无条件跳转指令。

    • 例:0000 111 1100000101

      • 将跳转到 PC已增 - xFB 地址处

  • 循环控制的两种方法

    • 在某种机制的控制下,一遍一遍地被重复执行的指令称为“循环”语句。

      • 采用计数器方法:将计数器初始化为n。没执行一次循环,将计数器减1并判断其是否为0。

      • 哨兵法:此方法并不知道会循环多少次。通过对数据内容的判断来控制循环是否继续。在被处理数据序列的尾部安放一个“哨兵”,即事先知道的绝对不会出现的值。

        • 例:哨兵法数组求和(哨兵数据为-1)

          • x3000 1110 001 011111111

          • x3001 0101 011 011 1 00000

          • x3002 0110 100 001 000000

          • x3003 0000 100 000000100

          • x3004 0001 011 011 0 00 100

          • x3005 0001 001 001 1 00001

          • x3006 0110 100 001 000000

          • x3007 0000 111 111111011

        • 先向R1装入第一个要加入的数据所在的地址,将R3初始化为0,将R1指向的数据转发如R4。x3003条件跳转指令检查N位,如何N为1,则跳转出本部分指令。如果N为0,将R4中的有效数字加入R3,R1增量指向下一个内存的地址,R4装入新R1指向的内容,无条件跳转会x3003,实现循环。

  • JMP指令

    • 条件指令不能超出“可计算”范围。但JMP指令可以表达内存空间的任意位置

    • JMP(1100)

      • bit[8:6]的内容装入PC寄存器。bit[11:9]和bit[5:0]均为0

      • 例:1100 000 010 000000

        • 将R2中所存地址装入PC寄存器

  • TRAP指令(简述)

    • TRAP(1111)

      • TRAP指令的任务是改变PC内容,使其指向操作系统所在空间内部。即以当前程序的身份跳转至操作系统的某个代码入口开始执行。TRAP指令的bit[7:0]字段表示的使“陷入矢量”。

      • 主要陷入矢量

        • 读取键盘输入 x23

        • 显示字符输出 x21

        • 中止程序 x25

      • 例:1111 0000 00100101


五、总结:数据通路(LC-3)

  • 数据通路的基本部件

    • 全局总线:包括16根线和相关的电子部件,它用于一个结构与另一个结构之间传递最多16个bit的信息。

    • 内存:包含指令和数据。访问内存的第一步:将被访问内存的地址装入MAR,如果load,则向内存发送读信号,结果是内存将数据发送至MDR;如果store,则数据事先被存放至MDR,然后再向内存传送写信号,使得MDR输出的数据被装入MAR指定的内存单元。

    • ALU和寄存器文件:ALU使信息处理单元,两个输入,一个来自寄存器,一个可能来自寄存器或符号扩展的立即数。寄存器文件共8个。

    • PC和PCMUX:PC通过总线向MAR提供地址信息,该地址是下一个指令周期开始要获取的指令所在的地址。PC本身的输入是一个3选1 PCMUX 所提供的,复用的选择或切换取决于正在执行的指令类型。

    • MARMUX:MARMUX控制信号的作用就是在laod、store或TRAP的执行期间,为其在两个地址输入中选择合适的输入。右侧输入值是增量PC或基址寄存器与IR字段内容或0的求和。左侧输入值是trap的零扩展。

  • 指令周期

    • 例:0110 011 010 000100

      • FETCH(3个时钟周期)

      • DECODE(1个时钟周期)

      • EVALUATE ADDRESS(1个时钟周期)

      • OPERAND FETCH(1个或更多时钟周期(取决内存访问的延迟))

      • EXECUTE(0个周期)

      • STORE RESULT(1个时钟周期)

      • 共计约7个时钟周期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值