计算机系统基础
实验目的
掌握三种程序结构的机内实现方法。
实验环境
微机,配置Windows操作系统、LC-3仿真机软件或masm、反编译工具。
实验内容
机器级指令的实现、CPU内部寄存器、程序结构的实现。
实验过程
控制指令
控制指令改变被执行的指令的顺序。如果没有控制指令,在当前指令结束后的下一个取指令阶段,将是位于下一个连续的存储器单元中的指令。PC在每条指令的取指令阶段增加了1。
(一)条件分支
(1)介绍
条件转移指令(0000) BR
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 N Z P ( PCoffset )
[11],[10],[9]位分别对应N,Z,P,相应的意义:负数、零、正数。LC-3中所有的改写通用寄存器中数据的指令都要根据所写的数据值为正数、零还是负数,相应的设置三个条件码。这些指令有ADD,AND,NOT,LD,LDI,LDR和LEA。
在执行阶段,处理器检查在指令中相应位为1的条件码。如果[11]位是1,条件码N被检查;如果[10]位是1,条件码Z被检查;如果[9]位是1.条件码P被检查。如果[11:9]位的任意一位是0,相应的条件码就不会被检查。如果任何一个被检测得条件码的状态是1,那么PC就被计算地址阶段得到的地址加载。如果被检测的条件码中没有一个状态为1,那么PC保持不变。这种情况下,在下一个指令周期中,吓一跳连续的指令就会被取出来。
(2)测试
a)第一组
设初始R2等于3,执行R2 = R2 - 1
再由条件转移指令(NZP = 100)控制指令执行顺序。
指令如下:
0001 010 010 111111 (x14BF) x3000
ADD R2 R2 -1 (R2 = R2 -1)
0000 100 111111110 (x09FE) x3001
BR N -2 ( x3002-x0002 = x3000)
0001 001 010 100000 (x12A0)
ADD R1 R2 0 (R1 = R2 + 0)
预测分析:
x3000 指令执行 R2 = R2-1 = 3-1 = 2;
x3001 指令执行 [11]位为1,判断R2是否为负数,R2 = 2>0,不是负数,则不满足条件,则执行x3002指令;
x3002 指令执行 R1 = R2 + 0 = 2;
结束
测试截图: 与预测情况一样
b)第二组
设初始R2等于3,执行R2 = R2 - 1
再由条件转移指令(NZP = 010)控制指令执行顺序。
指令如下:
0001 010 010 111111 (x14BF) x3000
ADD R2 R2 -1 (R2 = R2 -1)
0000 010 111111110 (x05FE) x3001
BR Z -2 ( x3002-x0002 = x3000)
0001 001 010 100000 (x12A0)
ADD R1 R2 0 (R1 = R2 + 0)
预测分析:
x3000 指令执行 R2 = R2-1 = 3-1 = 2;
x3001 指令执行 [10]位为1,判断R2是否为零,R2 = 2>0,不等于零,则不满足条件,则执行x3002指令;
x3002 指令执行 R1 = R2 + 0 = 2;
结束
测试截图:与预测情况一样
c)第三组
设初始R2等于3,执行R2 = R2 - 1
再由条件转移指令(NZP = 010)控制指令执行顺序。
指令如下:
0001 010 010 111111 (x14BF) x3000
ADD R2 R2 -1 (R2 = R2 -1)
0000 001 111111110 (x03FE) x3001
BR P -2 ( x3002-x0002 = x3000)
0001 001 010 100000 (x12A0)
ADD R1 R2 0 (R1 = R2 + 0)
预测分析:
x3000 指令执行 R2 = R2-1 = 3-1 = 2;
x3001 指令执行 [9]位为1,判断R2是否为正数,R2 = 2>0,是正数,则满足条件,则执行x3000指令,以此循环,直到R2 = 0不满足条件,则执行x3002;
x3002 指令执行 R1 = R2 + 0 = 0;
结束
测试截图:与预测情况一样
d)第四组
设初始R2等于3,执行R2 = R2 - 1
再由条件转移指令(NZP = 010)控制指令执行顺序。
指令如下:
0001 010 010 111111 (x14BF) x3000
ADD R2 R2 -1 (R2 = R2 -1)
0000 000 111111110 (x01FE) x3001
BR (没有含义 )
0001 001 010 100000 (x12A0)
ADD R1 R2 0 (R1 = R2 + 0)
预测分析:
x3000 指令执行 R2 = R2-1 = 3-1 = 2;
x3001 指令执行 [11][10][9]位全为0,我的想法是此指令不对R2进行判断;
x3002 指令执行 R1 = R2 + 0 = 2;
结束
测试截图:与预测情况一样
e)第五组
设初始R2等于3,执行R2 = R2 - 1
再由条件转移指令(NZP = 010)控制指令执行顺序。
指令如下:
0001 010 010 111111 (x14BF) x3000
ADD R2 R2 -1 (R2 = R2 -1)
0000 111 111111110 (x0FFE) x3001
BR NZP -2 (x3002-x0002 = x3000)
0001 001 010 100000 (x12A0)
ADD R1 R2 0 (R1 = R2 + 0)
预测分析:
x3000 指令执行 R2 = R2-1 = 3-1 = 2;
x3001 指令执行 [11][10][9]位全为1,R2为负数、正数、零都满足条件,则会一直循环执行x3000指令;
X3002 指令不会被执行,程序不会停止。
测试:与预测情况一样
(二)JMP指令(1100)
(1)介绍
条件分支指令有一定的能力,但存在一个不幸的限制,下一条被执行的指令必须位于某个地址范围内,其地址通过将增加了1的PC与指令的[8:0]位进行符号扩展得到的偏移量相加得到。既然[8:0]位表示一个二进制补码整数,在条件分支后执行的下一条指令只可能位于该分支指令的+256到-255的位置。如果我们想执行的下一条指令位于距当前指令1000的位置上,我们无法用9位表示出1000,因此条件分支指令不能使用。
而LC-3的JMP指令可以实现这项任务。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
JMP R2
JMP指令将指令[8:6]位表示的寄存器中的内容加载到PC中。如果JMP指令位于x4000,R2包含x6600,PC包含x4000,那么位于x4000的指令(JMP指令)被执行后,位于x6600的指令就会被执行。寄存器包含16位,可以表示存储器的全部地址空间,所以JMP指令对于下一条被执行的指令位于何处没有限制。
(2)测试
a)第一组
设R1初值为 10,R3存放地址x3004.尝试一下看看JMP执行到底是什么杨的,所以设计了这样一组指令
指令如下:
0101 010 010 100000 (x54A0) x3000
AND R2 R2 0 (R2 = R2&0,R2清零)
0001 010 001 100100 (x1464) x3001
ADD R2 R1 4 (R2 = R1 + 4)
1100 000 011 000000 (xC0C0) x3002
JMP R3
0101 010 010 100000 (X54A0) x3003
AND R2 R2 0 (R2 = R2&0,R2清零)
0001 010 010 100100 (x14A4) x3004
ADD R2 R2 4 (R2 = R2 + 4)
预测分析:
当指令执行到x3002也就是JMP指令之前时,R2应该等于14,而执行JMP指令之后读取到R3存储的地址x3004,也就是R2 = R2+4,则最终R2 = 18。
由测试看出与预测的结果相同,指令在执行到JMP指令时读取到了R3中的x3004地址,将x3004存到PC中,也就是下一条执行的指令在x3004中,从而没有执行x3003的清零操作,所以最后R2 = 18。
(三) TRAP指令(1111)
(1)介绍
TRAP指令改变了PC,使其指向属于操作系统的某一部分的存储器地址,作用是为了让操作系统代表正在执行的程序执行一些任务。TRAP调用了一个操作系统的“服务调用”。TRAP指令的[7:0]位为“TRAP向量”,标明程序希望操作系统执行哪一个服务调用。
一旦操作系统执行完服务调用,PC将会指向TRAP下面一条指令的地址从而使程序继续。使用这种方式,一个程序可以在它执行时,要求操作系统提供服务并且在每个这样的服务完成后继续执行。
从键盘输入一个字符 (TRAP 向量 = x23)
向显示器输出一个字符 (TRAP 向量 = x21)
停止程序 (TRAP 向量 = x25)
指令
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 1 1 1 0 0 0 0 陷入矢量
小结
BR指令 : 若条件码N/Z/R对应位发生变化,则PC←增量PC+PCoffset9
在执行阶段,处理器检查在指令中相应位为1的条件码。如果[11]位是1,条件码N被检查;如果[10]位是1,条件码Z被检查;如果[9]位是1.条件码P被检查。
JMP指令 : 无局限跳转
JMP指令的任务就是把寄存器bit[8:6]标识的寄存器内容装入PC寄存器
但是关于JMP指令的[5:0]位有没有意义,这一点我还是不太清楚。
JMP指令解决了条件跳转指令的一个问题就是无法跳转到任意的指令位置,因为PC偏移位数有限,所以只能执行当前指令附近一定范围内的指令。但是JMP指令是将想要执行的指令的地址存储在一个16位的寄存器中的,通过PC去存储这个地址,也就是下一条就是执行被存储的这个地址的指令,16位足以表示所有的地址。