清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#! -*- coding:utf8 -*- # Author: L****** # StudentNumber: 514******* # Class: F14***** # Time: 2014/10/25 21:30:23 # Prog: Simple translator of assembly language designed from sys import argv def tran(filename,targetname): global var global lab global base,entry global legalop legalop={"lm":"1","lb":"2","j":"B","and":"8","or":"7","xor":"9","rot":"A","halt":"C","addc":"5","addf":"6","mov":""} var,lab={},{} base,entry=0,0 def legalreg(w): return 0<=w<8 def legalmem(w): return 0<=w<256 def delcomment(s): if s.find(";")!=-1: return s[:s.find(";")] return s def genelegal(s): for c in s: if not ("0"<=c<="9") and not ("a"<=c<="z") and not ("A"<=c<="Z") and not (c=='_'): raise ValueError("'{0}' is illegal".format(s)) if s=="": return False return True def getlabel(s): if s.find(":")!=-1: w=delprespace(s[:s.find(":")]) for c in w: if not ("0"<=c<="9") and not ("a"<=c<="z") and not ("A"<=c<="Z"): raise ValueError("in '{0}' , Label is illegal".format(w)) return w return "" def delprespace(s): for i in range(len(s)): if s[i]!=" ": return s[i:] return "" def delpostspace(s): for i in range(len(s)-1,-1,-1): if s[i]!=" ": return s[:i+1] return "" def deledgespace(s): ss=delprespace(delpostspace(s)) return ss def part(s): s2=delprespace(s) if s2.find(" ")==-1: return s2 else: return(s2[:s2.find(" ")]) def nextpart(s): if s.find(" ")==-1: return "" else: return part(s[s.find(" "):]) def getbody(s): if s.find(":")==-1: return s else: return(delprespace(s[s.find(":")+1:])) def check(para,num,*typ): global var,lab if len(para)!=num: return False for i in range(num): if typ[i]=="reg": if not legalreg(int(para[i])) or len(para[i])!=1: return False elif typ[i]=="val": if (para[i].lower() not in var) and (not legalmem(int(para[i],16)) or len(para[i])!=2) : return False elif typ[i]=="addr": if (para[i].lower() not in lab) and ( not legalmem(int(para[i],16)) or len(para[i])!=2): return False return True def checkpara(h,para): checkpara=True if h in ("lm","lb"): checkpara=checkpara and check(para,2,"reg","val") if h=="mov": checkpara=checkpara and (check(para,2,"reg","val") or check(para,2,"reg","reg")) if h in ("addc","addf","or","and","xor"): checkpara=checkpara and ((check(para,3,"reg","reg","reg") or check(para,2,"reg","reg"))) if h=="rot": checkpara=checkpara and check(para,2,"reg","reg") if h=="j": checkpara=checkpara and (check(para,2,"reg","addr") or check(para,1,"addr")) if h=="halt": checkpara=checkpara and check(para,0) def var2num(s): global var if s in var: return var[s] else: return int(s,16) def lab2num(s): global lab if s in lab: return lab[s] else: return int(s,16) def process(ff,h,para): global legalop global var global label checkpara(h,para) if h!="mov": ff.write(legalop[h]) else: if check(para,2,"reg","val"): ff.write("3") else: ff.write("4") if h in ("lm","lb"): ff.write("{0}{1:0>2x}".format(para[0],var2num(para[1]))) if h=="mov": if check(para,2,"reg","val"): ff.write("{0}{1:0>2x}".format(para[0],var2num(para[1]))) else: ff.write("{0}{1}".format(para[0],para[1])) if h in ("addc","addf","or","and","xor"): if check(para,2,"reg","reg"): ff.write("{0}{1}{2}".format(para[0],para[0],para[1])) else: ff.write("{0}{1}{2}".format(para[0],para[1],para[2])) if h=="rot": ff.write("{0}0{1}".format(para[0],para[1])) if h=="j": if check(para,1,"addr"): ff.write("0{0:0>2x}".format(lab2num(para[0]))) else: ff.write("{0}{1:0>2x}".format(para[0],lab2num(para[1]))) if h=="halt": ff.write("000") ff.write("\n") def scan1(): global var global lab global base,entry f=open(filename,"r") raw=" "; datap=False codep=False while len(raw): raw=f.readline() s=delprespace(delcomment(raw)).replace("\n","") if s!="": # print("'"+part(s).lower()+"'") # print(len(nextpart(s))) if codep and s!="": now+=2 if deledgespace(s).lower()==".data": if datap or codep or len(nextpart(s)): raise ValueError(".DATA Declaration Error in {0}".format(s)) else: datap=True if deledgespace(s).lower()==".code": if codep or len(nextpart(s)): raise ValueError(".CODE Declaration Error in {0}".format(s)) else: codep=True datap=False now=0 print("ok") if part(deledgespace(s).lower())==".entry": if not codep: raise ValueError(".ENTRY Declaration Error in {0}".format(s)) else: entry=int(nextpart(s),16) if not legalmem(entry): raise ValueError("illegal Entry {0} in {1}".format(entry,s)) if part(deledgespace(s).lower())==".base": if not codep or base or now!=2: raise ValueError(".BASE Declaration Error in {0}".format(s)) else: base=int(nextpart(s),16) entry=base if not legalmem(base): raise ValueError("illegal base {0} in {1}".format(base,s)) now=base-2 if datap and deledgespace(s).lower()!=".data": if s.find(" ")==-1: return ValueError("Illegal data declaration in {}".format(s)) first=part(s) if first in var or not genelegal(first) or first.isdigit(): raise ValueError("{0} is declared twice or illegal in {1}".format(first,s)) second=int(nextpart(s),16) if not legalmem(second): raise ValueError("Illegal address {0} in {1}".format(second,s)) else: var[first.lower()]=second if codep and deledgespace(s).lower()!=".code" and deledgespace(s).lower()!=".entry" and deledgespace(s).lower()!=".base" and deledgespace(s).lower()!=".code": # print(":::",s) if genelegal(getlabel(s).lower()): lab[getlabel(s).lower()]=now f.close() def scan2(): global var global lab global base,entry global legalop f=open(filename,"r") raw=" "; ff=open(targetname,"w") codep=False while len(raw): raw=f.readline() s=delprespace(delcomment(raw)).replace("\n","") if s!="": # print("'"+part(s).lower()+"'") # print(len(nextpart(s))) if codep and s!="": now+=2 if part(s).lower()==".code": if codep or len(nextpart(s)): raise ValueError(".CODE Declaration Error in {0}".format(s)) else: codep=True datap=False now=0 print("ok") if part(s).lower()==".base": # if not codep or base or now!=2: # raise ValueError(".BASE Declaration Error in {0}".format(s)) # else: # base=int(nextpart(s)) # if not legalmem(base): # raise ValueError("illegal base {0} in {1}".format(base,s)) now=base-2 if codep and part(s).lower()!=".code" and part(s).lower()!=".base" and part(s).lower()!=".entry": ss=getbody(s) h=part(ss).lower() if h not in legalop: raise ValueError("Illegal operator {0} in {1}".format(part(ss),s)) print("{0:<3x}".format(now),"|",ss) para=ss[ss.find(" ")+1:].split(",") for i in range(len(para)): para[i]=deledgespace(para[i]).lower() process(ff,h,para) ff.close() f.close() scan1() print(lab) print(base) scan2() def main(): helps="Translator from SimpleBasic to machine language\n\ Version 0.1 2014/10/25 L** *****\n\ ---------------------------------------------------\n\ Usage:\n\ translator inputfile outputfile" print(argv) if len(argv)==1: print(helps) if len(argv)!=3: print("there must be two parameters!") s1=input("请输入源汇编文件文件:") s2=input("请输入输出机器语言文件地址:") tran(s1,s2) else: tran(argv[1],argv[2]) if __name__=="__main__": main()