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


    一、 实验目的

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    ;指令系统部分
    ;助记符 操作数              指令码 长度
    ;-----------------------------------------------------
    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    解释一下为啥这几个分别是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
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    源程序
    ;基本模型机程序
    
    #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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    浅学了波ZooKeeper,我来做个总结
    什么是Monkey,以及Monkey异常
    天翼物联与华为联合发布5GtoB终端认证标准2.0
    你知道Spring是怎么将AOP应用到Bean的生命周期中的吗?
    Python遇上SQL,于是一个好用的Python第三方库出现了
    SpringCloudSleuth异步线程支持和传递
    数据治理:数据治理管理(第五篇)
    RCE远程控制漏洞(下)
    KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(3)
    2011--利用数学知识解题
  • 原文地址:https://blog.csdn.net/JamSlade/article/details/125467137