【Educoder作业】※ 冯·诺依曼体系结构——模拟 TOY 计算机(MOOC版)
[Educoder作业]※ 冯·诺依曼体系结构——模拟 TOY 计算机(MOOC版)我就感觉这整个的好几个作业都没啥区别。想说的第一篇关于TOYTOYTOY计算机的博客里已经说过了。T1 程序加载mem = ['']*1000#初始化主存单元#loadProgram:加载TOY程序file到主存mem中def loadProgram(file):########## Begin #########
【Educoder作业】※ 冯·诺依曼体系结构——模拟 TOY 计算机(MOOC版)
我就感觉这整个的好几个作业都没啥区别。想说的第一篇关于 T O Y TOY TOY计算机的博客里已经说过了。
T1 程序加载
mem = ['']*1000 #初始化主存单元
#loadProgram:加载TOY程序file到主存mem中
def loadProgram(file):
########## Begin ##########
txt = open(file, 'r')
s = txt.readlines()
Leng = len(s)
for i in range(Leng) :
x = s[i]
l = len(x)
bg, L = 0, []
while bg <= l - 1 :
mdl = ''
flag = False
while bg < l and x[bg] != ' ' and x[bg] != '\t' and x[bg] != '\n':
mdl = mdl + x[bg]
bg += 1
while bg < l and (x[bg] == ' ' or x[bg] == '\t' or x[bg] == '\n'):
bg += 1
L.append(mdl)
L.pop(0)
mem[i] = ' '.join(L)
########## End ##########
filename = input() #读取TOY程序文件名
loadProgram(filename) #加载TOY程序到主存
print(mem[:15]) #打印主存前15个单元内容
他这个制表符啥的更多一点。
T2 执行一条指令
这个就是之前的
e
x
e
c
u
t
e
execute
execute,没啥区别。
主要
p
R
e
g
pReg
pReg在跳转语句中不需要再加了即可。
mem = ['']*1000 #主存
reg = [0.0]*10 #通用寄存器
pReg = 0 #程序计数器
iReg = '' #指令寄存器
def loadProgram(file):
fil = open(file, 'r') #打开文件
first = True #用于标识是否为第1条指令
while True: #每循环一次加载一条指令
line = fil.readline() #读1行
if line == '': #若读取完毕,则结束循环
break
flds = line.split() #将1行拆分为若干部分
address = int(flds[0]) #第0部分为地址
instruc = flds[1] #将后面的部分重新拼接为指令
for fld in flds[2:len(flds)]:
instruc = instruc+' '+fld
mem[address] = instruc #将指令加载到主存单元
fil.close() #关闭文件
#cycle:根据pReg的值取出主存对应单元的指令放入iReg中并执行,若执行的是停止指令,返回False,否则返回True
def val(s) :
l, re = len(s), 0
for i in range(l) :
x = eval(s[i])
re = re * 10 + x
return re
def cycle():
global pReg, iReg, reg, mem
######## Begin ########
iReg = mem[pReg]
if iReg == 'halt' :
return False
L = iReg.split(' ')
x, y, Len = 0, 0, len(L)
if Len > 1 :
x = val(L[1])
if Len > 2 :
y = val(L[2])
# print(x, y)
if L[0] == 'mov1' :
reg[x] = val(mem[y])
elif L[0] == 'mov2' :
mem[x] = str(reg[y])
elif L[0] == 'mov3' :
reg[x] = y
elif L[0] == 'add' :
reg[x] += reg[y]
elif L[0] == 'sub' :
reg[x] -= reg[y]
elif L[0] == 'mul' :
reg[x] *= reg[y]
elif L[0] == 'div' :
reg[x] = reg[x] / reg[y]
elif L[0] == 'jmp' :
pReg = x
return True
elif L[0] == 'jz' :
if reg[x] == 0 :
pReg = y
return True
elif L[0] == 'in' :
reg[x] = input('input:')
elif L[0] == 'out' :
if type(reg[x]) == float :
print('output: %.1f\n' %reg[x])
else :
print('output: %d\n' %reg[x])
pReg = pReg + 1
return True
######## End ########
T3 自动执行 TOY 程序
缝合怪,把前两个题加一起即可。
mem = ['']*1000 #主存
reg = [0.0]*10 #通用寄存器
pReg = 0 #程序计数器
iReg = '' #指令寄存器
def loadProgram(file):
fil = open(file, 'r') #打开文件
first = True #用于标识是否为第1条指令
while True: #每循环一次加载一条指令
line = fil.readline() #读1行
if line == '': #若读取完毕,则结束循环
break
flds = line.split() #将1行拆分为若干部分
address = int(flds[0]) #第0部分为地址
instruc = flds[1] #将后面的部分重新拼接为指令
for fld in flds[2:len(flds)]:
instruc = instruc+' '+fld
mem[address] = instruc #将指令加载到主存单元
fil.close() #关闭文件
#cycle:根据pReg的值取出主存对应单元的指令放入iReg中并执行,若执行的是停止指令,返回False,否则返回True
def val(s) :
l, re = len(s), 0
for i in range(l) :
x = eval(s[i])
re = re * 10 + x
return re
def cycle():
global pReg, iReg, reg, mem
######## Begin ########
iReg = mem[pReg]
if iReg == 'halt' :
return False
L = iReg.split(' ')
x, y, Len = 0, 0, len(L)
if Len > 1 :
x = val(L[1])
if Len > 2 :
y = val(L[2])
# print(x, y)
if L[0] == 'mov1' :
reg[x] = val(mem[y])
elif L[0] == 'mov2' :
mem[x] = str(reg[y])
elif L[0] == 'mov3' :
reg[x] = y
elif L[0] == 'add' :
reg[x] += reg[y]
elif L[0] == 'sub' :
reg[x] -= reg[y]
elif L[0] == 'mul' :
reg[x] *= reg[y]
elif L[0] == 'div' :
reg[x] = reg[x] / reg[y]
elif L[0] == 'jmp' :
pReg = x
return True
elif L[0] == 'jz' :
if reg[x] == 0 :
pReg = y
return True
elif L[0] == 'in' :
reg[x] = input('input:')
elif L[0] == 'out' :
if type(reg[x]) == float :
print('output: %.1f\n' %reg[x])
else :
print('output: %d\n' %reg[x])
pReg = pReg + 1
return True
######## End ########
#run:加载文件file中的程序并执行
def run(file):
global pReg, iReg, reg, mem
######## Begin ########
loadProgram(file)
Useless = 0
while cycle() :
Useless += 1
######## End ########
filename = input() #读取TOY程序文件名称
run(filename) #运行TOY程序
更多推荐
所有评论(0)