-
Notifications
You must be signed in to change notification settings - Fork 0
01.TheRegisterWindow
Esta es una ventana compuesta, es decir una sección que tiene 4 tablas cada una de ellas con conjunto de registros.
Aunque los flotantes de doble precisión usan los de simple precisión se han dividido para que sea más sencilla su lectura.
- Tabla de registros especiales o de propósito general.
- Tabla de registros enteros.
- Tabla de registros decimales, flotantes de simple precisión.
- Tabla de registros decimales, flotantes de doble precisión.
En esta ventana se representan los distintos registros agrupados en 4 tablas.
Durante la simulación se van cambiando los distintos valores de los registros en función de la simulación.
Podemos ver los valores de los registros como el "Program Counter" o "Instruction Memory Address Register" van cambiando en función de como avanza la simulación.
Para editar los registros abrimos el formulario de edición.
- Seleccionamos de los cuatro tipos el tipo de registro a editar.
- (Se actualiza la lista de registros disponibles)
- Seleccionamos el registro.
- Editamos el valor en formato hexadecimal o en formato decimal.
Esta ventana modal nos permite visualizar de una forma cómoda las distintas representaciones del valor del registro ( binario, decimal, octal, hexadecimal, byte, halfword, ASCII o representación IEEE 754 de 32 bits)
Resumen de los distintos registros de propósito general
- PSR (Floating-Point Status Register). Es un registro de estado de 1 bit de longitud, utilizado para comparaciones y excepciones de coma flotante. Todos los movimientos desde y hacia este registro se realizan a través de los registros de propósito general. Las comparaciones en punto flotante asignan el bit de este registro, estando disponibles instrucciones de salto que basan su resultado en el valor del bit (1 true, 0 false).
- PC (Program Counter). Siempre contiene la dirección de la próxima instrucción que va a ser ejecutada. Los saltos y las bifurcaciones pueden cambiar el contenido del mismo.
- IMAR (Instruction Memory Address Register). Este registro es inicializado con el contenido del contador de programa en la etapa IF a causa de que está conectado con el sistema de memoria, mientras que el PC no.
- IR (Instruction Register). En la etapa IF es cargado con la próxima instrucción a ejecutarse.
- A, B. Son cargados en la etapa ID y sus valores son enviados a los operandos de la unidad aritmética lógica en la siguiente etapa, la EX. En WinDLX, además existen los pseudo-registros AHI y BHI que contienen los 32 bits superiores para valores en coma flotante de doble precisión.
- BTA (Branch Target Address). En la etapa ID, la dirección de salto/bifurcación es calculada y escrita en este registro (ver página 292 del texto base de la asignatura).
- ALU (Aritmethic Logical Unit). El resultado de una operación en la ALU es transferido a este registro. En WinDLX existe un pseudo-registro llamado ALUHI que contiene los 32 bits superiores para valores en coma flotante de doble precisión.
- DMAR (Data Memory Address Register). La dirección de memoria a la que se va a acceder es transferida a este registro en la etapa EX. En la etapa MEM, el acceso a la memoria para lectura o escritura es efectuado con el valor almacenado en este registro.
- SDR (Store Data Register). El dato que se va a escribir en memoria por medio de una instrucción es almacenado previamente en este registro. En WinDLX existe un pseudo-registro llamado SDRHI que contiene los 32 bits superiores para valores en coma flotante de doble precisión.
- LDR (Load Data Register). El dato que es leído de memoria se almacena en este registro. En WinDLX existe un pseudo-registro llamado LDRHI que contiene los 32 bits superiores para valores en coma flotante de doble precisión.
Para actualizar el sistema de registros se hace una petición con un vector de objetos de tipo TypeRegisterToUpdate,
indicando el tipo de registro, el registro en sí y el valor hexadecimal, el servidor responderá con el
mensaje TypeRegisterToUpdateResponse.
export type TypeRegisterToUpdate = {
typeRegister: TypeRegister;
register: string; // TypeRegisterControl & number [0-31]
hexadecimalValue: string; // hexadecimal 0x00000000
};
export type TypeRegisterToUpdateResponse = {
allOK: boolean,
registerToUpdates: TypeRegisterToUpdate[]
};Ejemplo parcial de actualización de un conjunto de registros:
{
"registers": [
{
"typeRegister": "Control",
"register": "PC",
"hexadecimalValue": "0x00000118"
},
{
"typeRegister": "Control",
"register": "IMAR",
"hexadecimalValue": "0x00000114"
},
{
"typeRegister": "Control",
"register": "IR",
"hexadecimalValue": "0x00232028"
},
{
"typeRegister": "Control",
"register": "ALU",
"hexadecimalValue": "0x00000010"
},
{
"typeRegister": "Integer",
"register": "R2",
"hexadecimalValue": "0x00000002"
}
]
}