【头歌】操作系统 冯·诺依曼体系结构及工作原理理解

冯·诺依曼体系结构及工作原理理解:

第6关:软件模拟 - 模拟硬件初始化

第6关 任务描述

对使用变量模拟的 TOY 计算机的部分硬件装置,进行初始化赋值。

第6关 任务过程

def init():

    ########## Begin ##########
    mem = [0] * 1000     #主存,1000个单元
    reg = [0] * 10     #通用寄存器,10个
    pReg = 0    #程序计数器,1个
    iReg = 0    #指令寄存器,1个
    ########## End ##########

第7关:软件模拟 - 程序加载

第7关 任务描述

将存放在文件中的程序指令加载到 TOY 计算机的主存中。

第7关 任务过程

def loadProgram(file, mem, address):

    ########## Begin ##########
    txt = open(file, 'r')
    s = txt.readlines()
    for x in s :
        l = len(x)
        bg, L = 0, []
        while bg <= l - 1 :
            mdl = ''
            flag = False
            while x[bg] != ' ' :
                mdl += x[bg]
                bg += 1
                if bg == l - 1 :
                    flag = True
                    break
            while x[bg] == ' ' :
                if bg == l - 1 :
                    flag = True
                    break
                bg += 1
            L.append(mdl)
            if flag :
                break
        L.pop(0)
        
        mem[address] = ' '.join(L)
        address += 1
    ########## End ##########

第8关:软件模拟 - 取指令

第8关 任务描述

模拟计算机取指令操作,将内存中的指令取到指令寄存器中来,同时程序计数器加一,指向下一条要执行的指令地址。

第8关 任务过程

def fetch(mem, pReg):

    ########## Begin ##########
    iReg = mem[pReg]
    pReg += 1
    ########## End ##########

第9关:软件模拟 - 指令译码

第9关 任务描述

对程序寄存器中的指令进行解析,得到操作码和操作数。

第9关 任务过程

def decode(iReg):

    ########## Begin ##########
    l = len(iReg)
    cnt, i = 0, 0
    L = []
    while i < l :
        while i < l and iReg[i] == ' ' :
            i = i + 1
        if i == l :
            break;
        cnt = cnt + 1; 
        mdl = ''
        while i < l and iReg[i] != ' ' :
            mdl = mdl + iReg[i]
            i = i + 1
        if cnt > 1 :
            bg = 0
            while bg < len(mdl) and mdl[bg] == '0' :
                bg = bg + 1
            mdl = mdl[bg : ]
        L.append(mdl)
    while cnt < 3 :
        L.append('None')
        cnt = cnt + 1
    ret = '(' + "'" + L[0] + "'" + ',' + ' ' + L[1] + ',' + ' ' + L[2] + ')'
    return ret
    ########## End ##########

第10关:软件模拟 - 指令执行

第10关 任务描述

根据 TOY 计算机指令译码结果,编程模拟指令执行及写结果的操作。

第10关 任务过程

def execute(opcode, op1, op2, reg, mem, pReg):

    ########## Begin ##########
    global iReg
    if opcode == 'mov1' :
        reg[op1] = eval(mem[op2])
        result = reg[op1]
    elif opcode == 'mov2' :
        mem[op1] = str(reg[op2])
        result = mem[op1]
    elif opcode == 'mov3' :
        reg[op1] = op2
        result = reg[op1]
    elif opcode == 'add' :
        reg[op1] += reg[op2]
        result = reg[op1]
    elif opcode == 'sub' :
        reg[op1] -= reg[op2]
        result = reg[op1]
    elif opcode == 'mul' :
        reg[op1] *= reg[op2]
        result = reg[op1]
    elif opcode == 'div' :
        reg[op1] = reg[op1] // reg[op2]
        result = reg[op1]
    elif opcode == 'jmp' :
        iReg = mem[op1]
        # pReg = eval(mem[op1])
        return pReg
    elif opcode == 'jz' :
        if reg[op1] == 0 :
            # pReg = eval(mem[op2]
            iReg = mem[op2]
        result = pReg
    elif opcode == 'in' :
        reg[op1] = eval(input())
        result = reg[op1]
    elif opcode == 'out' :
        # print(reg[op1])
        result = reg[op1]
    else :
        result = False
    ########## End ##########

