Commit cfea281f0f3652ddf563a0ea67cf4c0ebff08bac

Authored by Ozunaki
1 parent 2230d45a

programa

Showing 1 changed file with 352 additions and 0 deletions
practica4.py 0 → 100644
  1 +#!/usr/bin/env python
  2 +# -*- coding: utf-8 -*-
  3 +cont=0
  4 +archivo=open('practica4.asm','r')
  5 +inst=open('P4ASM.INST','w')
  6 +err=open('P4ASM.ERR','w')
  7 +tabsim=open('TABSIM.txt','w')
  8 +tabsim.write('ETIQUETA VALOR')
  9 +tabsim.write('\n-------------------------------------------')
  10 +bandera=0
  11 +
  12 +caracteres=['|','!','#','$','%','&','/','(',')','=','¡','¿',';','.',':','-','{','[','+','*',']','}']
  13 +caracterescodop=['|','!','#','$','%','&','/','(',')','=','¡','¿',';',':','-','{','[','+','*',']','}']
  14 +caracter=['!','&','/','(',')','=','?','{','}','¡','.','¿']
  15 +print 'LINEA CONTLOC ETQ CODOP OPER MODOS'
  16 +print '.............................................................................................'
  17 +inst.write('LINEA CONTLOC ETQ CODOP OPER MODOS')
  18 +inst.write('\n.................................................\n')
  19 +mnemonico=['ORG','equ','LDAA','SWI','DS.b','sWI','sWi','BRA','ADCA','ABA','LBRA','db', 'dc.b', 'fcb','DB', 'DC.B', 'FCB','dw', 'dc.w', 'fdb','DW', 'DC.W', 'FDB','DS','DS.B','RMB','DS.W','RMW','fcc','FCC']
  20 +mnem=len(mnemonico)
  21 +conloc=0
  22 +
  23 +
  24 +
  25 +def conloco(codop,operando,etiqueta):
  26 + global conloc
  27 + if codop=='ORG' or codop=='org':
  28 + conloc=int(operando)
  29 + DirectivasdeconstantesDeunbyte=['db', 'dc.b', 'fcb','DB', 'DC.B', 'FCB']#incrementa 1 el conloc
  30 + DirectivasdeconstantesDedosbytes=['dw', 'dc.w', 'fdb','DW', 'DC.W', 'FDB']#incrementa 2 elconloc
  31 + #fcc incrementa el conloc con la longitud del operando
  32 + DirectivasdereservadeespacioenmemoriaDeunbyte=['DS','DS.B','RMB']#Incrementa el CONTADOR DE LOCALIDADES con el valornumérico del OPERANDO
  33 + DirectivasdereservadeespacioenmemoriaDedosbyte=['DS.W','RMW']#Incrementa el CONTADOR DE LOCALIDADES con eldoble del valor numérico del OPERANDO
  34 + if codop in DirectivasdeconstantesDeunbyte:
  35 + conloc+=1
  36 + elif codop in DirectivasdeconstantesDedosbytes:
  37 + conloc+=2
  38 + elif codop=='FCC' or codop=='fcc' and operando!='NULL':
  39 + if operando[operando.index('\"')]=='\"' and operando[len(operando)-1]=='\"':
  40 + conloc+=len(operando[operando.index('\"')+1:len(operando)-1])
  41 + else:
  42 +
  43 + conloc+=len(operando)
  44 + elif codop in DirectivasdereservadeespacioenmemoriaDeunbyte and operando!='NULL':
  45 + if '#' in operando:
  46 + conloc+=int(operando[1:len(operando)-1])
  47 + elif '$' in operando:
  48 + conloc+=hex(operando[1:len(operando)-1])
  49 + elif '%' in operando:
  50 + conloc+=bin(operando[1:len(operando)-1])
  51 + elif '@' in operando:
  52 + conloc+=oct(operando[1:len(operando)-1])
  53 + else:
  54 + conloc+=int(operando)
  55 +
  56 +
  57 + elif codop in DirectivasdereservadeespacioenmemoriaDedosbyte and operando!='NULL':
  58 + if '#' in operando:
  59 + conloc+=int(operando[1:len(operando)-1])*2
  60 + elif '$' in operando:
  61 + conloc+=int(hex(operando[1:len(operando)-1]))*2
  62 + elif '%' in operando:
  63 + conloc+=int(bin(operando[1:len(operando)-1]))*2
  64 + elif '@' in operando:
  65 + conloc+=int(oct(operando[1:len(operando)-1]))*2
  66 + else:
  67 + conloc+=int(operando)*2
  68 + if etiqueta!='NULL':
  69 + tabsim.write('\n')
  70 + tabsim.write(str(etiqueta))
  71 + tabsim.write(' ')
  72 + tabsim.write(str(hex(conloc).split('x')[1].zfill(16)))
  73 +
  74 +
  75 + return hex(conloc).split('x')[1].zfill(16)
  76 +
  77 +
  78 +
  79 +
  80 +def enbuscadelaverdad(pali):
  81 + if len(pali)>8:
  82 + error='se a producido un error en la linea '+str(cont)+' la etiqueta tiene mas de 8 caracteres'
  83 + err.write(error)
  84 +
  85 + for x in range(len(pali)):
  86 + if pali[x] in caracteres:
  87 + error='se a producido un error en la linea '+str(cont)+' un caracter no valido-->'+pali[x]
  88 + err.write(error)
  89 +def godofwar(kratos):
  90 + a=[]
  91 + tabop=open('TABOP.txt','r')
  92 + while True:
  93 + linea=tabop.readline()
  94 + if not linea: break
  95 + pass
  96 + dantesinferno=linea.split('|')
  97 + if kratos==dantesinferno[0]:
  98 + a.append(dantesinferno[2])
  99 +
  100 + if a:
  101 + return str(a)
  102 +
  103 + return ''
  104 +def direccionamiento(codop,operando):
  105 + centin=0
  106 + #print codop+operando
  107 + if '%' in operando:
  108 + f=operando.strip('%')
  109 + for x in range(len(f)):
  110 + if f[x]=='1' or f[x]=='0':
  111 + centin+=1
  112 + if centin==len(f):
  113 + cad=str('0b')+f
  114 + if int(cad,2)<=255:
  115 + return 'DIR'
  116 + else:
  117 + return 'EXT'
  118 +
  119 +
  120 + if codop=='ORG':
  121 + return ''
  122 + if operando.isdigit() and codop!='ORG' and int (operando)<=255:
  123 + return 'DIR'
  124 + if operando.isdigit() and codop!='ORG' and int (operando)>65545:
  125 +
  126 + return ''
  127 +
  128 +
  129 + if operando.isdigit() and codop!='ORG' and int (operando)>255:
  130 + return 'EXT'
  131 +
  132 +
  133 + if operando=='NULL' and codop!='END':
  134 +
  135 + return 'INH'
  136 + #print
  137 + if '#@' in operando or '#%' and operando[2:len(operando)].isdigit() and operando>65545:
  138 + return 'IMM8'
  139 +
  140 + if '#' in operando:
  141 + return 'IMM8'
  142 + #print
  143 + if (('$' in operando) or ('@' in operando) or ('%' in operando)) and (operando[1:len(operando)].isdigit()) and ((int (operando[1:len(operando)]))<=255) :
  144 +
  145 + return 'DIR'
  146 + if (('$' in operando) or ('@' in operando) or ('%' in operando)) and ((int ('0x'+str(operando[1:len(operando)]),16))<=255):
  147 +
  148 + return 'DIR'
  149 +
  150 + if (('$' in operando) or ('@' in operando) or ('%' in operando)) and (operando[1:len(operando)].isdigit()) and((int (operando[1:len(operando)]))>255) and((int (operando[1:len(operando)]))<=65545) and codop!='ORG' :
  151 + return 'EXT'
  152 + if (('$' in operando) or ('@' in operando) or ('%' in operando)) and (operando[1:len(operando)].isdigit()) and((int (operando[1:len(operando)]))>255) and((int (operando[1:len(operando)]))>65545) and codop!='ORG' :
  153 + #print operando
  154 + return ''
  155 + if (('$' in operando) or ('@' in operando) or ('%' in operando)) and operando[1:len(operando)].isalnum() and (operando[1:len(operando)].isdigit()==False) and codop!='ORG':
  156 + return 'EXT'
  157 +
  158 + if ('[' in operando == 0) and (']' in operando==0):
  159 + centin=1
  160 + if ',' in operando and centin==0 :
  161 +
  162 + OPERA=operando.split(',')
  163 + if OPERA[0].isdigit():
  164 +
  165 + if int(OPERA[0]) <= 15 and int (OPERA[0]) >= -16 :
  166 +
  167 + return 'IDX'
  168 +
  169 + if (int(OPERA[0]) >= -256 and int (OPERA[0]) <= -17) or (int(OPERA[0]) >= 16) and (int(OPERA[0]) <= 255) :
  170 +
  171 + return 'IDX1'
  172 + if (int(OPERA[0]) >= 256 and int (OPERA[0]) <= 65545):
  173 +
  174 + return 'IDX2'
  175 +################ AUTO PRE/POST DECREMENTO /INCREMENTO
  176 + if '-SP' in operando or '-sp' in operando:
  177 +
  178 +
  179 + return 'IDX'
  180 + if 'SP-' in operando or 'sp-' in operando:
  181 +
  182 +
  183 + return 'IDX'
  184 +
  185 + if '+SP' in operando or '+sp' in operando:
  186 +
  187 +
  188 + return 'IDX'
  189 + if 'SP+' in operando or 'sp+' in operando:
  190 +
  191 + return 'IDX'
  192 +
  193 + if ('[' in operando) and (']' in operando):
  194 +
  195 + #print operando #muestra la cadena [455,X] para verificar
  196 + inicial=operando.index('[')
  197 + final=operando.index(']')
  198 + #print 'inicial',inicial
  199 + #print 'final',final
  200 + ####quitamos [ ] de [455,X]
  201 + ini=int(inicial)+1
  202 + fin=int(final)
  203 + nuevoOpera=operando[ini:fin]####opteniendo 455,x
  204 + if ',' in nuevoOpera:
  205 + descuartiza=nuevoOpera.split(',')##partimos por , y optenemos 455 x
  206 + #print descuartiza#muesta la lista partida
  207 + if descuartiza[0].isdigit() :
  208 + if int(descuartiza[0])>=0 and int (descuartiza[0])<=65545:
  209 +
  210 + return '[IDX2]'
  211 +
  212 +#### MODO INDIZADO DE ACUMULADOR
  213 + if( (operando=='A,X') or (operando=='A,Y') or (operando=='A,SP') or (operando=='A,PC') or (operando=='B,X') or (operando=='B,Y') or (operando=='B,SP') or (operando=='B,PC') or (operando=='D,X') or (operando=='D,Y') or (operando=='D,SP') or (operando=='D,PC') ):
  214 +
  215 + return 'IDX'
  216 +
  217 +
  218 +
  219 +#INDIZADO DE ACUMULADOR D INDIRECTO.
  220 + if((operando=='[D,X]') or(operando=='[D,Y]') or (operando=='[D,SP]') or (operando=='[D,PC]') ):
  221 +
  222 + return '[D,IDX]'
  223 +##MODOR RELATIVOS
  224 + if (operando.isalpha() or operando.isdigit()) and codop[0]=='L':
  225 +
  226 + return 'REL16'
  227 + if codop=='BRA':
  228 +
  229 + return 'REL8'
  230 +
  231 + return ''
  232 +
  233 +
  234 +
  235 +def errordeoperando(kratos,hercules):
  236 + #print kratos+hercules+'sssssssssss'
  237 + afrodita=open('TABOP.txt','r')
  238 + while True:
  239 + linea2=afrodita.readline()
  240 + if not linea2:break
  241 + poseidon=linea2.split('|')
  242 + #print poseidon
  243 +
  244 + if kratos==poseidon[0] and poseidon[1]=='NO' and hercules!='NULL':
  245 + err.write('el mnemonico '+kratos+' no debe llevar operando\n')
  246 + return 'NO'
  247 + break
  248 +
  249 +
  250 + if kratos==poseidon[0] and poseidon[1]=='SI' and hercules=='NULL':
  251 + err.write('el mnemonico '+kratos+' espera un operando\n')
  252 + break
  253 +
  254 +
  255 +def errordekratoss(oper):
  256 + for x in range (len(caracter)):
  257 + if caracter[x] in oper:
  258 + err.write('Formato de operando no válido para ningún modo de direccionamiento '+oper)
  259 + err.write('\n')
  260 + return 1
  261 +
  262 +def errordekratoss2(oper):
  263 + for x in range (len(caracter)):
  264 + if caracter[x] in oper:
  265 + return 1
  266 +
  267 +
  268 +def instruc(cont,linea):
  269 +
  270 + l=linea.split()
  271 + for x in range(mnem):
  272 + if mnemonico[x] in l:
  273 + palabras=linea.split()
  274 +
  275 + if len(palabras)==1:
  276 + print str(cont)+' '+conloco(mnemonico[x],'NULL','NULL')+' NULL '+mnemonico[x]+' NULL'+' '+str(direccionamiento(mnemonico[x],'NULL'))
  277 + inst.write(str(cont))
  278 + inst.write(' ')
  279 + inst.write(str(hex(conloc).split('x')[1].zfill(16)))
  280 + inst.write(' NULL ')
  281 + inst.write(mnemonico[x])
  282 + inst.write(' NULL\n')
  283 + errordeoperando(mnemonico[x],'NULL')
  284 + elif len(palabras)==2:
  285 + if palabras.index(mnemonico[x])==0:
  286 +
  287 + longa=str(cont)+' '+conloco(mnemonico[x],palabras[1],'NULL')+' NULL '+str(palabras[0])+' '+str(palabras[1])+' '+str(direccionamiento(palabras[0],palabras[1]))
  288 + if str(direccionamiento(palabras[0],palabras[1]))=='' and mnemonico[x]!='ORG' and errordekratoss2(palabras[1])!=1:
  289 + err.write('Operando fuera de rango para direccionamiento fulanito de tal '+palabras[1])
  290 + err.write('\n')
  291 + print longa
  292 + errordekratoss(palabras[1])
  293 + inst.write(str(cont))
  294 + inst.write(' ')
  295 + inst.write(str(hex(conloc).split('x')[1].zfill(16)))
  296 + inst.write(' NULL ')
  297 + inst.write(mnemonico[x])
  298 + inst.write(' ')
  299 + if errordeoperando(palabras[0],palabras[1])!='NO':
  300 + inst.write(str(palabras[1]))
  301 + inst.write(' ')
  302 + inst.write(str(direccionamiento(palabras[0],palabras[1])))
  303 + inst.write('\n')
  304 + #errordeoperando(palabras[0],palabras[1])
  305 + elif palabras.index(mnemonico[x])==1:
  306 + longa=str(cont)+' '+str(palabras[0])+' '+str(palabras[1])+' '+str(direccionamiento(palabras[1],'NULL'))
  307 + if str(direccionamiento(palabras[1],'NULL'))=='' and mnemonico[x]!='ORG' and errordekratoss2('NULL')!=1:
  308 + err.write('Operando fuera de rango para direccionamiento fulanito de tal de NULL')
  309 + err.write('\n')
  310 + print longa
  311 + inst.write(str(cont))
  312 + inst.write(' NULL ')
  313 + inst.write(mnemonico[x])
  314 + inst.write(' ')
  315 + inst.write(str(palabras[1]))
  316 + inst.write(' ')
  317 + inst.write(str(direccionamiento(palabras[1],'NULL')))
  318 + inst.write('\n')
  319 + errordeoperando(palabras[1],'NULL')
  320 +
  321 +
  322 + elif len(palabras)==3:
  323 + pali=linea.split(mnemonico[x])#codo operando
  324 + var=str(direccionamiento(palabras[1],palabras[2]))
  325 + god=str(cont)+' '+conloco(mnemonico[x],pali[1],pali[0])+' '+pali[0]+' '+mnemonico[x]+pali[1].strip('\n')+' '+str(var)
  326 + print god
  327 + inst.write(str(cont))
  328 + inst.write(' ')
  329 + inst.write(str(hex(conloc).split('x')[1].zfill(16)))
  330 + inst.write(' ')
  331 + inst.write(pali[0])
  332 + inst.write(' ')
  333 + inst.write(mnemonico[x])
  334 + inst.write(' ')
  335 + inst.write(pali[1])
  336 + enbuscadelaverdad(pali[0])
  337 + errordeoperando(mnemonico[x],pali[1].strip('\n'))
  338 +
  339 + if str(direccionamiento(palabras[1],palabras[2]))=='' and mnemonico[x]!='ORG' and errordekratoss(palabras[2])!=1:
  340 + err.write('Operando fuera de rango para direccionamiento fulanito de tal '+palabras[2])
  341 + err.write('\n')
  342 +
  343 +
  344 +
  345 +while True:
  346 + linea=archivo.readline()
  347 + if not linea: break
  348 + cont+=1
  349 + instruc(cont,linea)
  350 +
  351 +#input()
  352 +