Skip to content

Instantly share code, notes, and snippets.

@WakkyFree
Created January 26, 2022 13:04
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 WakkyFree/ec96668c186c5851a5726994ed05cff9 to your computer and use it in GitHub Desktop.
Save WakkyFree/ec96668c186c5851a5726994ed05cff9 to your computer and use it in GitHub Desktop.
32bir assembler for the assembly language defined in https://www.coronasha.co.jp/np/isbn/9784339029062/
# This is the assembler for the assembly language defined in https://www.coronasha.co.jp/np/isbn/9784339029062/
import sys
def p_b(digits, num):
num_int = int(num)
if(num_int > 0):
print(format(num_int, 'b').zfill(digits), end = "", file=fw)
else:
print(format(num_int & 0xffff, 'b').zfill(digits), end = "", file=fw)
def p_r3(rd, rs, rt):
p_b(5, rs.replace('r', ''))
p_b(5, rt.replace('r', ''))
p_b(5, rd.replace('r', ''))
def p_r2i(rt, rs):
p_b(5, rs.replace('r', ''))
p_b(5, rt.replace('r', ''))
def p_r2b(rs, rt):
p_b(5, rs.replace('r', ''))
p_b(5, rt.replace('r', ''))
def base(addr):
return addr.replace('(','').replace(')','')
def dpl(addr):
return addr.replace('(','').replace(')','')
# check labels
f = open(sys.argv[1], 'r')
line_num = 0
labels = []
for line in f:
instruction = line.replace(',', '').replace('\t', '').replace('\s', '').replace(':', ' :').replace('\n', '').split()
if(instruction[1] == ':'):
labels.append([instruction[0], line_num]) # [label, line number]
line_num += 1
f.close()
# translate into machine code
f = open(sys.argv[1], 'r')
fw = open('machine_code.txt', 'w')
line_num = 0
field = []
for line in f:
instruction = line.replace(',', '').replace('\t', '').replace('\s', '').replace(':', ' :').replace('\n', '').split()
while len(instruction) <= 6:
instruction.append([])
if(instruction[1] == ':'):
op = instruction[2]
f2 = instruction[3]
f3 = instruction[4]
f4 = instruction[5]
f5 = instruction[6]
else:
op = instruction[0]
f2 = instruction[1]
f3 = instruction[2]
f4 = instruction[3]
f5 = instruction[4]
#print (line_num + 1, end = ':', file=fw)
if (op == 'add'):
p_b(6,0)
p_r3(f2, f3, f4)
p_b(11, 0)
elif (op == 'addi'):
p_b(6,1)
p_r2i(f2, f3)
p_b(16, f4)
elif (op == 'sub'):
p_b(6,0)
p_r3(f2, f3, f4)
p_b(11, 2)
elif (op == 'lui'):
p_b(6,3)
p_r2i(f2, 'r0')
p_b(16, f3)
elif (op == 'and'):
p_b(6,0)
p_r3(f2, f3, f4)
p_b(11, 8)
elif (op == 'andi'):
p_b(6,4)
p_r2i(f2, f3)
p_b(16, f4)
elif (op == 'or'):
p_b(6,0)
p_r3(f2, f3, f4)
p_b(11, 9)
elif (op == 'ori'):
p_b(6,5)
p_r2i(f2, f3)
p_b(16, f4)
elif (op == 'xor'):
p_b(6,0)
p_r3(f2, f3, f4)
p_b(11, 10)
elif (op == 'xori'):
p_b(6,6)
p_r2i(f2, f3)
p_b(16, f4)
elif (op == 'nor'):
p_b(6,0)
p_r3(f2, f3, f4)
p_b(11, 11)
elif (op == 'sll'):
p_b(6,0)
p_r3(f2, f3, 'r0')
p_b(5, f4)
p_b(6, 16)
elif (op == 'srl'):
p_b(6,0)
p_r3(f2, f3, 'r0')
p_b(5, f4)
p_b(6, 17)
elif (op == 'sra'):
p_b(6,0)
p_r3(f2, f3, 'r0')
p_b(5, f4)
p_b(6, 18)
elif (op == 'lw'):
p_b(6,16)
p_r2i(f2, base(f4))
p_b(16, dpl(f3))
elif (op == 'lh'):
p_b(6,18)
p_r2i(f2, base(f4))
p_b(16, dpl(f3))
elif (op == 'lb'):
p_b(6,20)
p_r2i(f2, base(f4))
p_b(16, dpl(f3))
elif (op == 'sw'):
p_b(6,24)
p_r2i(f2, base(f4))
p_b(16, dpl(f3))
elif (op == 'sh'):
p_b(6,26)
p_r2i(f2, base(f4))
p_b(16, dpl(f3))
elif (op == 'sb'):
p_b(6,28)
p_r2i(f2, base(f4))
p_b(16, dpl(f3))
elif (op == 'beq'):
p_b(6,32)
p_r2b(f2, f3)
for label in labels:
if f4 in label[0]:
p_b(16, label[1]-line_num-1)
break
elif (op == 'bne'):
p_b(6,33)
p_r2b(f2, f3)
for label in labels:
if f4 in label[0]:
p_b(16, label[1]-line_num-1)
break
elif (op == 'blt'):
p_b(6,34)
p_r2b(f2, f3)
for label in labels:
if f4 in label[0]:
p_b(16, label[1]-line_num-1)
break
elif (op == 'ble'):
p_b(6,35)
p_r2b(f2, f3)
for label in labels:
if f4 in label[0]:
p_b(16, label[1]-line_num-1)
break
elif (op == 'j'):
p_b(6,40)
for label in labels:
if f2 in label[0]:
p_b(26, label[1])
break
elif (op == 'jal'):
p_b(6,41)
for label in labels:
if f2 in label[0]:
p_b(26, label[1])
break
elif (op == 'jr'):
p_b(6,42)
p_r3('r0', f2, 'r0')
p_b(11, 0)
else:
print('ERROR:Illegal Instruction')
print('', file=fw)
line_num += 1
f.close()
fw.close()
print('Translation is completed')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment