【Educoder作业】※ 冯·诺依曼体系结构——模拟 TOY 计算机(MOOC版)

【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程序
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
·体系结构模拟机toy2是一种基于·体系结构计算机模拟机。·体系结构计算机科学中最重要的体系结构之一,它将程序和数据存储在同一个存储器中,并通过控制单元进行指令的执行。 模拟机toy2是在·体系结构基础上设计而成的。它包括了主存储器、中央处理单元(CPU)、输入输出设备和控制单元。主存储器用于存储程序和数据,CPU负责执行指令,而输入输出设备用于与外部环境进行交互。 模拟机toy2的CPU由算术逻辑单元(ALU)、寄存器和控制器组成。ALU负责进行算术和逻辑运算,寄存器用于存储指令和数据,而控制器则负责解析指令并控制程序的执行。控制器通过指令寄存器和程序计数器来读取和执行指令。 模拟机toy2的输入输出设备可以是键盘、显示器、打印机等。它们通过输入输出接口与计算机进行数据交换。 用模拟机toy2进行计算时,首先需要将程序和数据存储到主存储器中。然后,通过控制器将程序从主存储器读取到指令寄存器,再由程序计数器指示下一条要执行的指令。控制器解析指令,并将其发送给ALU进行计算。计算结果可以存储到寄存器或主存储器中。执行完一条指令后,程序计数器自动加1,指向下一条指令,以此类推,直到程序结束。 总之,·体系结构模拟机toy2是一种基于·体系结构计算机模拟机,它将程序和数据存储在同一个存储器中,并通过控制单元进行指令的执行。它提供了CPU、主存储器和输入输出设备等基本组件,可用于进行程序的运行和数据的处理。它是理解和学习计算机体系结构的重要工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值