Skip to content

Instantly share code, notes, and snippets.

@dbwodlf3
Last active August 19, 2018 10:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dbwodlf3/cc22274f55118f7c8c482c460bd30183 to your computer and use it in GitHub Desktop.
Save dbwodlf3/cc22274f55118f7c8c482c460bd30183 to your computer and use it in GitHub Desktop.
Simple 16bit CPU Assembler
import sys
#주먹구구식.. 일단은 돌아가게 만들었다.
#Token 정의하기!
##Instruction Identifer
IID = {
"no":"0",
"alu+":"1",
"alu-":"2",
"alu*":"3",
"alu/":"4",
"sr":"5",
"lr":"6",
"sm":"7",
"lm":"8",
"jp":"9",
"beq":"a",
"bgt":"b",
"rsv":"c",
}
##Register Identifier
RID = {
"r0":"0",
"r1":"1",
"r2":"2",
"r3":"3",
"r4":"4",
"r5":"5",
"r6":"6",
"r7":"7",
"r8":"8",
"r9":"9",
"r10":"a",
"r11":"b",
"r12":"c",
"r13":"d",
"r14":"e",
"r15":"f",
}
##validTokens
validTokens = list(IID) + list(RID)
#파일 읽어오기!
OriginalFile = sys.argv[1]
f = open(OriginalFile, "r", encoding="utf-8")
text = f.readlines()
f.close
#필요없는 문자들 지우기.
##줄바꿈 지우기.
text2 = text
while True:
try:
text2.remove("\n")
except:
break
## 각 명령어 끝의 줄바꿈 문자 지우기.
text2 = [x.strip("\n") for x in text2]
## 주석 지우기
text2 = [x for x in text2 if x[0] != "#"]
#분석을 위해서 Token화 시키기.
##한줄의 명령어를 토큰화 시키기.
Tokens = [x.split(" ") for x in text2]
##필요없는 ,문자 없애버리기.
Tokens = [ [x.strip(",") for x in group] for group in Tokens]
#정의 되지 않은 Token이 있는지 확인하기.
for i in Tokens:
pass
for j in i:
if not j in validTokens:
try:
int(j)
except:
print("인식할 수 없는 문자!"," ",j)
raise SystemExit
#Syntax가 유효한지 확인하기!
##alu 명령!
def aluCheck(x):
if not x[1] in RID and x[2] in RID and x[3] in RID:
print("Syntax Error!", end=": ")
print(i)
return -1
return 0
##sr, lr 명령!
def srlrCheck(x):
if not x[1] in RID:
print("Syntax Error!", end=": ")
print(i)
return -1
return 0
##sm, lm 명령!
def smlmCheck(x):
try:
if int(x[1]) > int("0xfff",16) or int(x[1]) < 0:
print("Syntax Error!", end=": ")
print(i)
except:
print("Syntax Error!", end=": ")
print(i)
return -1
return 0
##jp 명령!
def jpCheck(x):
if not x[1] in RID:
print("Syntax Error!", end=": ")
print(i)
return -1
return 0
##beq, bgt 명령!
def beqbgtCheck(x):
if not x[1] in RID and x[2] in RID and x[3] in RID:
print("Syntax Error!", end=": ")
print(i)
return -1
return 0
##rsv 명령!
def rsvCheck(x):
try:
if int(x[2]) > int("0xff",16) or int(x[2]) < 0:
print("rsv value out of range!", end=": ")
print(i)
except:
print("Syntax Error!", end=": ")
print(i)
return -1
return 0
##검사하기!
for i in Tokens:
if i[0] in ["alu+","alu-","alu*","alu/"]:
if len(i) != 4:
print("Syntax Error!", end=": ")
print(i)
aluCheck(i)
continue
if i[0] in ["sr","lr"]:
if len(i) != 2:
print("Syntax Error!", end=": ")
print(i)
srlrCheck(i)
continue
if i[0] in ["sm","lm"]:
if len(i) != 2:
print("Syntax Error!", end=": ")
print(i)
smlmCheck(i)
continue
if i[0] in ["jp"]:
if len(i) != 2:
print("Syntax Error!", end=": ")
print(i)
jpCheck(i)
continue
if i[0] in ["beq","bgt"]:
if len(i) != 4:
print("Syntax Error!", end=": ")
print(i)
beqbgtCheck(i)
continue
if i[0] in ["rsv"]:
if len(i) != 3:
print("Syntax Error!", end=": ")
print(i)
rsvCheck(i)
continue
#번역하기!
##저장할 파일의 이름을 지정하고, 파일 열기!
k = OriginalFile.find(".")
if not -1 == OriginalFile.find("."):
transfName = OriginalFile[:k] + "Translated"
else:
transfName = OriginalFile + "Translated"
transf = open(transfName,"w")
transf.write("v2.0 raw\n")
##번역하기!
for i in Tokens:
if i[0] in ["lm","sm"]:
transf.write(IID[i[0]])
if int(i[1]) <= int("0xf",16):
transf.write("00")
transf.write(hex(int(i[1]))[2:])
elif int(i[1]) <= int("0xff",16):
transf.write("0")
transf.write(hex(int(i[1]))[2:])
elif int(i[1]) <= int("0xfff",16):
transf.write(hex(int(i[1]))[2:])
transf.write("\n")
continue
elif i[0] in ["rsv"]:
transf.write(IID[i[0]])
transf.write(RID[i[1]])
if int(i[2]) <= int("0xf",16):
transf.write("0")
transf.write(hex(int(i[2]))[2:])
else:
transf.write(hex(int(i[2]))[2:])
transf.write("\n")
continue
elif i[0] in ["jp", "sr", "lr"]:
transf.write(IID[i[0]])
transf.write(RID[i[1]])
transf.write("00")
transf.write("\n")
continue
for j in i:
try:
transf.write(IID[j])
except:
transf.write(RID[j])
transf.write("\n")
transf.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment