Last active
August 19, 2018 10:48
-
-
Save dbwodlf3/cc22274f55118f7c8c482c460bd30183 to your computer and use it in GitHub Desktop.
Simple 16bit CPU Assembler
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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