第11关:软件模拟 - TOY计算机执行程序的完整过程

第11关 任务描述

完成完整的toy计算机程序的模拟执行。

第11关 任务过程

11.1 def loadProgram(file, mem, address):
    ########## Begin ##########
    txt = open(file, 'r')
    s = txt.readlines()
    for x in s :
        l = len(x)
        bg, L = 0, []
        while bg < l :
            mdl = ''
            while bg < l and x[bg] != ' ' :
                mdl = mdl + x[bg]
                bg += 1
            while bg < l and x[bg] == ' ' :
                bg += 1
            L.append(mdl)
        L.pop(0)
        mem[address] = ' '.join(L)
        address = address + 1
    ########## End ##########
11.2 def fetch(mem, pReg):
    ########## Begin ##########
    iReg = mem[pReg]    
    ########## End ##########
11.3 def decode(iReg):
    ########## Begin ##########
    l = len(iReg)
    cnt, i = 0, 0
    L = []
    while i < l :
        while i < l and iReg[i] == ' ' :
            i = i + 1
        if i == l :
            break
        cnt = cnt + 1; mdl = ''
        while i < l and iReg[i] != ' ' :
            mdl = mdl + iReg[i]
            i = i + 1
        if cnt > 1 :
            bg = 0
            while bg < len(mdl) and mdl[bg] == '0' :
                bg = bg + 1
            mdl = mdl[bg : ]
        L.append(mdl)
    tmp = cnt
    while cnt < 3 :
        L.append('None')
        cnt = cnt + 1
    if tmp == 1 :
        return L[0], 0, 0
    elif tmp == 2 :
        if L[1] == '' or L[1] == '\n':
            return L[0], 0, 0
        return L[0], eval(L[1]), 0
    else :
        ret1, ret2 = 0, 0
        if L[1] != '' and L[1] != '\n':
            ret1 = eval(L[1])
        if L[2] != '' and L[2] != '\n':
            ret2 = eval(L[2])
    ########## End ##########
11.4 def execute(opcode, op1, op2, reg, mem, address):
    ########## Begin ##########
    global pReg
    flag = False
    if opcode == 'mov1' :
        reg[op1] = eval(mem[op2])
    elif opcode == 'mov2' :
        mem[op1] = str(reg[op2])
    elif opcode == 'mov3' :
        reg[op1] = op2
    elif opcode == 'add' :
        reg[op1] += reg[op2]
    elif opcode == 'sub' :
        reg[op1] -= reg[op2]
    elif opcode == 'mul' :
        reg[op1] *= reg[op2]
    elif opcode == 'div' :
        reg[op1] = reg[op1] // reg[op2]
    elif opcode == 'jmp' :
        iReg = mem[op1]
        pReg = op1 + address
        flag = True
    elif opcode == 'jz' :
        if reg[op1] == 0 :
            flag = True
            iReg = mem[op2]
            pReg = op2 + address
    elif opcode == 'in' :
        reg[op1] = eval(input())
    elif opcode == 'out' :
        print(reg[op1])
    if flag == False :
        pReg = pReg + 1
    if opcode != 'halt' and opcode != 'halt\n':
        result = True
    else :
        result = False
    return result
    ########## End ##########
11.5 def run(file, addr):
    ########BEGIN########
    global pReg, iReg    
    pReg = addr
    loadProgram(file, mem, addr)
    while True :
        pReg, iReg = fetch(mem, pReg)
        L, op1, op2 = decode(iReg)
        mdl = execute(L, op1, op2, reg, mem, addr)
        if mdl == False :
            break
    ########## End ##########

第12关:软件模拟 - 扩展 TOY 计算机指令集

第12关 任务描述

本关任务:修改给定的程序代码,使其支持执行使用 TOY 计算机扩展指令集编写的程序代码。

第12关 任务过程

12.1 def init():
    ########## Begin ##########
    mem = ['']*1000     #主存
    reg = [0]*10       #通用寄存器
    pReg = 0          #程序计数器
    iReg = ''         #指令寄存器
    CF = 0   
    ########## End ##########
12.2 def loadProgram(file, mem, address):
    ########## Begin ##########
    txt = open(file, 'r')
    s = txt.readlines()
    for x in s :
        l = len(x)
        bg, L = 0, []
        while bg < l :
            mdl = ''
            while bg < l and x[bg] != ' ' and x[bg] != '\t' :
                mdl = mdl + x[bg]
                bg += 1
            while bg < l and (x[bg] == ' ' or x[bg] == '\t'):
                bg += 1
            L.append(mdl)
        L.pop(0)
        mem[address] = ' '.join(L)
        address = address + 1
    ########## End ##########
12.3 def fetch():
    ########## Begin ##########
    iReg = mem[pReg]
    return pReg, iReg    
    ########## End ##########
12.4 def decode():
    ########## Begin ##########
    l = len(iReg)
    cnt, i = 0, 0
    L = []
    while i < l :
        while i < l and iReg[i] == ' ' :
            i = i + 1
        if i == l :
            break
        cnt = cnt + 1; mdl = ''
        while i < l and iReg[i] != ' ' :
            mdl = mdl + iReg[i]
            i = i + 1
        if cnt > 1 :
            bg = 0
            while bg < len(mdl) and mdl[bg] == '0' :
                bg = bg + 1
            mdl = mdl[bg : ]
        L.append(mdl)
    tmp = cnt
    while cnt < 3 :
        L.append('None')
        cnt = cnt + 1
    if tmp == 1 :
        return L[0], 0, 0
    elif tmp == 2 :
        if L[1] == '' or L[1] == '\n':
            return L[0], 0, 0
        return L[0], eval(L[1]), 0
    else :
        ret1, ret2 = 0, 0
        if L[1] != '' and L[1] != '\n':
            ret1 = eval(L[1])
        if L[2] != '' and L[2] != '\n':
            ret2 = eval(L[2])
        return L[0], ret1, ret2
    ########## End ##########
12.5 def execute(opcode,op1,op2, address):
    ########## Begin ##########
    flag = False
    if opcode == 'mov1' :
        reg[op1] = eval(mem[op2])
    elif opcode == 'mov2' :
        mem[op1] = str(reg[op2])
    elif opcode == 'mov3' :
        reg[op1] = op2
    elif opcode == 'add' :
        reg[op1] += reg[op2]
    elif opcode == 'sub' :
        reg[op1] -= reg[op2]
    elif opcode == 'mul' :
        reg[op1] *= reg[op2]
    elif opcode == 'div' :
        reg[op1] = reg[op1] // reg[op2]
    elif opcode == 'jmp' :
        iReg = mem[op1]
        pReg = op1 + address
        flag = True
    elif opcode == 'jz' :
        if reg[op1] == 0 :
            flag = True
            iReg = mem[op2]
            pReg = op2 + address
    elif opcode == 'in' :
        reg[op1] = eval(input())
    elif opcode == 'out' :
        print(reg[op1])
    elif opcode == 'add2' :
        reg[op1] += op2
    elif opcode == 'cmp' :
        if reg[op1] <= op2 :
            CF = 1
        else :
            CF = 0
    elif opcode == 'ble' :
        if CF :
            pReg = reg[op1] + address
            flag = True
    if flag == False :
        pReg = pReg + 1
    if opcode != 'halt' and opcode != 'halt\n':
        result = True
    else :
        result = False
    ########## End ##########
    
    return result	//需要修改返回值TRUE为result
12.6 def run(file, addr):
    ######## Begin ########
    pReg = addr
    loadProgram(file, mem, addr)
    while True :
        pReg, iReg = fetch()
        L, op1, op2 = decode()
        mdl = execute(L, op1, op2, addr)
        if mdl == False :
            break  
    ########## End ##########
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值