version 1.2, 2006/01/19 17:24:03
|
version 1.3, 2006/02/15 15:07:53
|
Line 30
|
Line 30
|
/* */ |
/* */ |
/********************************************************************/ |
/********************************************************************/ |
|
|
|
|
/******************************************************************************/ |
/******************************************************************************/ |
/** MÓDULO: AnalizadorOperandos16bits.c */ |
/* MÓDULO: AnalizadorOperandos16bits.c */ |
/** */ |
/* */ |
/** Este módulo analiza el uso de los operandos y construye una ficha de la */ |
/* Este módulo analiza el uso de los operandos y construye una ficha de la */ |
/** instrucción clasificando los operandos por su uso. */ |
/* instrucción clasificando los operandos por su uso. */ |
/** También calcula el número total de ciclos. */ |
/* También calcula el número total de ciclos. */ |
/******************************************************************************/ |
/******************************************************************************/ |
/** Fecha: 13 de junio de 2005 */ |
/* Fecha: 13 de junio de 2005 */ |
/******************************************************************************/ |
/******************************************************************************/ |
|
|
|
|
|
|
/**@file AnalizadorOperandos16bits.c |
|
Este módulo contiene las funciones que permiten analizar dependencias |
|
de datos entre instrucciones |
|
*/ |
|
|
|
/**@author Sergio Alvarez Moreno |
|
*/ |
|
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
Line 68 extern operando *simbolos;
|
Line 57 extern operando *simbolos;
|
|
|
|
|
|
|
/** |
/* esta función convierte una cadena de operandos a una cadena normalizada */ |
@brief Esta función convierte una cadena de operandos a una cadena normalizada |
/* de posibles ubicaciones (sin desplazamientos ni valores inmediatos) */ |
de posibles ubicaciones (sin desplazamientos ni valores inmediatos) |
|
|
|
@param *cadena: Cadena de caracteres que contienen operandos. |
|
*/ |
|
|
|
void NormalizarUbicacion(char *cadena) |
void NormalizarUbicacion(char *cadena) |
{ |
{ |
Line 86 void NormalizarUbicacion(char *cadena)
|
Line 71 void NormalizarUbicacion(char *cadena)
|
if(isxdigit(cadena[2])) strcpy(cadena, "[XXXX]"); /* es un desplazamiento absoluto */ |
if(isxdigit(cadena[2])) strcpy(cadena, "[XXXX]"); /* es un desplazamiento absoluto */ |
else |
else |
{ |
{ |
if(cadena[3]==']') cadena[4]='\0'; /* termino la cadena justo después aunque */ |
if(cadena[3]==']') cadena[4]='\0'; /* termino la cadena justo después aunque */ |
else cadena[6]='\0'; /* pueda haber desplazamiento adicional */ |
else cadena[6]='\0'; /* pueda haber desplazamiento adicional */ |
} |
} |
break; |
break; |
|
|
default: /* registros o valores (inmediatos o direcciones físicas) */ |
default: /* registros o valores (inmediatos o direcciones físicas) */ |
if(isxdigit(cadena[1])) /* es un número hexadecimal */ |
if(isxdigit(cadena[1])) /* es un número hexadecimal */ |
Line 114 void NormalizarUbicacion(char *cadena)
|
Line 99 void NormalizarUbicacion(char *cadena)
|
} |
} |
|
|
|
|
/** |
/* esta función clasifica un operando explícito según su funcionalidad */ |
@brief Esta función clasifica un operando explícito según su funcionalidad . |
/* las funciones de los operandos se dan en la base de datos de símbolos */ |
Las funciones de los operandos se dan en la base de datos de símbolos |
/* se consideran independientes de la operación (lo cual no es cierto siempre) */ |
se consideran independientes de la operación (lo cual no es cierto siempre) |
|
|
|
@param *operando: Operando el cual se va a clasificar |
|
@param modo: Modo de funcionamiento del operando (LEIDOYESCRITO,LEIDO,NO_EXISTE) |
|
@param *tarjetaoperandos: Puntero a una estructura del tipo fichainstruccion |
|
*/ |
|
|
|
void ClasificarOperandoExplicito(char *operando, char modo, fichainstruccion *tarjetaoperandos) |
void ClasificarOperandoExplicito(char *operando, char modo, fichainstruccion *tarjetaoperandos) |
{ |
{ |
int id_simb; |
int id_simb; |
char cadena[MAX_LINE]; |
char cadena[MAX_LINE]; |
char mensaje[MAX_LINE]; |
char mensaje[MAX_LINE]; |
|
|
strcpy(cadena, operando); |
strcpy(cadena, operando); |
|
|
if(cadena[0]!= '\0') |
if(cadena[0]!= '\0') |
{ |
{ |
NormalizarUbicacion(cadena); |
NormalizarUbicacion(cadena); |
id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena); |
id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena); |
Line 140 void ClasificarOperandoExplicito(char *o
|
Line 119 void ClasificarOperandoExplicito(char *o
|
if(id_simb == -1) |
if(id_simb == -1) |
{ |
{ |
/* emito un error al fichero de log */ |
/* emito un error al fichero de log */ |
sprintf(mensaje, "[ClasificarOperandoExplicito] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena); |
sprintf(mensaje, "[ClasificarOperandoExplicito] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
} |
} |
|
|
/* relleno la tarjeta de operandos explícitos para el operando (cadena) */ |
/* relleno la tarjeta de operandos explícitos para el operando (cadena) */ |
/* según la funcionalidad dada por el campo tipo */ |
/* según la funcionalidad dada por el campo tipo */ |
|
|
switch(simbolos[id_simb].tipo) |
switch(simbolos[id_simb].tipo) |
{ |
{ |
Line 166 void ClasificarOperandoExplicito(char *o
|
Line 145 void ClasificarOperandoExplicito(char *o
|
break; |
break; |
|
|
case NO_EXISTE: /* no existe: emitir un error al fichero de log */ |
case NO_EXISTE: /* no existe: emitir un error al fichero de log */ |
sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe"); |
sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe"); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
break; |
break; |
} |
} |
break; |
break; |
Line 186 void ClasificarOperandoExplicito(char *o
|
Line 165 void ClasificarOperandoExplicito(char *o
|
break; |
break; |
|
|
case NO_EXISTE: /* no existe: emitir un error al fichero de log */ |
case NO_EXISTE: /* no existe: emitir un error al fichero de log */ |
sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe"); |
sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe"); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
break; |
break; |
} |
} |
break; |
break; |
Line 206 void ClasificarOperandoExplicito(char *o
|
Line 185 void ClasificarOperandoExplicito(char *o
|
break; |
break; |
|
|
case NO_EXISTE: /* no existe: emitir un error al fichero de log */ |
case NO_EXISTE: /* no existe: emitir un error al fichero de log */ |
sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe"); |
sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe"); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
break; |
break; |
} |
} |
break; |
break; |
|
|
case BANDERAS: |
case BANDERAS: |
/* nunca se dan explícitamente pero pueden ser considerados explícitos a través del nemónico */ |
/* nunca se dan explícitamente pero pueden ser considerados explícitos a través del nemónico */ |
/* así se hará en la clasificación de implícitos */ |
/* así se hará en la clasificación de implícitos */ |
break; |
break; |
|
|
/* los 2 siguientes no representan realmente funciones */ |
/* los 2 siguientes no representan realmente funciones */ |
|
|
case ACCESOS_MEM: /* accesos a memoria */ |
case ACCESOS_MEM: /* accesos a memoria */ |
/* CÓMPUTO DE DIRECCIONES */ |
/* CÓMPUTO DE DIRECCIONES */ |
/* BASE: registro de segmento */ |
/* BASE: registro de segmento */ |
/* si hay prefijo de registro de segmento (longitud 2), ese es el leído */ |
/* si hay prefijo de registro de segmento (longitud 2), ese es el leído */ |
if(strlen(tarjetaoperandos->prefijo)==2) |
if(strlen(tarjetaoperandos->prefijo)==2) |
{ |
{ |
if(strcmp(tarjetaoperandos->prefijo, "SS") == 0) AgregarElementoLista(tarjetaoperandos->leidoexplpila, tarjetaoperandos->prefijo); |
if(strcmp(tarjetaoperandos->prefijo, "SS") == 0) AgregarElementoLista(tarjetaoperandos->leidoexplpila, tarjetaoperandos->prefijo); |
else AgregarElementoLista(tarjetaoperandos->leidoexpldir, tarjetaoperandos->prefijo); |
else AgregarElementoLista(tarjetaoperandos->leidoexpldir, tarjetaoperandos->prefijo); |
} |
} |
/* si no lo hay, agrego el indicado por defecto */ |
/* si no lo hay, agrego el indicado por defecto */ |
else |
else |
{ |
{ |
Line 252 void ClasificarOperandoExplicito(char *o
|
Line 231 void ClasificarOperandoExplicito(char *o
|
} |
} |
|
|
/* OFFSET: los registros involucrados en el cómputo de direcciones */ |
/* OFFSET: los registros involucrados en el cómputo de direcciones */ |
/* siempre son leídos; la función depende de la BASE */ |
/* siempre son leídos; la función depende de la BASE */ |
if(strcmp(tarjetaoperandos->prefijo, "SS") == 0 || |
if(strcmp(tarjetaoperandos->prefijo, "SS") == 0 || |
simbolos[id_simb].segmento == SS) |
simbolos[id_simb].segmento == SS) |
AgregarElementoLista(tarjetaoperandos->leidoexplpila, simbolos[id_simb].dependencias); |
AgregarElementoLista(tarjetaoperandos->leidoexplpila, simbolos[id_simb].dependencias); |
else AgregarElementoLista(tarjetaoperandos->leidoexpldir, simbolos[id_simb].dependencias); |
else AgregarElementoLista(tarjetaoperandos->leidoexpldir, simbolos[id_simb].dependencias); |
|
|
/* DATO */ |
/* DATO */ |
if(strcmp(tarjetaoperandos->prefijo, "SS") == 0 || simbolos[id_simb].segmento == SS) |
if(strcmp(tarjetaoperandos->prefijo, "SS") == 0 || simbolos[id_simb].segmento == SS) |
|
{ |
|
switch(modo) |
|
{ |
|
case LEIDOYESCRITO: /* leido y escrito */ |
|
AgregarElementoLista(tarjetaoperandos->leidoexplpila, "PILA"); |
|
case ESCRITO: /* escrito */ |
|
AgregarElementoLista(tarjetaoperandos->escritoexplpila, "PILA"); |
|
break; |
|
|
|
case LEIDO: /* leido */ |
|
AgregarElementoLista(tarjetaoperandos->leidoexplpila, "PILA"); |
|
break; |
|
|
|
case NO_EXISTE: /* no existe: emitir un error al fichero de log */ |
|
sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe"); |
|
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
|
break; |
|
} |
|
} |
|
else |
{ |
{ |
switch(modo) |
switch(modo) |
{ |
{ |
case LEIDOYESCRITO: /* leido y escrito */ |
case LEIDOYESCRITO: /* leido y escrito */ |
AgregarElementoLista(tarjetaoperandos->leidoexplpila, "PILA"); |
AgregarElementoLista(tarjetaoperandos->leidoexpldatos, "MEM"); |
case ESCRITO: /* escrito */ |
case ESCRITO: /* escrito */ |
AgregarElementoLista(tarjetaoperandos->escritoexplpila, "PILA"); |
AgregarElementoLista(tarjetaoperandos->escritoexpldatos, "MEM"); |
break; |
break; |
|
|
case LEIDO: /* leido */ |
case LEIDO: /* leido */ |
AgregarElementoLista(tarjetaoperandos->leidoexplpila, "PILA"); |
AgregarElementoLista(tarjetaoperandos->leidoexpldatos, "MEM"); |
break; |
break; |
|
|
case NO_EXISTE: /* no existe: emitir un error al fichero de log */ |
case NO_EXISTE: /* no existe: emitir un error al fichero de log */ |
sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe"); |
sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe"); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
break; |
break; |
} |
} |
} |
break; |
else |
|
{ |
|
switch(modo) |
|
{ |
|
case LEIDOYESCRITO: /* leido y escrito */ |
|
AgregarElementoLista(tarjetaoperandos->leidoexpldatos, "MEM"); |
|
case ESCRITO: /* escrito */ |
|
AgregarElementoLista(tarjetaoperandos->escritoexpldatos, "MEM"); |
|
break; |
|
|
|
case LEIDO: /* leido */ |
|
AgregarElementoLista(tarjetaoperandos->leidoexpldatos, "MEM"); |
|
break; |
|
|
|
case NO_EXISTE: /* no existe: emitir un error al fichero de log */ |
|
sprintf(mensaje, "[ClasificarOperandoExplicito] El operando no existe"); |
|
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
|
break; |
|
} |
|
break; |
|
} |
} |
break; |
break; |
|
|
case OTROS: |
case OTROS: |
AgregarElementoLista(tarjetaoperandos->leidoexpldir, simbolos[id_simb].dependencias); |
AgregarElementoLista(tarjetaoperandos->leidoexpldir, simbolos[id_simb].dependencias); |
break; |
break; |
|
|
default: |
default: |
/* emitir un error al fichero de log */ |
/* emitir un error al fichero de log */ |
sprintf(mensaje, "[ClasificarOperandoExplicito] El tipo de símbolo no existe"); |
sprintf(mensaje, "[ClasificarOperandoExplicito] El tipo de símbolo no existe"); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
break; |
break; |
} |
} |
} |
} |
} |
} |
|
|
|
|
/** |
/* esta función clasifica un operando implícito leído según su funcionalidad */ |
@brief Esta función clasifica un operando implícito leído según su funcionalidad |
/* las funciones de los operandos se dan en la base de datos de símbolos */ |
Las funciones de los operandos se dan en la base de datos de símbolos |
/* se consideran independientes de la operación (lo cual no es cierto siempre) */ |
se consideran independientes de la operación (lo cual no es cierto siempre) |
|
|
|
@param *cadena: Cadena de caracteres que contiene los operandos que se van a clasificar |
|
@param tipo: tipo de operación que se va a realizar (SALTO_CONDICIONAL,CONTROL) |
|
@param *tarjetaoperandos: Puntero a una estructura del tipo fichainstruccion |
|
*/ |
|
|
|
void ClasificarOperandoImplicitoLeido(char *cadena, char tipo, fichainstruccion *tarjetaoperandos) |
void ClasificarOperandoImplicitoLeido(char *cadena, char tipo, fichainstruccion *tarjetaoperandos) |
{ |
{ |
int id_simb; |
int id_simb; |
char mensaje[MAX_LINE]; |
char mensaje[MAX_LINE]; |
|
|
id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena); |
id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena); |
|
|
if(id_simb == -1) |
if(id_simb == -1) |
{ |
{ |
/* emito un error al fichero de log */ |
/* emito un error al fichero de log */ |
sprintf(mensaje, "[ClasificarOperandoImplicitoLeido] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena); |
sprintf(mensaje, "[ClasificarOperandoImplicitoLeido] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
} |
} |
|
|
switch(simbolos[id_simb].tipo) |
switch(simbolos[id_simb].tipo) |
{ |
{ |
case DATOS: |
case DATOS: |
AgregarElementoLista(tarjetaoperandos->leidoimpldatos, simbolos[id_simb].simbolo); |
AgregarElementoLista(tarjetaoperandos->leidoimpldatos, simbolos[id_simb].simbolo); |
AgregarElementoLista(tarjetaoperandos->leidoimpldatos, simbolos[id_simb].dependencias); |
AgregarElementoLista(tarjetaoperandos->leidoimpldatos, simbolos[id_simb].dependencias); |
break; |
break; |
Line 357 void ClasificarOperandoImplicitoLeido(ch
|
Line 330 void ClasificarOperandoImplicitoLeido(ch
|
|
|
case BANDERAS: |
case BANDERAS: |
if(tipo == SALTO_CONDICIONAL || tipo == CONTROL) |
if(tipo == SALTO_CONDICIONAL || tipo == CONTROL) |
/* los saltos condicionales y las operaciones sobre banderas */ |
/* los saltos condicionales y las operaciones sobre banderas */ |
/* pueden ser considerados explícitos a través del nemónico */ |
/* pueden ser considerados explícitos a través del nemónico */ |
AgregarElementoLista(tarjetaoperandos->leidoexplestado, simbolos[id_simb].simbolo); |
AgregarElementoLista(tarjetaoperandos->leidoexplestado, simbolos[id_simb].simbolo); |
else AgregarElementoLista(tarjetaoperandos->leidoimplestado, simbolos[id_simb].simbolo); |
else AgregarElementoLista(tarjetaoperandos->leidoimplestado, simbolos[id_simb].simbolo); |
break; |
break; |
|
|
default: /* emitir un error al fichero de log */ |
default: /* emitir un error al fichero de log */ |
sprintf(mensaje, "[ClasificarOperandoImplicitoLeido] El tipo de símbolo no existe"); |
sprintf(mensaje, "[ClasificarOperandoImplicitoLeido] El tipo de símbolo no existe"); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
break; |
break; |
} |
} |
} |
} |
|
|
|
|
/** |
/* esta función clasifica un operando implícito escrito según su funcionalidad */ |
@brief Esta función clasifica un operando implícito escrito según su funcionalidad |
/* las funciones de los operandos se dan en la base de datos de símbolos */ |
Las funciones de los operandos se dan en la base de datos de símbolos |
/* se consideran independientes de la operación (lo cual no es cierto siempre) */ |
se consideran independientes de la operación (lo cual no es cierto siempre) |
|
|
|
@param *cadena: Cadena de caracteres que contiene los operandos que se van a clasificar |
|
@param tipo: tipo de operación que se va a realizar (SALTO_CONDICIONAL,CONTROL) |
|
@param *tarjetaoperandos: Puntero a una estructura del tipo fichainstruccion |
|
*/ |
|
|
|
void ClasificarOperandoImplicitoEscrito(char *cadena, char tipo, fichainstruccion *tarjetaoperandos) |
void ClasificarOperandoImplicitoEscrito(char *cadena, char tipo, fichainstruccion *tarjetaoperandos) |
{ |
{ |
int id_simb; |
int id_simb; |
char mensaje[MAX_LINE]; |
char mensaje[MAX_LINE]; |
|
|
id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena); |
id_simb = BDBuscarCadena(TABLA_SIMBOLOS, CAMPO_SIMBOLO, cadena); |
|
|
if(id_simb == -1) |
if(id_simb == -1) |
{ |
{ |
/* emito un error al fichero de log */ |
/* emito un error al fichero de log */ |
sprintf(mensaje, "[ClasificarOperandoImplicitoEscrito] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena); |
sprintf(mensaje, "[ClasificarOperandoImplicitoEscrito] La cadena '%s' no se ha encontrado en Tabla Símbolos", cadena); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
} |
} |
|
|
switch(simbolos[id_simb].tipo) |
switch(simbolos[id_simb].tipo) |
{ |
{ |
case DATOS: |
case DATOS: |
AgregarElementoLista(tarjetaoperandos->escritoimpldatos, simbolos[id_simb].simbolo); |
AgregarElementoLista(tarjetaoperandos->escritoimpldatos, simbolos[id_simb].simbolo); |
AgregarElementoLista(tarjetaoperandos->escritoimpldatos, simbolos[id_simb].dependencias); |
AgregarElementoLista(tarjetaoperandos->escritoimpldatos, simbolos[id_simb].dependencias); |
break; |
break; |
|
|
case PTR_MEM: |
case PTR_MEM: |
AgregarElementoLista(tarjetaoperandos->escritoimpldir, simbolos[id_simb].simbolo); |
AgregarElementoLista(tarjetaoperandos->escritoimpldir, simbolos[id_simb].simbolo); |
break; |
break; |
|
|
Line 410 void ClasificarOperandoImplicitoEscrito(
|
Line 377 void ClasificarOperandoImplicitoEscrito(
|
AgregarElementoLista(tarjetaoperandos->escritoimplpila, simbolos[id_simb].simbolo); |
AgregarElementoLista(tarjetaoperandos->escritoimplpila, simbolos[id_simb].simbolo); |
break; |
break; |
|
|
case BANDERAS: |
case BANDERAS: |
if(tipo == SALTO_CONDICIONAL || tipo == CONTROL) |
if(tipo == SALTO_CONDICIONAL || tipo == CONTROL) |
/* los saltos condicionales y las operaciones sobre banderas */ |
/* los saltos condicionales y las operaciones sobre banderas */ |
/* pueden ser considerados explícitos a través del nemónico */ |
/* pueden ser considerados explícitos a través del nemónico */ |
AgregarElementoLista(tarjetaoperandos->escritoexplestado, simbolos[id_simb].simbolo); |
AgregarElementoLista(tarjetaoperandos->escritoexplestado, simbolos[id_simb].simbolo); |
else AgregarElementoLista(tarjetaoperandos->escritoimplestado, simbolos[id_simb].simbolo); |
else AgregarElementoLista(tarjetaoperandos->escritoimplestado, simbolos[id_simb].simbolo); |
break; |
break; |
|
|
default: /* emitir un error al fichero de log */ |
default: /* emitir un error al fichero de log */ |
sprintf(mensaje, "[ClasificarOperandoImplicitoEscrito] El tipo de símbolo no existe"); |
sprintf(mensaje, "[ClasificarOperandoImplicitoEscrito] El tipo de símbolo no existe"); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
break; |
break; |
} |
} |
} |
} |
|
|
|
|
/** |
/* esta función desensambla una instrucción a partir de una secuencia de bytes */ |
@brief Esta función desensambla una instrucción a partir de una secuencia de bytes |
/* extrae información a partir del nemónico */ |
Extrae información a partir del nemónico. |
/* clasifica el uso de los operandos explícitos según su función */ |
Clasifica el uso de los operandos explícitos según su función |
/* clasifica el uso de los operandos implícitos según su función */ |
Clasifica el uso de los operandos implícitos según su función |
|
|
|
@param secuencia: Array con 2 posibles ormatos de instrucción: la que hay que desensamblar. ¡OJO! En realidad cada formato debería tener 7 bytes para prevenir el uso de prefijos |
|
@param *tarjetaoperandos: Puntero a una estructura del tipo fichainstruccion |
|
*/ |
|
|
|
void AnalizarOperandosIA16(unsigned char secuencia[12], fichainstruccion *tarjetaoperandos) |
void AnalizarOperandosIA16(unsigned char secuencia[12], fichainstruccion *tarjetaoperandos) |
{ |
{ |
Line 450 void AnalizarOperandosIA16(unsigned char
|
Line 412 void AnalizarOperandosIA16(unsigned char
|
int id_nemo; |
int id_nemo; |
char cadena[MAX_LINE]; /* esto es un array de caracteres; cadena[x] es un puntero */ |
char cadena[MAX_LINE]; /* esto es un array de caracteres; cadena[x] es un puntero */ |
char *elemento; /* es un puntero a char; no es igual a cadena[x] para la función strtok */ |
char *elemento; /* es un puntero a char; no es igual a cadena[x] para la función strtok */ |
char mensaje[MAX_LINE]; |
char mensaje[MAX_LINE]; |
|
|
/* inicio la tarjeta de operandos */ |
/* inicio la tarjeta de operandos */ |
IniciarTarjeta(tarjetaoperandos); |
IniciarTarjeta(tarjetaoperandos); |
|
|
/* cargo la primera instrucción desde la secuencia */ |
/* cargo la primera instrucción desde la secuencia */ |
|
|
Line 470 void AnalizarOperandosIA16(unsigned char
|
Line 432 void AnalizarOperandosIA16(unsigned char
|
if(id_nemo == -1) |
if(id_nemo == -1) |
{ |
{ |
/* emito un error al fichero de log */ |
/* emito un error al fichero de log */ |
sprintf(mensaje, "[AnalizarOperandosIA16] La cadena '%s' no se ha encontrado en Tabla Nemónicos", instruccion.nemonico); |
sprintf(mensaje, "[AnalizarOperandosIA16] La cadena '%s' no se ha encontrado en Tabla Nemónicos", instruccion.nemonico); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
} |
} |
|
|
/* salvo la información en la estructura de la ficha de instrucción */ |
/* salvo la información en la estructura de la ficha de instrucción */ |
Line 554 void AnalizarOperandosIA16(unsigned char
|
Line 516 void AnalizarOperandosIA16(unsigned char
|
if(id_nemo == -1) |
if(id_nemo == -1) |
{ |
{ |
/* emito un error al fichero de log */ |
/* emito un error al fichero de log */ |
sprintf(mensaje, "[AnalizarOperandosIA16] La cadena '%s' no se ha encontrado en Tabla Nemónicos", instruccion.nemonico); |
sprintf(mensaje, "[AnalizarOperandosIA16] La cadena '%s' no se ha encontrado en Tabla Nemónicos", instruccion.nemonico); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
Notificar(mensaje, ERROR_SALIR, ECO_NO); |
} |
} |
break; |
break; |
|
|
Line 575 void AnalizarOperandosIA16(unsigned char
|
Line 537 void AnalizarOperandosIA16(unsigned char
|
|
|
/* SEGUNDO: operandos explícitos */ |
/* SEGUNDO: operandos explícitos */ |
/* operando fuente (op2) */ |
/* operando fuente (op2) */ |
ClasificarOperandoExplicito(tarjetaoperandos->op2, nemonicos[id_nemo].modo_op2, tarjetaoperandos); |
ClasificarOperandoExplicito(tarjetaoperandos->op2, nemonicos[id_nemo].modo_op2, tarjetaoperandos); |
|
|
/* operando destino (op1) */ |
/* operando destino (op1) */ |
ClasificarOperandoExplicito(tarjetaoperandos->op1, nemonicos[id_nemo].modo_op1, tarjetaoperandos); |
ClasificarOperandoExplicito(tarjetaoperandos->op1, nemonicos[id_nemo].modo_op1, tarjetaoperandos); |
|
|
|
|
/* TERCERO: operandos implícitos */ |
/* TERCERO: operandos implícitos */ |
/* analizo la lista de implícitos leídos */ |
/* analizo la lista de implícitos leídos */ |
/* copio la información de la BD para no modificarla */ |
/* copio la información de la BD para no modificarla */ |
strcpy(cadena, nemonicos[id_nemo].implicitos_leidos); |
strcpy(cadena, nemonicos[id_nemo].implicitos_leidos); |
|
|
elemento = strtok(cadena, ":"); /* el separador de elementos de la lista es ':' */ |
elemento = strtok(cadena, ":"); /* el separador de elementos de la lista es ':' */ |
while(elemento != NULL) |
while(elemento != NULL) |
{ |
{ |
ClasificarOperandoImplicitoLeido(elemento, nemonicos[id_nemo].tipo, tarjetaoperandos); |
ClasificarOperandoImplicitoLeido(elemento, nemonicos[id_nemo].tipo, tarjetaoperandos); |
|
|
/* capturo el siguiente campo */ |
/* capturo el siguiente campo */ |
elemento = strtok(NULL, ":"); |
elemento = strtok(NULL, ":"); |
} |
} |
|
|
/* analizo la lista de implícitos escritos */ |
/* analizo la lista de implícitos escritos */ |
/* copio la información de la BD para no modificarla */ |
/* copio la información de la BD para no modificarla */ |
strcpy(cadena, nemonicos[id_nemo].implicitos_escritos); |
strcpy(cadena, nemonicos[id_nemo].implicitos_escritos); |
|
|
elemento = strtok(cadena, ":"); /* el separador de elementos de la lista es ':' */ |
elemento = strtok(cadena, ":"); /* el separador de elementos de la lista es ':' */ |
while(elemento != NULL) |
while(elemento != NULL) |
{ |
{ |
ClasificarOperandoImplicitoEscrito(elemento, nemonicos[id_nemo].tipo, tarjetaoperandos); |
ClasificarOperandoImplicitoEscrito(elemento, nemonicos[id_nemo].tipo, tarjetaoperandos); |
|
|
/* capturo el siguiente campo */ |
/* capturo el siguiente campo */ |
elemento = strtok(NULL, ":"); |
elemento = strtok(NULL, ":"); |