一、 实验目的
- •掌握仿真软件的使⽤
- •掌握机器指令的设计⽅法
二、 实验设备
- 硬件:无
- 软件:CMSstudio
三、 实验内容
-
• 针对下列指令
– INL DR – OUTH SR
– STA [ADDR], SR
– LD DR, [ADDR]
– JMP ADDR - • 写出机器指令格式
- • 画出微指令流程图
-
• 使⽤上述指令系统编写程序,实现
– INPUT读⼊数据保存到ADDR,
– 将ADDR内容在OUTPUT显⽰。
– 循环往复
– 注意:INPUT读⼊到内存和内存输出到OUTPUT所使⽤的寄存器要求不是同⼀个
四、 实验原理
- • 程序与数据在同⼀地址空间 • AR作为地址指针来取指 • 增加PC送AR微操作
- 程序与数据分开存储,程序段和数据段,还有堆栈段等 • 取指:PC • 取操作码和操作数 • 数据存取:AR
- • 栈指针:SP • 栈数据 – 存放在数据段 • 栈数据存取: – SP送AR – 通过AR来实现
- • INL DR • OUTL SR • STA [ADDR], SR • LD DR, [ADDR] • JMP ADDR
五、 实验步骤
针对下列指令
– INL DR
– OUTL SR
– JMP ADDR
– ADD DR, SR
1. • 写出机器指令格式
2. • 画出微指令流程图(包括当前地址及下址)
3. • 使⽤上述指令系统编写程序,实现
– 从 INPUT 读⼊数据到 DR
– DR=SR+DR
– DR 数据在 OUTPUT 显⽰
– 循环往复
六、 调试过程、结果和分析
-
参考教材,结合自己实际,对调试过程进行记录和分析。
练习
• 针对下列指令
– INL DR
– OUTL SR
– JMP ADDR
– ADD DR, SR
写出机器码格式
设定规则如下
依次解释下为啥要如此设计:
-
INL RD
只涉及到RD,所以Rs本质随便设计 - JMP ADDR,ADDR题目设计为16位,所以对应就是ARRRL和ADDRH两层
- IR7-IR4是用来跳地址的
最后在程序区以及指令系统填写的时候上面的IR7-IR0的部分要转化为16进制显示
比如0010 0000转化成 20
画出微指令流程图(包括当前地址及下址)
根据实验指导书p85,我们可以得到类似的设计
【上图为实验指导书给的样例,下图为鄙人本题目的实现】
需要注意的是,这里002部分的框画错了,应该是RAM->BUS,BUS->IR实现跳转(也就是IR = RAM[AR]
这里RAM表示的是数据区,AR表示的是指向数据区的“指针”)
- 使⽤上述指令系统编写程序,实现
– 从 INPUT 读⼊数据到 DR
– DR=SR+DR
– DR 数据在 OUTPUT 显⽰
– 循环往复
;源程序
#LOAD "work8.IS" ;预调入指令系统/微程序
data segment ;将程序全部装载到数据存储器
assume ds:data
start: INL R0
OUTL R0
ADD R0,R1
JMP start
;指令系统部分
;助记符 操作数 指令码 长度
;-----------------------------------------------------
INL R0 20 1 ;input的低字节输入一个数字到通用寄存器R0
OUTL R0 40 1 ;将通用寄存器R0的值输出到output的低字节
JMP * 60 3 ;将ADDR的地址传输给PC
ADD R0,R1 81 1 ;将通用寄存器R0和R1内部的数据相加后的结果保存到通用寄存器R0
解释一下为啥这几个分别是20 1,40 1,60 3,81 1
-
根据前面鄙人的设计,
2代表转换的地址(0001)
地址规定为0010(IR7-IR4部分) 寄存器由于
指定RD使用R0,IR1和IR0就是00
,而剩下的IR3和IR2是影响的,这里设置为00(实际上是把RS设成R0,但是后续微指令用不到这个RS),
所以设计为0010 0000
,转化为16进制就是20,但实际上,你设置成
24 28 2A也是符合要求
的 - 同上,这里是RD用不到,所以设置成41 42 43也是可以的
-
ADDR占两个地方,
所以长度2 加上本来占1,一共是3
,RSRD都用不上所以这里60-6F都能设置 -
81,8代表要转换的地址。
RD是R1 01,RS是R0,00,所以就是 0001,也就是1
微指令设置
Figure 2散转地址20的情况 需要偶(低地址)传奇(rs
注意在实际操作的时候,若要对REG(寄存器)进行操作,记得
RS偶 RD奇
Figure 3散转地址40的情况 偶(低地址rd)传偶
Figure 4散转地址60的情况
Figure 5散转地址80的情况 相加即可
完全体(剩下变体自行理解了)
指令系统:
;助记符 操作数 指令码 长度
;-----------------------------------------------------
INL R0 20 1 ;input的低字节输入一个数字到通用寄存器R0,用Rd,用低(偶)
INL R1 21 1 ;同上 寄存器为R1
INL R2 22 1 ;同上 寄存器为R2
INL R3 23 1 ;同上 寄存器为R3
OUTL R0 44 1 ;将通用寄存器R0的值输出到output的低字节,因为在Rs,所以用高位(奇)
OUTL R1 45 1 ;同上 寄存器为R1
OUTL R2 46 1 ;同上 寄存器为R2
OUTL R3 47 1 ;同上 寄存器为R3
JMP * 60 3 ;将ADDR的地址传输给PC
ADD R0,R0 80 1 ;将通用寄存器R0和R0内部的数据相加后的结果保存到通用寄存器R0
ADD R0,R1 81 1 ;将通用寄存器R0和R1内部的数据相加后的结果保存到通用寄存器R0
ADD R0,R2 82 1 ;R0+=R2
ADD R0,R3 83 1 ;R0+=R3
ADD R1,R0 84 1 ;R1+=R0
ADD R1,R1 85 1 ;R1+=R1
ADD R1,R2 86 1 ;R1+=R2
ADD R1,R3 87 1 ;R1+=R3
ADD R2,R0 88 1 ;R2+=R0
ADD R2,R1 89 1 ;R2+=R1
ADD R2,R2 8A 1 ;R2+=R2
ADD R2,R3 8B 1 ;R2+=R3
ADD R3,R0 8C 1 ;R3+=R0
ADD R3,R1 8D 1 ;R3+=R1
ADD R3,R2 8E 1 ;R3+=R2
ADD R3,R3 8F 1 ;R3+=R3
源程序
;基本模型机程序
#LOAD "work8.IS" ;预调入指令系统/微程序
#SET RAM 0260h = 5500h ;数据区0260H单元预置数据5500h,这里没有用处
data segment ;将程序装载到数据存储器
assume ds:data
org 0
start: INL R0
ADD R0,R1
OUTL R0
JMP start
data ends
end start