【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程序
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