机组实践实验8——使用CMStudio设计基于基本模型机微程序指令(1)

  • Post author:
  • Post category:其他




一、 实验目的

  1. •掌握仿真软件的使⽤
  2. •掌握机器指令的设计⽅法



二、 实验设备

  1. 硬件:无
  2. 软件:CMSstudio



三、 实验内容

  1. • 针对下列指令

    – INL DR – OUTH SR

    – STA [ADDR], SR

    – LD DR, [ADDR]

    – JMP ADDR
  2. • 写出机器指令格式
  3. • 画出微指令流程图
  4. • 使⽤上述指令系统编写程序,实现

    – INPUT读⼊数据保存到ADDR,

    – 将ADDR内容在OUTPUT显⽰。

    – 循环往复

    – 注意:INPUT读⼊到内存和内存输出到OUTPUT所使⽤的寄存器要求不是同⼀个



四、 实验原理

  1. • 程序与数据在同⼀地址空间 • AR作为地址指针来取指 • 增加PC送AR微操作
  2. 程序与数据分开存储,程序段和数据段,还有堆栈段等 • 取指:PC • 取操作码和操作数 • 数据存取:AR
  3. • 栈指针:SP • 栈数据 – 存放在数据段 • 栈数据存取: – SP送AR – 通过AR来实现
  4. • 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 显⽰

– 循环往复



六、 调试过程、结果和分析

  1. 参考教材,结合自己实际,对调试过程进行记录和分析。

    练习

    • 针对下列指令

    – INL DR

    – OUTL SR

    – JMP ADDR

    – ADD DR, SR



写出机器码格式

在这里插入图片描述

设定规则如下

在这里插入图片描述

依次解释下为啥要如此设计:

  1. INL RD

    只涉及到RD,所以Rs本质随便设计
  2. JMP ADDR,ADDR题目设计为16位,所以对应就是ARRRL和ADDRH两层
  3. IR7-IR4是用来跳地址的

最后在程序区以及指令系统填写的时候上面的IR7-IR0的部分要转化为16进制显示


比如0010 0000转化成 20



画出微指令流程图(包括当前地址及下址)

根据实验指导书p85,我们可以得到类似的设计

在这里插入图片描述

【上图为实验指导书给的样例,下图为鄙人本题目的实现】



需要注意的是,这里002部分的框画错了,应该是RAM->BUS,BUS->IR实现跳转(也就是IR = RAM[AR]

这里RAM表示的是数据区,AR表示的是指向数据区的“指针”)

  1. 使⽤上述指令系统编写程序,实现

– 从 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

  1. 根据前面鄙人的设计,

    2代表转换的地址(0001)

    地址规定为0010(IR7-IR4部分) 寄存器由于

    指定RD使用R0,IR1和IR0就是00

    ,而剩下的IR3和IR2是影响的,这里设置为00(实际上是把RS设成R0,但是后续微指令用不到这个RS),

    所以设计为0010 0000

    ,转化为16进制就是20,但实际上,你设置成

    24 28 2A也是符合要求

  2. 同上,这里是RD用不到,所以设置成41 42 43也是可以的
  3. ADDR占两个地方,

    所以长度2 加上本来占1,一共是3

    ,RSRD都用不上所以这里60-6F都能设置
  4. 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



版权声明:本文为JamSlade原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。