在做计算机组成原理的设计的时候,需要将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()
如有错误,敬请指正