基础汇编->机器语言翻译器

基础汇编->机器语言翻译器,第1张

概述基础汇编->机器语言翻译器

下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。

内存溢出小编现在分享给大家,也给大家做个参考。

#! -*- 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 argvdef 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,"val") or check(para,"reg"))		if h in ("addc","addf","or","and","xor"):			checkpara=checkpara and ((check(para,3,"reg") or check(para,"reg")))		if h=="rot":			checkpara=checkpara and check(para,"reg")		if h=="j":			checkpara=checkpara and (check(para,"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,"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,"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","xor"):			if check(para,"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,"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,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()											

以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

总结

以上是内存溢出为你收集整理的基础汇编->机器语言翻译器全部内容,希望文章能够帮你解决基础汇编->机器语言翻译器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1198650.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存