简单的MIPS指令编译程序

在做计算机组成原理的设计的时候,需要将MIPS指令转化为十六进制数和二进制数,来进行仿真。于是使用了python设计了一个简单的编译程序,其中包含了MIPS指令集中的61条指令。

代码如下:

# MIPS 编译器

def translate(code: str):
    code = code.lower().split()
    for i, num in enumerate(code[1:]):
        code[i + 1] = str(bin(int(num)))[2:]
    tmp = ''
    if code[0] == "add":
        tmp = f"000000{code[2].zfill(5) + code[3].zfill(5) + code[1].zfill(5)}00000100000"
    elif code[0] == "addi":
        tmp = f"001000{code[2].zfill(5) + code[1].zfill(5) + code[3].zfill(16)}"
    elif code[0] == "addu":
        tmp = f"000000{code[2].zfill(5) + code[3].zfill(5) + code[1].zfill(5)}00000100001"
    elif code[0] == "addiu":
        tmp = f"001001{code[2].zfill(5) + code[1].zfill(5) + code[3].zfill(16)}"
    elif code[0] == "sub":
        tmp = f"000000{code[2].zfill(5) + code[3].zfill(5) + code[1].zfill(5)}00000100010"
    elif code[0] == "subu":
        tmp = f"000000{code[2].zfill(5) + code[3].zfill(5) + code[1].zfill(5)}00000100011"
    elif code[0] == "slt":
        tmp = f"000000{code[2].zfill(5) + code[3].zfill(5) + code[1].zfill(5)}00000101010"
    elif code[0] == "slti":
        tmp = f"001010{code[2].zfill(5) + code[1].zfill(5) + code[3].zfill(16)}"
    elif code[0] == "sltu":
        tmp = f"000000{code[2].zfill(5) + code[3].zfill(5) + code[1].zfill(5)}00000101011"
    elif code[0] == "sltiu":
        tmp = f"001011{code[2].zfill(5) + code[1].zfill(5) + code[3].zfill(16)}"
    elif code[0] == "div":
        tmp = f"000000{code[1].zfill(5) + code[2].zfill(5)}0000000000011010"
    elif code[0] == "divu":
        tmp = f"000000{code[1].zfill(5) + code[2].zfill(5)}0000000000011011"
    elif code[0] == "mult":
        tmp = f"000000{code[1].zfill(5) + code[2].zfill(5)}0000000000011000"
    elif code[0] == "multu":
        tmp = f"000000{code[1].zfill(5) + code[2].zfill(5)}0000000000011001"

    elif code[0] == "and":
        tmp = f"000000{code[2].zfill(5) + code[3].zfill(5) + code[1].zfill(5)}00000100100"
    elif code[0] == "andi":
        tmp = f"001100{code[2].zfill(5) + code[1].zfill(5) + code[3].zfill(16)}"
    elif code[0] == "lui":
        tmp = f"00111100000{code[1].zfill(5) + code[2].zfill(16)}"
    elif code[0] == "nor":
        tmp = f"000000{code[2].zfill(5) + code[3].zfill(5) + code[1].zfill(5)}00000100111"
    elif code[0] == "or":
        tmp = f"000000{code[2].zfill(5) + code[3].zfill(5) + code[1].zfill(5)}00000100101"
    elif code[0] == "ori":
        tmp = f"001101{code[2].zfill(5) + code[1].zfill(5) + code[3].zfill(16)}"
    elif code[0] == "xor":
        tmp = f"000000{code[2].zfill(5) + code[3].zfill(5) + code[1].zfill(5)}00000100110"
    elif code[0] == "xori":
        tmp = f"001110{code[2].zfill(5) + code[1].zfill(5) + code[3].zfill(16)}"

    elif code[0] == "sllv":
        tmp = f"000000{code[3].zfill(5) + code[2].zfill(5) + code[1].zfill(5)}00000000100"
    elif code[0] == "sll":
        tmp = f"00000000000{code[2].zfill(5) + code[1].zfill(5) + code[3].zfill(5)}000000"
    elif code[0] == "srav":
        tmp = f"000000{code[3].zfill(5) + code[2].zfill(5) + code[1].zfill(5)}00000000111"
    elif code[0] == "sra":
        tmp = f"00000000000{code[2].zfill(5) + code[1].zfill(5) + code[3].zfill(5)}000011"
    elif code[0] == "srlv":
        tmp = f"000000{code[3].zfill(5) + code[2].zfill(5) + code[1].zfill(5)}00000000110"
    elif code[0] == "srl":
        tmp = f"00000000000{code[2].zfill(5) + code[1].zfill(5) + code[3].zfill(5)}000010"

    elif code[0] == "beq":
        tmp = f"000100{code[1].zfill(5) + code[2].zfill(5) + code[3].zfill(16)}"
    elif code[0] == "bne":
        tmp = f"000101{code[1].zfill(5) + code[2].zfill(5) + code[3].zfill(16)}"
    elif code[0] == "bgez":
        tmp = f"000001{code[1].zfill(5)}00001{code[2].zfill(16)}"
    elif code[0] == "bgtz":
        tmp = f"000111{code[1].zfill(5)}00000{code[2].zfill(16)}"
    elif code[0] == "blez":
        tmp = f"000110{code[1].zfill(5)}00000{code[2].zfill(16)}"
    elif code[0] == "bltz":
        tmp = f"000001{code[1].zfill(5)}00000{code[2].zfill(16)}"
    elif code[0] == "bgezal":
        tmp = f"000001{code[1].zfill(5)}10001{code[2].zfill(16)}"
    elif code[0] == "bltzal":
        tmp = f"000001{code[1].zfill(5)}10000{code[2].zfill(16)}"
    elif code[0] == "j":
        tmp = f"000010{code[1].zfill(26)}"
    elif code[0] == "jal":
        tmp = f"000011{code[1].zfill(26)}"
    elif code[0] == "jr":
        tmp = f"000000{code[1].zfill(5)}000000000000000001000"
    elif code[0] == "jalr":
        tmp = f"000000{code[2].zfill(5)}00000{code[1].zfill(5)}00000001001"

    elif code[0] == "mfhi":
        tmp = f"0000000000000000{code[1].zfill(5)}00000010000"
    elif code[0] == "mflo":
        tmp = f"0000000000000000{code[1].zfill(5)}00000010010"
    elif code[0] == "mthi":
        tmp = f"000000{code[1].zfill(5)}000000000000000010001"
    elif code[0] == "mtlo":
        tmp = f"000000{code[1].zfill(5)}000000000000000010011"

    elif code[0] == "break":
        tmp = f"00000000000000000000000000001101"
    elif code[0] == "syscall":
        tmp = f"00000000000000000000000000001100"

    elif code[0] == "lb":
        tmp = f"100000{code[3].zfill(5) + code[1].zfill(5) + code[2].zfill(16)}"
    elif code[0] == "lbu":
        tmp = f"100100{code[3].zfill(5) + code[1].zfill(5) + code[2].zfill(16)}"
    elif code[0] == "lh":
        tmp = f"100001{code[3].zfill(5) + code[1].zfill(5) + code[2].zfill(16)}"
    elif code[0] == "lhu":
        tmp = f"100101{code[3].zfill(5) + code[1].zfill(5) + code[2].zfill(16)}"
    elif code[0] == "lw":
        tmp = f"100011{code[3].zfill(5) + code[1].zfill(5) + code[2].zfill(16)}"
    elif code[0] == "lwl":
        tmp = f"100010{code[3].zfill(5) + code[1].zfill(5) + code[2].zfill(16)}"
    elif code[0] == "lwr":
        tmp = f"100110{code[3].zfill(5) + code[1].zfill(5) + code[2].zfill(16)}"
    elif code[0] == "sb":
        tmp = f"101000{code[3].zfill(5) + code[1].zfill(5) + code[2].zfill(16)}"
    elif code[0] == "sh":
        tmp = f"101001{code[3].zfill(5) + code[1].zfill(5) + code[2].zfill(16)}"
    elif code[0] == "sw":
        tmp = f"101011{code[3].zfill(5) + code[1].zfill(5) + code[2].zfill(16)}"
    elif code[0] == "swl":
        tmp = f"101010{code[3].zfill(5) + code[1].zfill(5) + code[2].zfill(16)}"
    elif code[0] == "swr":
        tmp = f"101110{code[3].zfill(5) + code[1].zfill(5) + code[2].zfill(16)}"

    elif code[0] == "eret":
        tmp = f"01000010000000000000000000011000"
    elif code[0] == "mfc0":
        tmp = f"01000000000{code[1].zfill(5) + code[2].zfill(5)}00000000{code[3].zfill(3)}"
    elif code[0] == "mtc0":
        tmp = f"01000000100{code[1].zfill(5) + code[2].zfill(5)}00000000{code[3].zfill(3)}"

    return tmp


def main():
    # 指令在此处输入
    codes = """
            addiu 1 0 17
            """
    codes = codes.splitlines()
    for code in codes:
        code = code.strip()
        if code:
            tmp = translate(code)
            if len(tmp) == 32:
                print(hex(eval('0b'+tmp))[2:].upper().zfill(8)) # 16进制输出
                # print(tmp)                                    # 二进制输出
            else:
                print("指令错误")


if __name__ == "__main__":
    main()

在线调试

如有错误,敬请指正

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值