# 支持汇编指令from cpu import pin# 需要执行的指令集合,取指令集合FETCH = [pin.PC_OUT | pin.MAR_IN,pin.RAM_OUT | pin.IR_IN | pin.PC_INC,pin.PC_OUT | pin.MAR_IN,pin.RAM_OUT | pin.DST_IN | pin.PC_INC,pin.PC_OUT | pin.MAR_IN,pin.RAM_OUT | pin.SRC_IN | pin.PC_INC,]# 指令定义# 2地址指令MOV = (0 << pin.ADDR2_SHIFT) | pin.ADDR2ADD = (1 << pin.ADDR2_SHIFT) | pin.ADDR2SUB = (2 << pin.ADDR2_SHIFT) | pin.ADDR2CMP = (3 << pin.ADDR2_SHIFT) | pin.ADDR2AND = (4 << pin.ADDR2_SHIFT) | pin.ADDR2OR = (5 << pin.ADDR2_SHIFT) | pin.ADDR2XOR = (6 << pin.ADDR2_SHIFT) | pin.ADDR2# 1地址指令INC = (0 << pin.ADDR1_SHIFT) | pin.ADDR1DEC = (1 << pin.ADDR1_SHIFT) | pin.ADDR1NOT = (2 << pin.ADDR1_SHIFT) | pin.ADDR1JMP = (3 << pin.ADDR1_SHIFT) | pin.ADDR1# 6大条件跳转,根据PSW来判定# 溢出跳转JO = (4 << pin.ADDR1_SHIFT) | pin.ADDR1# 非溢出跳转JNO = (5 << pin.ADDR1_SHIFT) | pin.ADDR1# 零跳转JZ = (6 << pin.ADDR1_SHIFT) | pin.ADDR1# 非零跳转JNZ = (7 << pin.ADDR1_SHIFT) | pin.ADDR1# 奇数跳转JP = (8 << pin.ADDR1_SHIFT) | pin.ADDR1# 非奇数跳转JNP = (9 << pin.ADDR1_SHIFT) | pin.ADDR1# 堆栈指令PUSH = (10 << pin.ADDR1_SHIFT) | pin.ADDR1POP = (11 << pin.ADDR1_SHIFT) | pin.ADDR1# 函数调用CALL = (12 << pin.ADDR1_SHIFT) | pin.ADDR1# 中断INT = (12 << pin.ADDR1_SHIFT) | pin.ADDR1# 0地址指令NOP = 0# 函数返回RET = 1# 中断返回IRET = 2#STI = 3CLI = 4# 0011 1111HLT = 0x3f# 支持的指令INS_SUPPORT_LIST = {2: {# 这个地方不能用'MOV'字符串的keyMOV: {# 1. MOV A,5;(pin.AM_REG, pin.AM_INS): [pin.DST_W | pin.SRC_OUT,],# 2. MOV A,B;(pin.AM_REG, pin.AM_REG): [pin.DST_W | pin.SRC_R],# 3. MOV A,[5] or [0x12](pin.AM_REG, pin.AM_DIR): [pin.SRC_OUT | pin.MAR_IN,pin.RAM_OUT | pin.DST_W],# 4. MOV A,[B](pin.AM_REG, pin.AM_RAM): [pin.SRC_R | pin.MAR_IN,pin.RAM_OUT | pin.DST_W],# 5. MOV [5],5 or MOV [0x12],12(pin.AM_DIR, pin.AM_INS): [pin.DST_OUT | pin.MAR_IN,pin.RAM_IN | pin.SRC_OUT],# 6. MOV [5],A;(pin.AM_DIR, pin.AM_REG): [pin.DST_OUT | pin.MAR_IN,pin.RAM_IN | pin.SRC_R],# 7. MOV [5],[6](pin.AM_DIR, pin.AM_DIR): [pin.SRC_OUT | pin.MAR_IN,pin.T1_IN | pin.RAM_OUT,pin.DST_OUT | pin.MAR_IN,pin.RAM_IN | pin.T1_OUT],# 8. MOV [5],[A](pin.AM_DIR, pin.AM_RAM): [pin.SRC_R | pin.MAR_IN,pin.T1_IN | pin.RAM_OUT,pin.DST_OUT | pin.MAR_IN,pin.RAM_IN | pin.T1_OUT],# 9. MOV [A],5;(pin.AM_RAM, pin.AM_INS): [pin.DST_R | pin.MAR_IN,pin.RAM_IN | pin.SRC_OUT],# 10. MOV [A],B;(pin.AM_RAM, pin.AM_REG): [pin.DST_R | pin.MAR_IN,pin.RAM_IN | pin.SRC_R],# 11. MOV [A],[5](pin.AM_RAM, pin.AM_DIR): [pin.SRC_OUT | pin.MAR_IN,pin.RAM_OUT | pin.T2_IN,pin.DST_R | pin.MAR_IN,pin.RAM_IN | pin.T2_OUT],# 12. MOV [A],[B](pin.AM_RAM, pin.AM_RAM): [pin.SRC_R | pin.MAR_IN,pin.RAM_OUT | pin.T2_IN,pin.DST_R | pin.MAR_IN,pin.RAM_IN | pin.T2_OUT]},ADD: {# 1. ADD A,5;(pin.AM_REG, pin.AM_INS): [pin.DST_R | pin.A_IN,pin.SRC_OUT | pin.B_IN,pin.OP_ADD | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT],# 2. ADD A,B;(pin.AM_REG, pin.AM_REG): [pin.DST_R | pin.A_IN,pin.SRC_R | pin.B_IN,pin.OP_ADD | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT]},SUB: {# 1. SUB A,5;(pin.AM_REG, pin.AM_INS): [pin.DST_R | pin.A_IN,pin.SRC_OUT | pin.B_IN,pin.OP_SUB | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT],# 2. SUB A,B;(pin.AM_REG, pin.AM_REG): [pin.DST_R | pin.A_IN,pin.SRC_R | pin.B_IN,pin.OP_SUB | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT]},CMP: {# 1. CMP A,5;(pin.AM_REG, pin.AM_INS): [pin.DST_R | pin.A_IN,pin.SRC_OUT | pin.B_IN,pin.OP_SUB | pin.ALU_PSW],# 2. CMP A,B;(pin.AM_REG, pin.AM_REG): [pin.DST_R | pin.A_IN,pin.SRC_R | pin.B_IN,pin.OP_SUB | pin.ALU_PSW]},AND: {# 1. AND A,5;(pin.AM_REG, pin.AM_INS): [pin.DST_R | pin.A_IN,pin.SRC_OUT | pin.B_IN,pin.OP_AND | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT],# 2. AND A,B;(pin.AM_REG, pin.AM_REG): [pin.DST_R | pin.A_IN,pin.SRC_R | pin.B_IN,pin.OP_AND | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT]},OR: {# 1. OR A,5;(pin.AM_REG, pin.AM_INS): [pin.DST_R | pin.A_IN,pin.SRC_OUT | pin.B_IN,pin.OP_OR | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT],# 2. OR A,B;(pin.AM_REG, pin.AM_REG): [pin.DST_R | pin.A_IN,pin.SRC_R | pin.B_IN,pin.OP_OR | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT]},XOR: {# 1. XOR A,5;(pin.AM_REG, pin.AM_INS): [pin.DST_R | pin.A_IN,pin.SRC_OUT | pin.B_IN,pin.OP_XOR | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT],# 2. XOR A,B;(pin.AM_REG, pin.AM_REG): [pin.DST_R | pin.A_IN,pin.SRC_R | pin.B_IN,pin.OP_XOR | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT]}},1: {INC: {# INC Apin.AM_REG: [pin.DST_R | pin.A_IN,pin.OP_INC | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT]},DEC: {# DEC Apin.AM_REG: [pin.DST_R | pin.A_IN,pin.OP_DEC | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT]},NOT: {# NOT Apin.AM_REG: [pin.DST_R | pin.A_IN,pin.OP_NOT | pin.ALU_PSW | pin.DST_W | pin.ALU_OUT]},JMP: {# JMP aaaa;pin.AM_INS: [pin.DST_OUT | pin.PC_IN],},JO: {pin.AM_INS: [pin.DST_OUT | pin.PC_IN],},JNO: {pin.AM_INS: [pin.DST_OUT | pin.PC_IN],},JZ: {pin.AM_INS: [pin.DST_OUT | pin.PC_IN],},JNZ: {pin.AM_INS: [pin.DST_OUT | pin.PC_IN],},JP: {pin.AM_INS: [pin.DST_OUT | pin.PC_IN],},JNP: {pin.AM_INS: [pin.DST_OUT | pin.PC_IN],},PUSH: {# push 1,pin.AM_INS: [# 栈指针减1pin.SP_OUT | pin.A_IN,pin.OP_DEC | pin.SP_IN | pin.ALU_OUT,# 减一后的指针放到内存地址的低位pin.SP_OUT | pin.MAR_IN,# 堆栈的段指针放到内存地址的高位pin.SS_OUT | pin.MSR_IN,# 目标数写入到内存pin.DST_OUT | pin.RAM_IN,# 代码段0写到内存地址高位,表示切换到代码段执行pin.CS_OUT | pin.MSR_IN,],pin.AM_REG: [pin.SP_OUT | pin.A_IN,pin.OP_DEC | pin.SP_IN | pin.ALU_OUT,pin.SP_OUT | pin.MAR_IN,pin.SS_OUT | pin.MSR_IN,# 寄存器寻址和立即数区别,在于立即数是直接输出数据到总线,而寄存器寻址是读取寄存器内值输出到总线pin.DST_R | pin.RAM_IN,# 代码段0写到内存地址高位,表示切换到代码段执行pin.CS_OUT | pin.MSR_IN,],},POP: {pin.AM_REG: [# 栈指针指向内存地址地位pin.SP_OUT | pin.MAR_IN,# 栈段指向内存地址高位pin.SS_OUT | pin.MSR_IN,# 将内存栈顶的值读取到目标寄存器pin.DST_W | pin.RAM_OUT,# 将栈指针加一pin.SP_OUT | pin.A_IN,pin.OP_INC | pin.SP_IN | pin.ALU_OUT,# 代码段0写到内存地址高位,表示切换到代码段执行pin.CS_OUT | pin.MSR_IN,],},CALL: {# call showpin.AM_INS: [# 栈指针减1pin.SP_OUT | pin.A_IN,pin.OP_DEC | pin.SP_IN | pin.ALU_OUT,# 减一后的指针放到内存地址的低位pin.SP_OUT | pin.MAR_IN,# 栈段指针放到内存地址的高位pin.SS_OUT | pin.MSR_IN,# pc写入到内存栈中,保存起来pin.PC_OUT | pin.RAM_IN,# 将目标指令行写入到pc,准备执行pin.DST_OUT | pin.PC_IN,# 代码段0写到内存地址高位,表示切换到代码段执行pin.CS_OUT | pin.MSR_IN,]},INT: {# int show 中断调用pin.AM_INS: [# 栈指针减1pin.SP_OUT | pin.A_IN,pin.OP_DEC | pin.SP_IN | pin.ALU_OUT,# 减一后的指针放到内存地址的低位pin.SP_OUT | pin.MAR_IN,# 栈段指针放到内存地址的高位pin.SS_OUT | pin.MSR_IN,# pc写入到内存栈中,保存起来pin.PC_OUT | pin.RAM_IN,# 将目标指令行写入到pc,准备执行pin.DST_OUT | pin.PC_IN,# 代码段0写到内存地址高位,表示切换到代码段执行。并且关闭中断位写入PSWpin.CS_OUT | pin.MSR_IN | pin.ALU_PSW | pin.ALU_CLI,]},},0: {NOP: [pin.CYC],RET: [# 栈指针指向内存地址地位pin.SP_OUT | pin.MAR_IN,# 栈段指向内存地址高位pin.SS_OUT | pin.MSR_IN,# 将内存栈顶的值读取到PCpin.PC_IN | pin.RAM_OUT,# 将栈指针加一pin.SP_OUT | pin.A_IN,pin.OP_INC | pin.SP_IN | pin.ALU_OUT,# 代码段0写到内存地址高位,表示切换到代码段执行pin.CS_OUT | pin.MSR_IN,],IRET: [# 栈指针指向内存地址地位pin.SP_OUT | pin.MAR_IN,# 栈段指向内存地址高位pin.SS_OUT | pin.MSR_IN,# 将内存栈顶的值读取到PCpin.PC_IN | pin.RAM_OUT,# 将栈指针加一pin.SP_OUT | pin.A_IN,pin.OP_INC | pin.SP_IN | pin.ALU_OUT,# 代码段0写到内存地址高位,表示切换到代码段执行。并且允许中断并写入PSWpin.CS_OUT | pin.MSR_IN | pin.ALU_PSW | pin.ALU_STI,],STI: [pin.ALU_PSW | pin.ALU_STI],CLI: [pin.ALU_PSW | pin.ALU_CLI],HLT: [pin.HLT]}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。