ISA定义了软件编程所需要的必要而完整的描述。
ISA给出了内存组织方式,寄存器组,指令集(包括操作码,数据类型,寻址模式)等信息。
LC-3的数据处理是16位的,所以对于LC-3来说,16位为一个字,LC-3也可称为一个“字寻址”机器。
寄存器
从内存中获取数据的速度很慢(通常远不止一个周期),所以,LC-3也提供了临时存储空间,访问速度为一个周期。
实现方式为寄存器,LC-3提供了一组通用寄存器(GPR)。
寄存器和内存特性一样,具有记忆功能。存储信息并且可以再次读出,寄存器的存储大小为一个字,LC-3中即为1个字。
同时寄存器可以独立寻址,每个寄存器都是唯一的标识,所以才能在一个周期内获取数据。
LC-3提供了R0-R7 8个寄存器(这意味着标识编号只需要3位bit就可以标识了)
指令集
一条指令分为两个部分:操作码(做什么)、操作数(对谁操作)
一个ISA的指令集包括操作码的集合、数据类型、寻址模式。寻址模式决定了操作数的存放位置。
操作码:
有的ISA拥有庞大的指令操作码集合,有的确很小,并且现在的大多数计算机通常都使用一串指令来完成信息的操作而不是一条,个人觉得原因是大部分指令其实可以通过小部分基础指令通过组合来完成操作,这样的话可以节省操作码所占用位数。LC-3定义了15条指令,每个指令对应一个操作码,因此只需要4个bit位就足够定义了。(其中1101没有定义)
指令可以分为三类:运算、数据搬移、控制。
运算类负责处理信息,数据搬移类负责在内存和寄存器直接以及内存/寄存器和输入/输出设备之间的信息转移。
控制类负责改变指令的执行顺序,即可以让程序随时跳转到指定位置继续执行(而不是常规的顺序往下)
指令列表
0000 | BR((无)条件转移) | |
0001 | ADD 加操作 | 改变条件码 |
0010 | LD PC相对寻址load | 改变条件码 |
0011 | ST PC相对寻址store | |
0100 | JSR(R)子程序调用 | |
0101 | AND | 改变条件码 |
0110 | LDR基址偏移寻址 | 改变条件码 |
0111 | STR基址偏移寻址 | |
1000 | RTI | |
1001 | NOT | 改变条件码 |
1010 | LDI间接寻址 | 改变条件码 |
1011 | STI间接寻址 | |
1100 | JMP | |
1110 | LEA立即数寻址 | 改变条件码 |
1111 | TRAP |
数据类型:ISA操作码能够识别的某种数据类型表示的信息,LC-3的ISA只支持一种:补码整数
寻址模式:
寻址模式是指定义操作数位置的一种机制。操作数可能存在的地方:内存、寄存器、指令本身。
LC-3支持5种寻址模式:立即数、寄存器、相对寻址、间接寻址、基址偏移寻址,后三种为内存寻址模式。
条件码:
几乎所有的ISA都具备“基于之前指令的结果来改变指令执行序列”,其中的机制就是条件码。
LC-3有3个位寄存器(每个位寄存器为1bit长度,置1或清0),三个位寄存器分别为N,Z,P对应的是负数,0,整数。
当任意通用寄存器中被写入时,都会对这三个位寄存器的值进行修改。根据写入结果为正负数或0,把对应的位寄存器置1,其余位置0.
操作指令:
运算操作(ADD/SUB/MUL/DIV 加减乘除)和逻辑操作(AND/OR/NOT/XOR 与/或/非/异或)都属于典型的操作指令。
LC-3只支持三种:ADD、AND、NOT。
R3位目的寄存器,R5位源寄存器,该指令就是把R5寄存器内容按位取反。bit[5:0]全为1,这个是固定的。
R1位目的寄存器,R4是源寄存器,通过bit[5]来判定bit[4:0]的含义。
如果为0,则bit[2:0]位另一个源寄存器,如上图意思就是R4+R5 ---->R1。
如果为1,bit[4:0]位指令携带的立即操作数。对起做16位扩展后与源寄存器相加。如上面的图如果5位1,则
表示R1<-----R4+3
AND操作码的机制和ADD机制类似,也是通过bit[5]来表明bit[4:0]是另一个源寄存器还是立即数。
数据搬移指令:
我们称从内存移入寄存器为“装载”(load),从寄存器转入内存为存储(store)。
两种情况下,数据源(或源操作数)的信息内容都不会因为此移动而发生改变,但目的操作数的内容被刷新了。
LC-3的7个数据搬移指令 LD,ST,LDR,STR,LDI,STI,LEA.
数据搬移指令需要两个操作数:源和目的。
如果为load,寄存器为DR(目的寄存器),数据由内存读取到寄存器,如果为store,寄存器为SR(源寄存器),数据由寄存器写入到内存。
PC相对寻址:LD(0010)和ST(0011)
将地址生成位做16位扩展然后与增量PC(已经+1)相加,计算出来的地址放入DR或SR,根据该内存地址指向的内容做对应的读写。以为地址位有限,所以这种寻址方式能访问的空间范围是有限制的。PC+offset---->address ,mem[address]--->result
间接寻址:LDI(1010)和STI(1011)
首先采用LD的方式计算出地址,但是不是直接取这个地址的内容做为结果,而是把这个地址的内容做为一个新的地址,新地址指向的内容即为需要寻找的内容 增量pc+offset--->address, mem[address]--->address1 mem[address1]--->result.
通过间接寻址的方式,我们就可以避免相对寻址出现的访问空间范围有限的局限性而访问到整个内存空间的任意位置。
基址偏移寻址:LDR(0110)和STR(0111)
该寻址方式和之前的寻址指令在指令格式上有所不同,如下
会增加一个新的寄存器R2,然后获取的内存地址是基于R2对于bit[5:0]的偏移量,即 R1<---R2+offset,mem[R1]--->result这种寻址模式下,由于可以设置R2的值,所以也是全内存空间寻址的。
立即数寻址:LEA(1110)
注意,这个指令只有装载,没有保存。
所谓立即数寻址,就是寻址过程是立即的,直接把PC增量和偏移量相加得到结果,而不需要查询内存,即
增量PC+offset--->result.
控制指令:
控制指令是指那些能够改变指令执行顺序的指令。
LC-3有5个操作码:(无)条件跳转BR(0000)、子程序调用(0100)、TRAP()、中断返回。
条件跳转指令(0000)
N、Z、P就是之前说过的三个bit位寄存器,条件跳转指令通过将对应的位置为1来表明需要对该位寄存器进行判断来确定是否需要进行跳转来改变指令流。(对应的位寄存器为1则表明满足条件,需要改变PC)
假如条件满足,则 增量PC+PC偏移---->新的PC。
回顾一下N,Z,P这三位其中之一肯定为1,其余为0. 则如果在条件跳转指令N,Z,P三个位都为1的情况下,无论如何PC都会发生变化(其中之一肯定能满足条件),我们叫这种情况为无条件跳转。
当然如果指令中的NZP都为0,则不进行任何条件判断(相当于指令没有意义,PC继续按照正常的增量执行下一条指令)
条件跳转有一个严重的问题就是无法跳转到任意的指令位置(因为PC偏移位数有限),所以只能执行当前指令附近一定范围内的指令,JMP因此产生。
JMP指令(1100)
JMP指令的任务就是把寄存器bit[8:6]标识的寄存器内容装入PC寄存器(这里有一点疑问,就是bit[5:0]有没有意义,是不是能设置偏移量?目前没有找到相关的说明,但是如果按照书上所说就是把通用寄存器内容装入PC的话,可能这个偏移量设置就是无意义的,但是我这一点无法确定)
TRAP指令(1111)
TRAP指令的任务是改变PC内容,使其指向操作系统所在的空间内部,即以当前用户程序的身份跳转到操作系统的某个代码入口开始执行。也可以说TRAP指令激活了操作系统的服务调用(Service Call),图中的陷入矢量就是程序希望操作系统执行的服务程序的编号。
数据通路的基本部件:
全局总线:用于一个结构与另一个结构之间传递信息(能传递的信息位数上限由机器的字数决定,LC-3为16个bit),总线上每次只能传递一个数值(即任意时刻只有一个发送者)。但是各种计算机不全是单个总线的,可能存在多个总线。(单总线优缺点?如何选择?)
内存:计算机核心部件(可以说是最重要的),内存包含着指令和数据。访问内存第一步是将要访问的内存地址载入MAR,然后根据访问操作类型的不同做不同的处理,如果是load,则向内存传递读信号,将内存内容载入MDR,如果是写,则先把内容事先放置于MDR中,然后向内存传递写信号,使得MDR输出的数据被装入MAR指定的内存单元中。
ALU和寄存器文件
ALU是信息处理单元,有两个输入,一个来自寄存器,一个可能来自寄存器也可能是指令自身携带的立即数。
PC和PCMUX
PC通过总线向MAR提供地址信息,指向下一个周期开始要获取的指令所在位置,而PC本身的输入则是一个3选1的PCMUX提供的。在取指令节拍,PC内容会自动增量PC,然后做为PCMUX的输入。
但是如果指令是一条控制指令,则被选择的PCMUX输入将取决于控制指令的类型(而不是PC增量)。
MARMUX
内存的访问是通过向寄存器MAR提供地址完成的,MARMUX控制信号的作用就是在load、store、TRAP的执行期间,为其在两个地址的输入中选择合适的输入。