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没有定义,将其预留(以后再定义)
-
所有指令可以分为三类
-
运算:负责处理信息
-
数据搬移:负责在内存和寄存器之间以及内存/寄存器和输入/输出设备之间转移信息
-
控制:负责改变指令的执行顺序
-
-
指令码 | 对应指令 |
---|---|
0001 | ADD |
0101 | AND |
0000 | BR |
1100 | JMP/RET |
0100 | JSR/JSRR |
0010 | LD |
1010 | LDI |
0110 | LDR |
1110 | LEA |
1001 | NOT |
1000 | RTI |
0011 | ST |
1011 | STI |
0111 | STR |
1111 | TRAP |
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个时钟周期
-
-