PARTE 1: Segmentación de texto por identificadoes
-Leer del libro del XISCKER, el capitulo 5.3 y el capitulo 6.3(centrarse específicamente en las tablas y Diagramas de flujo).
-Leer los Anexos B y C del libro.
-Descargar el instalador y el codigo fuente del ensamblador que está en: https://sites.google.com/site/xiscker/ide
Recomendaciones: Empiece a leer solo la Arquitectura del RISCKER y a programar con respecto a esta arquitectura el ensamblador.
-Haga este ejercicio: Utilice un IDE de programación GUI(cualquiera), incluya un textbox(caja de texto) y un botón(button), escriba un algoritmo que separe el texto linea a linea y que lo imprima en pantalla utilizando una caja de texto(msgbox) o utilizando consola.
-Una vez segmentado por líneas lo que esta en la caja de texto, añada otro botón que cargue un archivo *.txt a la caja de texto y haga el mismo proceso de segmentar por lineas.
-Una vez segmente lineas, identifique en cada linea las "," ";" ":" "\" y segmente de nuevo.
-Luego siga el diagrama de flujo que esta en la seccion 6.3 del libro del XISCKER.
PARTE 2: Reconocimiento del tipo de intruccion y sus respectivos campos
1. Analice la sintaxis de las directivas de ensablador. (Numeral: 6.3.1.3. Algoritmo de ensamble, del libro del proyecto )
.[Directiva] [Arg] [Arg]
Elabore una función que reciba la línea de texto que contiene una directiva X-ISCKER y devuelva por separado cada campo de la directiva.
[Directiva]
[Arg]
[Arg]
2. Analice la sintaxis de las instrucciones RISCKER. (Numeral: 6.3.1.1. Sintaxis del RISCKER ASM, del libro del proyecto o Anexo B, Hoja de datos RISCKER)
[Etiqueta] : [Operación] [Rd] , [Rt] , [Rs] #[Imm/Dir] ;[Comentario]
Elabore una función que reciba la línea de texto que contiene una instrucción RISCKER y devuelva por separado cada campo de la instrucción.
[Etiqueta]
[Operación]
[Rd]
[Rt]
[Rs]
[Imm]
[Comentario]
*Nota: Utilice como guía las instrucciones de ejemplo o la Tabla 1. Listado de instrucciones RISCKER, que se encuentran en el Anexo B, Hoja de datos RISCKER.
Recuerde que estos campos, son una representación simbólica, es decir cadenas de caracteres.
3. Analice la estructura y la distribución de los campos de cata tipo de intrucción presente en la arquitectura RISCKER, desde el punto de vista de la máquina. (Numeral: 6.1.1. Arquitectura del set de instrucciones RISCKER, del libro del proyecto)
Tipo R: [0000][Rd][Rs][Rt][Function] *Nota: Campo Function esta compuesto por: {[ALU operation] [Shift amount]}
Tipo I: [Opcode][Rd][Rs][Inmediato]
Tipo J:
A. [Opcode][Inmediato]
B. [Opcode][Rd][Rs][Inmediato]
C. [Opcode][Rd][Inmediato]
*Nota: Recuerde que estos campos se llenan con el equivalente binario de la instrucción expresada en ensamblador.
Elabore una función que a partir del campo operación (Opcode) de una instrucción RISCKER, devuelva el tipo al cual pertenece y la organización que tienen sus campos, desde el punto de vista de la máquina. Para ello utilice la Tabla 2. Formato de los distintos tipos de instrucciones de la arqutiectura RISCKER que se encuentra en el Anexo B, Hoja de datos RISCKER.
En el caso de las directivas, la funcion devuelve que la instruccion es de tipo "Directiva"
Si es una palabra que no forma parte de las intrucciones enlistadas en la tabla debe devolver un mensaje de error error
EJEMPLO 1:
Valor que entra al programa: "Exit: jrlw r0, ipc, #0 ;Salto Indirecto con Carga a Registro"
Y retorna lo siguiente:
Etiqueta: Exit
Operación: jrlw
Rd: r0
Rs: ipc
Rt: (Vacío)
Imm: 0
Comentario: Salto Indirecto con Carga a Registro
Operación: jrlw, Instrucción Tipo J: Salto Indirecto con Carga a Registro: Carga PC con el valor almacenado en
el registro fuente y actualiza el valor del registro destino con el especificado en el inmediato.
Sus campos son: [Opcode = jrlw][Rd = r0][Rs = ipc][Imm = 0]
EJEMPLO 2:
Valor que entra al programa: ".EQU Valor1 55h"
Y retorna lo siguiente:
Directiva: EQU
Arg: Valor1
Arg: 55h
Tipo Directiva.
PARTE 3: Lenguaje de máquina
1. Analice la Tabla 3. Archivo de registros RISCKER, que se encuentra en el Anexo B, Hoja de datos RISCKER
Elabore una función que a partir del nombre simbólico de un registro devuelva su respectivo index.
EJEMPLO: "rg3" > rg3: Index 28 <
2. Analice la Tabla 2. Formato de los distintos tipos de instrucciones de la arqutiectura RISCKER que se encuentra en el Anexo B, Hoja de datos RISCKER
Reutilize la Función que desarrolló en el numeral 3 de la PARTE 2, y modifiquela para que devuelva el opcode según el campo operación (Segunda columna de la tabla), los index de cada registro en el orden especificado segun el tipo de instrucción. Los Vacíos se llenan con cero (0) y todos los campos se expresan en binario.
Recuerde que cada linea de instrucción RISCKER simboliza una trama de 32bits, es decir un numero de 32 digitos binarios.
EJEMPLO: "Exit: jrlw r0, ipc, #0 ;Salto Indirecto con Carga a Registro"
>Instrucción Tipo J: Salto Indirecto con Carga a Registro: Carga PC con el valor almacenado en
el registro fuente y actualiza el valor del registro destino con el especificado en el inmediato. <
> [jrlw = 0110][r0 = 000000][ipc = 111111][Imm = 0000000000000000] <
> 01100000001111110000000000000000 <
EJEMPLO: "Exit: mult rg0, rg2, gr3 ; rg0 = rg2 * rg3"
> Las instrucciones de tipo Registro o “R” utilizan hasta tres registros como
operandos, dos como fuente de los datos (Rs y Rt) y uno como destino (Rd),
seguidos por un campo de función y uno de cantidad de corrimiento o “shift
amount” (Shamt). Estas funciones se identifican por el Opcode 0000 y la
asignación correspondiente está determinada por el campo función. <
> [0000][Rd = 011001][Rs = 011010][Rt = 011011][Function = 0010001000] <
> 00000110010110100110110010001000 <
PARTE 4: Resolviendo etiquetas
Las etiquetas son el nombre simbólico de la localidad de memoria en que se encuentra la instrucción.
1. Elabore una función que reciba un archivo de texto (https://sites.google.com/site/xiscker/riscker/risckerapplications: Sustentacion_riscker)
y devuelva un archivo de texto que indique el número de la línea (iniciando en uno), el numero de instrucción (iniciando en 0) y la instrucción separada por campos. También el número total de líneas y el número total de instrucciónes
Reutilice las funciones que ya ha elaborado anteriormente.
EJEMPLO:
Si el Archivo de texto contiene:
;contador ascendente
loop: addi rg0,#10 ; rg0 = rg0 +10
; reset out port
xor op
; increment out port
inc op
; jump to loop
j #loop
El el programa devuelve:
[línea 2] [Instr = 0] [Etiqueta = loop] [Operacion = addi] [Rd = rg0] [Rs = rg0] [Rt = (Vacío)] [imm = 10] [Comentario= rg0 = rg0 +10]
[línea 4] [Instr = 1] [Operación = xor] [Rd = op] [Rs = op] [Rt = op]
[línea 6] [Instr = 2] [Operacion = inc] [Rd = op] [Rs = op] [Rt = (Vacío)]
[línea 8] [Instr = 3] [Operación = j] [imm = loop]
8 Líneas.
4 Instrucciones.
2. Elabore una función que tome el resultado del ejercicio anterior y reemplace las etiquetas en el campo inmediato por su valor real, es decir el número de la instrucción, que representa la dirección física de memoria en la cual se encuentra. Indique los valores de cada campo de la instrucción en binario.
Reutilice las funciones que ya ha elaborado anteriormente.
EJEMPLO:
;contador ascendente
loop: addi rg0,#10 ; rg0 = rg0 +10
; reset out port
xor op
; increment out port
inc op
; jump to loop
j #loop
El el programa devuelve:
[línea 2] [Instr = 0] [loop=0] [addi=1000] [rg0=011001] [rg0=011001] [imm = 0000000000001010] [Comentario= rg0 = rg0 +10]
[línea 4] [Instr = 1] [xor=0000] [op=111010] [op=111010] [op=111010] [function= 0000000011]
[línea 6] [Instr = 2] [inc=0000] [op=111010] [op=111010] [function= 0000000111]
[línea 8] [Instr = 3] [j=0001] [loop=0000000000000000000000000000]
8 Líneas.
4 Instrucciones.
PARTE 5: Resolviendo directivas
Las directivas de ensamblador son funciones que se llevan a cabo en el momento de la conversión de lenguaje de ensamblador a lenguaje de máquina, estas funciones no pertecen
al set de instrucciones del procesador.
El Riscker va soportar directivas:
.include: Inserta el contenido de un archivo de texto plano desde la línea en que se encuantra la directiva.
Sintaxis: .include <Nombre del archivo.txt>
Ejemplo: .include constantes.txt
.equ: Asigna un valor simbólico a una constante.
Sintaxis: .equ <nombre> <valor>
Ejemplo .equ Contador rg9
.data: aplica el formato de inicialización de memoria a un conjunto de datos.
a su vez asigna un nombre simbólico a la dirección que apunta al primer dato de la lista.
Sintaxis: .data <nombre> <dirección> [<dato 0, dato 1, ... , dato n >]
Sintaxis: .data <nombre> <Nombre del archivo.txt>
Ejemplo .data tabla 100h [18, 20, 30, 22, 1, 2]
1. Elabore una función que resuelva la directiva equ.
puede guiarse de los siguientes pasos:
a. Buscar en el texto si hay una directiva
b. identificar si es equ
c. buscar y remplazar en el texto las palabaras <nombre> por <valor>
d. repetir el proceso hasta que no hayan más directivas
2. Elabore una función que resuelva la directiva include:
puede guiarse de los siguientes pasos:
a. Buscar en el texto si hay una directiva
b. identificar si es include
c. insertar el contenido del archivo desde el número de la línea en que se encuentra la directiva
d. repetir el proceso hasta que no hayan más directivas
Como en este punto ya se cuenta con la función que resuelve la direciva equ, si el archivo contiene una directiva equ, debe resolverla
si el archivo contiene una directiva include, debe resolverla (Atención con las inclusiones cíclicas infinitas, por ejemplo que se incluya a si mismo)
3. elabore una función que resuelva la directiva .data
para hacer un archivo de inicialización de memoria, se debe generar un archivo de texto plano con extención .mif y el siguiente formato:
WIDTH=16;
DEPTH=511;
ADDRESS_RADIX=DEC;
DATA_RADIX=DEC;
CONTENT BEGIN
[<Dirección inicial>..<dirección final>] : <valor por defecto>;
<dirección>:<valor>;
<dirección>:<valor>;
<dirección>:<valor>;
<dirección>:<valor>;
[<dirección>..16383] : <valor por defecto>;
END;
Ejemplo .data tabla 100h [18, 20, 30, 22, 1, 2]
debe generar un archivo con extención .mif y con el siente contenido
WIDTH=16;
DEPTH=511;
ADDRESS_RADIX=DEC;
DATA_RADIX=DEC;
CONTENT BEGIN
[0..255] : 00;
256:18;
257:20;
258:30;
259:22
260:1;
261:2;
[262..16383] : 00;
END;
si hay varias directivas .data estas no deben traslaparse y sólo se genera un único archivo que las contiene a todas.
Ejemplo
.data constantes 0h [5, 33h, 11, 33, 10b]
.data tabla 100h [18, 20, 30, 22, 1, 2]
debe generar el siguiente archivo
WIDTH=16;
DEPTH=511;
ADDRESS_RADIX=DEC;
DATA_RADIX=DEC;
CONTENT BEGIN
0:5;
1:33;
2:11;
3:51;
4:2;
[5..255] : 00;
256:18;
257:20;
258:30;
259:22
260:1;
261:2;
[262..511] : 00;
END;