计算机系统基础实验03程序结构

计算机系统基础
实验目的

掌握三种程序结构的机内实现方法。

实验环境

微机,配置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位足以表示所有的地址。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值