17.04.2015 Views

Introducción a la máquina Q

Introducción a la máquina Q

Introducción a la máquina Q

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q<br />

( versión 3.7 )<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.1


Objetivos de diseño<br />

Máquina didáctica inspirada en cuádrup<strong>la</strong>s<br />

Simple, simi<strong>la</strong>r a una <strong>máquina</strong> RISC<br />

pocos registros<br />

pocas operaciones, simples y ortogonales<br />

Cómoda como código objeto a generar por el compi<strong>la</strong>dor<br />

intérprete-depurador IQ —posibilidad de usar con<br />

VDE<br />

directamente compi<strong>la</strong>ble: subconjunto de C<br />

alta transportabilidad del código Q<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.2


¡<br />

¡<br />

¡<br />

¡<br />

Arquitectura (1/2)<br />

8 registros enteros (32 bits): R0<br />

¡R7<br />

4 registros coma flotante (64 bits): RR0<br />

¡RR3<br />

Memoria de datos<br />

bytes en big endian (preferiblemente alineados)<br />

direcciones de 32 bits<br />

pi<strong>la</strong> (zona estática en su base)<br />

R7 seña<strong>la</strong> al último byte ocupado de <strong>la</strong> pi<strong>la</strong><br />

pi<strong>la</strong> crece (al acceder a el<strong>la</strong>) hacia direcciones<br />

menores<br />

heap, para asignación dinámica<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.3


Arquitectura (2/2)<br />

Tipos de datos<br />

entero-32 sin signo (P)<br />

char/byte sin signo (U)<br />

entero-16 (S) y entero-32 (I)<br />

coma flotante-32 (F) y 64 (D)<br />

Memoria de código<br />

separada de <strong>la</strong> de datos<br />

sólo se puede saltar a instrucciones con etiqueta<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.4


Instrucciones Q (1/2)<br />

Hemos de leer<strong>la</strong>s como instrucciones C (que son :)<br />

únicamente: cálculo, lectura/escritura memoria y<br />

salto<br />

siempre terminadas en punto y coma<br />

pueden llevar etiqueta(s)<br />

R0=-R1;<br />

L 11: R3=R0*-2;<br />

U(R7)=’a’;<br />

R3=I(R7+12);<br />

IF(R3>0) GT(11);<br />

GT(R5);<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.5


Instrucciones Q (2/2)<br />

Operaciones:<br />

operadores binarios y unarios C no asignativos (++,<br />

+=, ..)<br />

Operandos: tipos C en registros y cantidades<br />

reales y enteros (incl. char), signo opcional<br />

Las de acceso a memoria llevan cálculo en dirección<br />

Las de salto llevan cálclo en el IF opcional<br />

¡TODAS LAS DEMÁS COMBINACIONES NO SON<br />

VÁLIDAS EN Q!<br />

Truco: usar IQ para comprobar si instrucción es Q o no<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.6


Dec<strong>la</strong>raciones en Q<br />

Permiten definir estáticamente (antes de ejecución) zonas<br />

de memoria y datos en el<strong>la</strong>.<br />

Ocupan desde Z-1 hacia 0 (por defecto Z=0x12000)<br />

MEM(0x11ff0,8);<br />

FIL(0x11f00,50,0xff);<br />

DAT(0x11ef8,U,’a’);<br />

STR(0x11ee0,”una ristra”);<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.7


Programas en Q<br />

Forma general de un programa en Q:<br />

BEGIN<br />

instrucciones<br />

...<br />

END<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.8


Programas en Q<br />

Forma general de un programa en Q:<br />

BEGIN<br />

instrucciones<br />

STAT(0)<br />

dec<strong>la</strong>raciones<br />

...<br />

END<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.8


Programas en Q<br />

Forma general de un programa en Q:<br />

BEGIN<br />

instrucciones<br />

STAT(0)<br />

dec<strong>la</strong>raciones<br />

CODE(0)<br />

instrucciones<br />

...<br />

END<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.8


Programas en Q<br />

Forma general de un programa en Q:<br />

BEGIN<br />

instrucciones<br />

STAT(0)<br />

dec<strong>la</strong>raciones<br />

CODE(0)<br />

instrucciones<br />

STAT(1)<br />

dec<strong>la</strong>raciones<br />

...<br />

END<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.8


Compi<strong>la</strong>ción de un programa en Q<br />

Normalmente mejor interpretar con IQ: ¡mensajes de<br />

error mucho mejores!<br />

Para compi<strong>la</strong>r: gcc nombre.q.c Qlib.c<br />

Es necesario encabezamiento<br />

#include “Q.h”<br />

—IQ, por compatibilidad, espera tal encabezamiento<br />

Antes de compi<strong>la</strong>r (o interpretar) interviene cpp, lo que<br />

permite usar macros, includes y comentarios tipo C.<br />

Por consiguiente, los “verdaderos” comentarios en Q<br />

tienen <strong>la</strong> forma:<br />

#comentario<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.9


Carga y ejecución<br />

1. Carga: se procesan todas <strong>la</strong>s dec<strong>la</strong>raciones por su<br />

orden<br />

2. Se inicializa R7 alineado justo debajo zona estática<br />

3. Comienza <strong>la</strong> ejecución de instrucciones desde L 0:<br />

GT(-1) breakpoint al interpretar<br />

GT(-2) termina ejecución<br />

Otras etiquetas negativas: Qlib<br />

Si se accede fuera de memoria asignada (p.e. debajo de<br />

R7) normalmente aborta<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.10


Ficheros<br />

Disponibles en serdis/˜ii-pl<br />

Qman.txt definición, insta<strong>la</strong>ción, ¡leer detenidamente!<br />

Q.h macros que definen Q<br />

Qlib.h dec<strong>la</strong>raciones macros opcionales<br />

Qlib.c biblioteca funciones (ampliable)<br />

IQ.o intérprete ya compi<strong>la</strong>do (para insta<strong>la</strong>r)<br />

ejemplos/ algunos programas en Q<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.11


Biblioteca Qlib<br />

Funciones de biblioteca en C l<strong>la</strong>mables desde Q<br />

Facilidad para acceder desde C a registros y<br />

memoria Q —atención: ristras Q en orden inverso<br />

vistas desde C<br />

Incialmente printf y malloc simples<br />

¡El paso de parámetros no tiene por qué coincidir<br />

con el generado por el compi<strong>la</strong>dor para <strong>la</strong>s funciones<br />

que compi<strong>la</strong>!<br />

Reinsta<strong>la</strong>r IQ al modificar Qlib<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.12


Máquina virtual Q<br />

Insta<strong>la</strong>ción: gcc IQ.o Qlib.c -o IQ<br />

Ejecución: IQ nombre.q.c<br />

Depuración: IQ nombre.q.c -g<br />

Comandos:<br />

Ayuda (h)<br />

Visualización registros, memoria, programa y estado<br />

Carga, ejecución, paso a paso, breakpoints<br />

Ejecución interactiva de instrucción Q<br />

Posibilidad de usar con VDE (visualización gráfica pi<strong>la</strong> y<br />

punteros)<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.13


Implementación de una QVM<br />

Q definido en Qman.txt<br />

Estructuras internas de datos, registros y código<br />

Trabajar con resultado de cpp<br />

Procesar primero dec<strong>la</strong>raciones, y luego sólo<br />

instrucciones<br />

Si el lenguaje de implementación no permite ciertas operaciones,<br />

crear funciones “externas” para ello<br />

<strong>Introducción</strong> a <strong>la</strong> <strong>máquina</strong> Q 3.7 (0.1) c 2006 José Fortes Gálvez – p.14

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!