def __init__(self): self.root = Tk() self.root.title("psm Interpreter(" + filename + ")") self.def_color = self.root["bg"] self.is_changing = False self.IsHexVar = IntVar(self.root) self.IsHexVar.set(0) self.IsHexVar.trace("w",lambda *args:self.redraw()) center_on_instruc_var = IntVar(self.root) self.mem_reg_frame = Frame(self.root) self.reg_g = RegisterGraphics(self.mem_reg_frame,self.IsHexVar) regs = self.registers() self.mem_g = GUI_Memory(regs["rSP"],self.mem_reg_frame,self.IsHexVar,center_on_instruc_var) self.inter_frame = Frame(self.root) self.state = GUI_State(self.inter_frame,self,regs["rBP"],regs["rIP"]) self.cons_g = ConsoleGraphic(self.inter_frame) self.label_locs,exprs,to_fnum = psm_parser.parse_all(flines,regs,self.state,self.cons_g,self.mem_g) self.text_g = TextGraphic(self.root,to_fnum,self.label_locs,center_on_instruc_var) init_all(self.registers(),self.mem_g,self.state,self.label_locs,exprs,to_fnum) self.pack()
def __init__(self,*args): ProgramState.__init__(self,*args) self.breaks = set() def upon_exit(self): restart() def is_break(self): instruc = self.rIP.val.int return instruc in self.breaks or instruc == self.next_break regs = {name:TextRegister(name) for name in reg_name_list} mem = TextMemory(regs["rSP"]) state = TextState(regs["rBP"],regs["rIP"]) cons = TextConsole() label_locs,exprs,to_fnum = psm_parser.parse_all(flines,regs,state,cons,mem) init_all(regs,mem,state,label_locs,exprs,to_fnum) to_unum = {inum:fnum + 1 for inum,fnum in to_fnum.items()} to_inum = {unum:inum for inum,unum in to_unum.items()} def restart(): init_all(regs,mem,state,label_locs,exprs,to_fnum) restart() keyword = "" while keyword != "quit": InCode = input() CodeChain = InCode.split()
""" produces an filename.s file with x86 instructions that can be compiled with gcc and lib.s. """ from interp_core import * import psm_parser import subprocess from platform_check import * regs = {name:Register(name)for name in reg_name_list} label_locs,comp_lines,to_fnum = psm_parser.parse_all(flines,regs,ProgramState(regs["rBP"],regs["rIP"]),object(),Memory(regs["rSP"])) reduced_filename = filename[:filename.index(".")] assembly_filename = reduced_filename + ".s" file = open(assembly_filename,"w") #necessary gcc framework main_name = "main" if is_gcc() else "_main" file.write(".globl " + main_name + "\n") #map from comp_lines indices to label names loc_labels = {num - start_rIP:name for name,num in label_locs.items()} for n,line in enumerate(comp_lines): if n in loc_labels: lab_name = main_name if loc_labels[n] == "main" else loc_labels[n] file.write(lab_name + ":\n") file.write(line.to_x86() + "#" + flines[to_fnum[n + start_rIP]].strip() + "\n")