针对下列指令
– INL DR
– OUTL SR
– JMP ADDR
– ADD DR, SR
1. • 写出机器指令格式
2. • 画出微指令流程图(包括当前地址及下址)
3. • 使⽤上述指令系统编写程序,实现
– 从 INPUT 读⼊数据到 DR
– DR=SR+DR
– DR 数据在 OUTPUT 显⽰
– 循环往复
最后在程序区以及指令系统填写的时候上面的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
Figure 2散转地址20的情况 需要偶(低地址)传奇(rs
注意在实际操作的时候,若要对REG(寄存器)进行操作,记得 RS偶 RD奇
Figure 3散转地址40的情况 偶(低地址rd)传偶
完全体(剩下变体自行理解了)
指令系统:
;助记符 操作数 指令码 长度
;-----------------------------------------------------
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