计组课设真的搞人心态,网上很多东西都是你有一定基础才能看得懂的,没有任何基础的一脸懵逼......所以就搞这么一个东西拯救后人
首先要把软件搞清楚
实验监控程序
(我只是把窗口调成了白色,就是你蓝色那个监控程序)
搞清楚各个指令的含义
E指令:逐“字”输入
最前面的0900 是提示你当前位置,后面的0000是提示你,当前位置的内容是"0000"
Enter 代表改动结束,Space代表改下一个,每一行会显示5个“字”(我对这个“字”的定义是4位的一个16进制数)。比如上面这张图,第二行的五个就是0900-0904位置的内容(很奇怪,一个微指令是4个字,为什么非要一行显示5个字……)
肯定有人会好奇每个前面这个0000到底是什么意思,他其实就是再告诉你,这个位置原来储存的东西是什么,比如上面这个图运行完之后,我如果再从900开始执行E命令:
你大概就能明白是什么意思了。
A指令:编译输入
A,E指令的作用其实是一样的,可以理解为
E输入的是machine code language,
A输入的是高级语言,编程语言
比如下图
(D指令:显示内容,“D800”会从0800位置向后显示128个“字”)
E指令中,直接把“AC00”这个内容存到0800中
A指令中,会把RET这个高级指令,“编译”成对应的machine code,也就是“AC00”,存到0801中
也就是说,殊途同归,哪个方便来哪个,E指令底层,A指令直观。
U指令:反编译
U指令是A指令的逆
他会“反编译”一下,告诉你你每一个字(或者几个)代表什么意思(比如上面的两个RET)
G指令:GoGoGo
刚才前面的指令,都是在对内存进行修改或者读取,并没有真正意义上的运行。
G指令会运行你的代码至RET为止,也就是说“RET”其实代表了一段代码的终止(当作 c里面的 return就行),如果你没有RET,使用G指令会导致dead loop。
(R指令:显示所有寄存器的值)
上面这张图显示了我在运行800(还是之前存的RET)之后,各个寄存器内容的变化,首先是PC变成了800,也就是这次运行开始的地方,IP代表这次运行结束的地方,由于800只有一个RET(也就是return),运行还没有开始就结束了。
实验
每个实验基本上就是,告诉你一个要求,让你编写相应的微程序,然后整个例子运行一下,证明能跑就行。大概流程分为以下这么几步:
设计微程序
把微程序整到控存里面
跑个demo
一点一点来
首先看帮助真的很重要,内置的帮助能解决绝大多数的问题。
我觉得最好的方法就是先去分析一个现成的,把到底发生了什么搞清楚再去设计新的
下面是课设第一题我的微程序,以此为基础来研究一下,你可以当作demo,可以直接复制到监控程序里面试一下
E900
0000 0E00 90B5 5402 0000 0E00 10F0 0002 0000 0E00 00F0 0000 0000 0E00 A0B5 5402 0000 0E00 10F0 0002 0000 0E01 02E0 0000 0029 0300 1020 0010
A800
MOV R1,900
MOV R2,7
MOV R3,100
LDMC
RET
G800
A820
MOV R0,0365
MOV R1,0050
MOV [A00],R0
MOV [A01],R1
RET
G820
E829
D500 0A00 0A01 AC00
G829
DA00
先不要管微程序的设计,和这个微程序具体构成,先看明白每一步发生了什么事情
首先第一步是把微程序代码装到了0900这个位置,4个字为一条微指令(红框里面就是一条微指令),数一下一共装入了7条微指令
接下来的东西是一些比较死的一些东西
Tec-2的设计者内置了很多指令,但也留下了给用户自定义的空间
观察题目里面有两个比较重要的东西,一个是指令格式D5XX,一个是控存入口100H,你会发现在帮助中,100H对应的指令格式却是D4,他的底层逻辑是这样的:指令D400-D7FF所对应的是同一个函数,也就是说,你无论是输入D500,D501…..D600….只要在这个范围内,他所对应的内容都是在100H这个控存里面的,那他存在的意义到底是什么,用我的话来说就是,“把部分参数固定在指令里面”。在本题,你指令输入D500,D501…..D600….都是无所谓的,因为在你的微指令里面没有用到这些东西。但在第三题中
指令格式为E1XX,查询上面的帮助后你会发现他对应的位置其实E000-E3FF都对应的是这个函数,但最后需要你设计出来的,比如E158,就是判断寄存器R5和寄存器R8的内容,也就是我说的“把部分参数固定在指令里面”。而指令是E1不是E0,E2,E3也是老师有意为之,具体就自己去研究研究吧。
回到刚才说的,你想要把一个微程序加载到控存里面,是需要固定的做法,也就是下面这张图
LDMC这条指令,就是加载自定义指令的指令,调用时,会用到R1,R2,R3里面的内容,其分别是
R1:微指令起始位置
R2:微指令条数
R3:要加载到哪个控存
G800就是之前说过的,从800开始运行,运行到RET结束。
所以这个图翻译出来就是“从0900(R1内容)位置开始,读取7(R2内容)条微指令,固定到控存100(R1内容)处”
而且更重要的一点是,当你把这些加载到控存之后,你就算再改变0900后面这些位置的东西,控存100的这个地方的指令也不会再变,你可以理解为当你运行LDMC时,就是给控存里make了一份copy
也就是说,到这步为止,你已经成功把D400-D7FF这些语句所对应的指令准备好了
接下来这部分就是做一些准备工作,把0A00位置里放365这个数字(随便的),0A01里放50
再接下来这一步很重要一定要看懂,从0829位置开始,分别是
D500: 刚刚说的指令名字,在这道题里面,你D400-D7FF都可以
0A00: 第一个操作数 ADDR1
0A01: 第二个操作数 ADDR2
AC00: RET,程序结束
作用就是用(0A00)里面的数字减去(0A01)里面的数字,再存回(0A00)里面
最后结果,之前0A00里面是365,365-50=315存回0A00(全文都是hex啊)
总之,你把这个demo每一步都看懂了的话,就算是一个基本入门了
接下来就是看这个微程序到底是什么东西了,下一篇继续