【Educoder作业】冯·诺依曼体系结构模拟机 TOY2
只有一个题,思路和
T
O
Y
1
TOY1
TOY1是没有任何区别的。
整个这个
T
O
Y
TOY
TOY计算机的思想是显然的,就是用我们的
P
y
t
h
o
n
Python
Python来模拟一个别的语言。
这个和之前的
T
O
Y
1
TOY1
TOY1区别就是在求出
o
p
c
o
d
e
,
o
p
1
,
o
p
2
opcode,op_1, op_2
opcode,op1,op2时是用的整数处理,更加容易简单。
贴个代码
mem = [0]*1000 #主存
reg = [0]*10 #通用寄存器
pReg = 0 #程序计数器
iReg = 0 #指令寄存器
res = 0 #存放程序输出结果
# loadProgram函数:加载程序,将file文件中的程序代码顺序存放到主存,程序第一条指令放入address地址对应的主存单元中,设置程序计数器pReg的值
def loadProgram(file):
global pReg, iReg, reg, mem, address #全局变量声明
########## Begin ##########
txt = open(file, 'r')
s = txt.readlines()
l = len(s)
for i in range(l) :
bg = 3
midl = len(s[i])
while bg < midl and (s[i][bg]== ' ' or s[i][bg] == '\t') :
bg += 1
x = 0
while bg < midl and s[i][bg] != '\n' :
x = x * 10 + int(s[i][bg])
bg = bg + 1
mem[i + address] = x
########## End ##########
# cycle函数:执行一条 TOY2 指令,包括取指令、指令译码、执行和写结果 4 个步骤
def cycle():
global pReg, iReg, reg, mem, res, address #全局变量声明
iReg = mem[pReg]
########## Begin ##########
flag = False
x, y, z = iReg // 10000, (iReg // 1000) % 10, iReg % 1000
if x == 0 :
return False
elif x == 1 :
reg[y] = mem[z]
elif x == 2 :
mem[z] = reg[y]
elif x == 3 :
reg[y] = z
elif x == 4 :
reg[y] += reg[z]
elif x == 5 :
reg[y] -= reg[z]
elif x == 6 :
reg[y] *= reg[z]
elif x == 7 :
reg[y] = reg[y] // reg[z]
elif x == 8 :
flag = True
pReg = z + address
iReg = mem[pReg]
elif x == 9 :
if reg[y] == 0 :
flag = True
pReg = z + address
iReg = mem[pReg]
elif x == 10 :
reg[y] = int(input())
elif x == 11 :
print(reg[y])
if flag == False :
pReg = pReg + 1
return True
########## End ##########
# run函数:加载程序并执行程序
def run(file):
global pReg, iReg, reg, mem, res, address #全局变量声明
loadProgram(file) #加载TOY2程序
pReg = address
while True: #每循环一次,执行一条指令
hasNextInstruc = cycle() #执行一条TOY2指令
if hasNextInstruc==False: #若执行的是停机指令
break #则跳出循环
fil = input() #获取待执行程序所在的文件名
address = int(input()) #获取程序装载到主存的起始物理地址
run(fil) #加载程序并执行