Un simulador de conjunto de instrucciones (ISS) es un modelo de simulación , generalmente codificado en un lenguaje de programación de alto nivel , que imita el comportamiento de una computadora central o microprocesador "leyendo" instrucciones y manteniendo variables internas que representan los registros del procesador .
La simulación de instrucción es una metodología empleada por una de varias razones posibles:
Los simuladores de conjuntos de instrucciones se pueden implementar utilizando tres técnicas principales:
Una ISS a menudo cuenta con (o es en sí misma) un depurador para que un ingeniero / programador de software pueda depurar el programa antes de obtener el hardware de destino. GDB es un depurador que tiene una ISS compilada. A veces se integra con circuitos periféricos simulados como temporizadores , interrupciones , puertos serie , puertos de E/S generales , etc. para imitar el comportamiento de un microcontrolador .
La técnica básica de simulación de instrucciones es la misma independientemente del propósito: primero ejecute el programa de monitoreo pasando el nombre del programa de destino como parámetro de entrada adicional.
Luego, el programa de destino se carga en la memoria, pero el control nunca se pasa al código. En su lugar, se calcula el punto de entrada dentro del programa cargado y se establece una pseudo palabra de estado del programa (PSW) en esta ubicación. La palabra de estado del programa (PSW) se compone de un registro de estado y un contador de programa , el último de los cuales indica la siguiente instrucción a ejecutar. [1] Por lo tanto, es específicamente el contador de programa el que está asignado a esta ubicación. Un conjunto de pseudoregistros se configuran según lo que habrían contenido si se le hubiera dado el control directamente al programa.
Puede que sea necesario modificar algunos de ellos para que apunten a otros pseudo "bloques de control" según el hardware y el sistema operativo. También puede ser necesario restablecer la lista de parámetros original para "eliminar" el parámetro de nombre del programa agregado previamente.
Posteriormente, la ejecución se desarrolla de la siguiente manera:
Para fines de prueba y depuración, el programa de monitoreo puede proporcionar funciones para ver y alterar registros, memoria y reiniciar la ubicación u obtener un mini volcado de núcleo o imprimir nombres de programas simbólicos con valores de datos actuales. Podría permitir nuevas ubicaciones de "pausa" condicionales, eliminar pausas no deseadas y cosas por el estilo.
La simulación de instrucciones brinda la oportunidad de detectar errores ANTES de la ejecución, lo que significa que las condiciones siguen siendo exactamente como estaban y el error no las destruye. Un muy buen ejemplo del mundo IBM S/360 es la siguiente secuencia de instrucciones que puede causar dificultades al depurar sin un monitor de simulación de instrucciones.
LM R14,R12,12(R13) donde r13 apunta incorrectamente a una cadena de X"00" BR R14 hace que PSW contenga X"0000002" con la verificación del programa "Excepción de operación"* todos los registros en caso de error contienen valores nulos.
El número de instrucciones para realizar el "bucle" básico anterior (Buscar/Ejecutar/calcular nueva dirección) depende del hardware, pero podría lograrse en la gama de máquinas IBM S/360 /370/390/ES9000 en alrededor de 12 o 13 instrucciones para muchos tipos de instrucciones. La comprobación de ubicaciones de memoria válidas o de "pausas" condicionales aumenta considerablemente la sobrecarga, pero las técnicas de optimización pueden reducirla a niveles aceptables. Para fines de prueba, esto normalmente es bastante aceptable ya que se proporcionan poderosas capacidades de depuración que incluyen pasos de instrucción , seguimiento y salto deliberado a la rutina de error de prueba (cuando no hay un error real). Además, se puede utilizar un seguimiento de instrucciones completo para probar la cobertura del código real (ejecutado) .
Ocasionalmente, monitorear la ejecución de un programa objetivo puede ayudar a resaltar errores aleatorios que aparecen (o a veces desaparecen) durante el monitoreo pero no en la ejecución real. Esto puede suceder cuando el programa de destino se carga en una ubicación diferente a la normal debido a la presencia física del programa de monitoreo en el mismo espacio de direcciones.
Si el programa de destino toma el valor de una ubicación "aleatoria" en la memoria (una que generalmente no es "propia"), puede, por ejemplo, ser nulos (X"00") en casi todas las situaciones normales y el programa funciona bien. . Si el programa de monitoreo cambia el punto de carga, puede captar, digamos, X"FF" y la lógica provocaría resultados diferentes durante una operación de comparación. Alternativamente, si el programa de monitoreo ocupa ahora el espacio desde donde se "recoge" el valor, podrían ocurrir resultados similares.
Errores de reentrada: el uso accidental de variables estáticas en lugar de memoria de subprocesos "dinámica" puede causar problemas de reentrada en muchas situaciones. El uso de un programa de monitoreo puede detectarlos incluso sin una clave de protección de almacenamiento.
Operaciones ilegales: algunos sistemas operativos (o hardware) requieren que el programa de aplicación esté en el "modo" correcto para ciertas llamadas al Sistema Operativo. La simulación de instrucciones puede detectar estas condiciones antes de la ejecución.
Análisis de puntos calientes y uso de instrucciones al contar las instrucciones ejecutadas durante la simulación (que coincidirán con el número ejecutado en el procesador real o la ejecución no supervisada), el simulador puede proporcionar una medida del rendimiento relativo entre diferentes versiones del algoritmo y también usarse para detectar "puntos calientes" donde el programador puede orientar la optimización . En esta función, se puede considerar una forma de análisis de rendimiento , ya que no es fácil obtener estas estadísticas durante una ejecución normal y esto es especialmente cierto para programas de lenguaje de alto nivel que efectivamente "disfrazan" el alcance de las instrucciones de código de máquina por su naturaleza.
Algunos de estos simuladores de software aún se utilizan como herramientas para la enseñanza del lenguaje ensamblador y la arquitectura del conjunto de instrucciones, y algunos están diseñados específicamente utilizando múltiples capas de simulación y simulación de ISA a ISA, con la capacidad incluso de diseñar ISA y simularlos. [2]
En el primer volumen de El arte de la programación informática , Donald Knuth escribió: "En opinión del autor, los programadores han dedicado demasiado tiempo a escribir tales simuladores [en lenguaje de máquina] y se ha desperdiciado demasiado tiempo de computadora usándolos". ". [3] Sin embargo, en la siguiente sección, el autor brinda ejemplos de cómo dichos simuladores son útiles como rutinas de seguimiento o monitoreo con fines de depuración.
Salida de seguimiento típica de la simulación mediante el programa de monitoreo utilizado para prueba y depuración:
Instrucción de compensación del programa Registro/almacenamiento desensamblado (después de la ejecución) PRUEBA001 000000 X'05C0' BALR R12,0 R12=002CE00A 000002 X'47F0C00E' antes de Cristo 15,X'00C'(R12) 00000E X'98ECD00C' STM R14,R12,X'00C'(R13) X'002E0008' ==> X'00004CE,002CE008,..etc....' 000012 X'45E0C122' BAL R14,X'122'(R12) R14=002C0016SUB1 000124 X'50E0C28A' ST R14,X'28A'(R12) X'002CE294' ==> X'002C0016'etc...
Simuladores
Otro