codigo
unknown
plain_text
2 years ago
6.9 kB
8
Indexable
import argparse
class Interpretador:
def __init__(self,verbose=False,enderecos_memoria=8):
self.verbose = verbose
self.__TAMANHO_BLOCO_MEMORIA_BITS = 32
self.registradores = None
self.memoria = None
self.numero_enderecos_memoria = 2**enderecos_memoria
self.memoria = None
self.resetaRegisradores()
self.resetaMemoria()
if self.verbose:
self.statusSistema()
self.gotos = {}
def converteHexToDec(self,hex_):
if '0x' not in hex_:
raise Exception("ERRO DE INTERPRETACAO: Numero (%s) hexadecimal invalido" % hex_)
hex_ = list(hex_)
hex_ = hex_[2:]
decimal = 0
for i in range(len(hex_)):
if hex_[i] in 'abcdef':
hex_[i] = str(int(ord(hex_[i])-97)+10)
decimal += (int(hex_[i])*(16**(len(hex_)-1-i)))
return decimal
def __linhaInValida__(self,linha):
if len(linha) == 0 or list(linha)[-1] == ' ' or list(linha)[-1] == '\t':
return True
return False
def __interpretagoto(self,arquivo_linhas):
for index in range(len(arquivo_linhas)):
linha = arquivo_linhas[index].strip()
if self.__linhaInValida__(linha):
#print('nao processado ',linha)
continue
if linha[0].isupper() and linha[-1] == ':':
self.gotos[linha[0:-1]] = index
def interpreta(self,arquivo):
#asm_code = open(arquivo).read().split('\n')
self.__interpretagoto(arquivo)
index = 0
while index < len(asm_code):
linha = asm_code[index].strip()
if len(linha) == 0 or linha[0] == '#':
index += 1
continue
if self.verbose:
print('INTERPRETANDO LINHA %d -> %s' % (index,linha))
if 'db' in linha:
if '#REG' in linha:
print(linha.split('#REG')[0])
self.imprimeRegistros()
elif '#MEM' in linha:
print(linha.split('#MEM')[0])
self.imprimeMemoria()
elif '#VET' in linha:
endereco = linha.split('#VET')[1].split()
self.imprimeVetor(endereco[0],endereco[1])
else:
print(' '.join(linha.split()[1:])+'\n')
elif len(linha.split()) == 3:
reg1 = linha.split()[1][0:-1]
reg2 = linha.split()[2]
if 'lui' in linha:
self.registradores[reg1] = reg2
elif linha[1] == 'w':
endereco = reg2
incremento = endereco.split('(')[0]
if incremento[0] == 'x':
incremento = self.registradores[incremento]
reg2_endereco = endereco.split('(')[1].split(')')[0]
if 'sw' in linha:
self.comando_SW(reg1,int(incremento),self.registradores[reg2_endereco])
elif 'lw' in linha:
self.comando_LW(reg1,endereco)
elif len(linha.split()) == 4:
reg1 = linha.split()[1][0:-1]
reg2 = linha.split()[2][0:-1]
reg3 = linha.split()[3]
if 'addi' in linha:
self.commando_ADDI(reg1,reg2,reg3)
elif 'add' in linha:
self.comando_ADD(reg1,reg2,reg3)
elif 'sub' in linha:
self.comando_SUB(reg1,reg2,reg3)
elif linha[0] == 'b':
goto_name = reg3
if 'beq' in linha: #X == Y
if int(self.registradores[reg1]) == int(self.registradores[reg2]):
index = self.gotos[goto_name]
elif 'bne' in linha: #Y != X
if int(self.registradores[reg1]) != int(self.registradores[reg2]):
index = self.gotos[goto_name]
elif 'blt' in linha:
if int(self.registradores[reg1]) < int(self.registradores[reg2]):
index = self.gotos[goto_name]
elif 'bge' in linha:
if int(self.registradores[reg1]) >= int(self.registradores[reg2]):
index = self.gotos[goto_name]
elif len(linha.split()) == 1 and ':' not in linha:
index = self.gotos[linha.strip()]
index += 1
if self.verbose:
self.statusSistema()
def e_endereco(self,reg):
if 'x' in self.registradores[reg]:
return True
return False
def __ACESSA__(self,endereco):
incremento = endereco.split('(')[0]
endereco = self.registradores[endereco.split('(')[1].split(')')[0]]
if incremento[0] == 'x':
incremento = self.registradores[incremento]
return self.memoria[hex(self.converteHexToDec(endereco)+(int(incremento)//4))]
def comando_ADD(self,reg1,reg2,reg3):
if self.e_endereco(reg2) or self.e_endereco(reg3):
print('Nao e permitido operacao aritmetica com enderecos')
raise Exception()
self.registradores[reg1] = str(int(self.registradores[reg2])+int(self.registradores[reg3]))
def comando_SUB(self,reg1,reg2,reg3):
if self.e_endereco(reg2) or self.e_endereco(reg3):
print('Nao e permitido operacao aritmetica com enderecos')
raise Exception()
self.registradores[reg1] = str(int(self.registradores[reg2])-int(self.registradores[reg3]))
def commando_ADDI(self,reg1,reg2,numero):
if self.e_endereco(reg2):
print('Nao e permitido operacao aritmetica com enderecos')
raise Exception()
self.registradores[reg1] = str(int(self.registradores[reg2])+int(numero))
def comando_LUI(self,reg1, numero):
self.registradores[reg1] = numero
def comando_SW(self,reg1,incremento,endereco):
self.memoria[hex(self.converteHexToDec(endereco)+incremento//4)] = self.registradores[reg1]
def comando_LW(self,reg1,endereco):
self.registradores[reg1] = self.__ACESSA__(endereco)
def resetaRegisradores(self):
self.registradores = dict([('x%d' % d, '0' if d == 0 else None) for d in range(32)])
def resetaMemoria(self):
self.memoria = dict([(hex(i),'') for i in range(self.numero_enderecos_memoria)])
def imprimeRegistros(self):
print('\n======================================')
print('---- Status dos registradores ---------')
for reg, dado in self.registradores.items():
if dado != None:
print('REG[%s] = %s' % (reg,dado))
def imprimeMemoria(self):
print('\n\n---- Status da memoria ---')
print('INICIO: 0x0000')
print('FINAL: 0xffff')
print('ARMAZENAMENTO: %d bytes' % ((self.__TAMANHO_BLOCO_MEMORIA_BITS)*[i != '' for i in self.memoria.values()].count(True)/8))
memoria_vazia = True
for endereco, dado in self.memoria.items():
if dado != '':
print('ENDERECO[%s] = %s' % (endereco,dado))
memoria_vazia = False
def imprimeVetor(self,endereco,tamanho):
vetor = []
for i in range(int(tamanho)):
mem = self.memoria[hex(self.converteHexToDec(endereco)+i)]
if mem == '':
vetor.append('VAZIA')
else:
vetor.append(mem)
print(vetor)
def statusSistema(self):
self.imprimeRegistros()
self.imprimeMemoria()
# argumentos = argparse.ArgumentParser('Interpretador RISC-V')
# argumentos.add_argument('--asm',type=str,help="nome do arquivo a ser interpretado")
# argumentos.add_argument('--verbose',type=int,help="Mensagens")
# args = argumentos.parse_args()
# I = Interpretador(args.verbose)
# I.interpreta(args.asm)
# #I.statusSistema()
# #print(I.converteHexToDec(hex(1000)))
Editor is loading...
Leave a Comment