MARS (MIPS Assembler and Rutine Simulator )
Programación en MIPS MIPS( Microprocessor without Interlocked Pipeline Stages ) MARS es un entorno de desarrollo integrado (IDE) ligero para programar en lenguaje ensamblador MIPS, destinados a la educación. Camino típico: Ensamblador de MIPS. Traduce instrucciones de lenguaje ensamblador a lenguaje de máquina. Probar el código en un simulador de MIPS. Correr el código objeto en un sistema MIPS real.
Programación en MIPS Sistemas para Windows: MARS. Desarrollado en Missouri State University.  http://courses.missouristate.edu/KenVollmar/MARS/ El sistema ofrece: Interface gráfica de usuario. Ensamblador extendido con seudo-instrucciones. Simulador de una arquitectura MIPS.
HISTORIA MARS 1.0 fue lanzado en enero de 2005 y difundido durante una presentación de afiches en SIGCSE 2005.  MARS 2.0 fue lanzado en septiembre de 2005. Se incorporaron modificaciones de importancia tanto a la interfaz gráfica como al ensamblador, registros de punto flotante y las instrucciones más relevantes.  MARS 3.0 fue lanzado en agosto de 2006, su importancia radica en una gran expansión del conjunto de instrucciones MIPS-32. En enero 2010, fue lanzada la versión 3.8. Tiene como novedad dos nuevas herramientas aportadas por Ingo Kofler de la Universidad de Klagenfurt en Austria.
MARS MARS tiene algunas ventajas: Configurable. Herramientas. Por ejemplo para visualizar los accesos a memoria y un simulador de un caché de datos. No requiere instalación (privilegios de administrador). MARS tiene algunas desventajas: Al depender de la máquina virtual de Java algunos estudiantes tienen problemas de instalación en su respectivo Sistema Operativo. La aplicación está disponible sólo en inglés.
Uso de la memoria Por convención, los sistemas basados en MIPS dividen la memoria en 3 segmentos: Segmento de texto ( text segment ). Segmento de datos ( data segment ). Segmento de pila ( stack segment ).
Segmento de texto El segmento de texto, a partir de la dirección 400000 16 , es donde se guarda el código del programa. En los programas, el segmento de texto se marca por medio de la instrucción  .text .
Segmento de datos El segmento de datos ( data segment ), a partir de la dirección 10000000 16 , es donde se guardan los datos. Se indica por medio de la instrucción  .data . A su vez, el segmento de datos consta de dos partes: Datos estáticos. Contiene variables de tamaño fijo y que necesitan ser accesados durante todo el programa. Por ejemplo, variables globales. Datos dinámicos. Contiene variables que se crean durante el programa. Por ejemplo, espacio asignado con malloc en C, u objetos creados en Java.
Segmento de pila El segmento de pila ( stack segment ), a partir de la dirección  7FFFFFFC 16 ,  es donde se guardan los stack frames.
Uso de la memoria Reservado Datos estáticos Datos dinámicos Segmento de texto Segmento de datos Segmento de pila 400000 16 10000000 16 7FFFFFFC 16
Acceso a la memoria Por convención, los sistemas MIPS dedican el registro $gp como apuntador a los datos estáticos. Asignándole a $gp la dirección 10008000 16  y usando constantes de 16 bits con signo, el programa puede accesar los primeros 64KB del segmento de datos (direcciones 10000000 16  a 10010000 16 ). Por ejemplo, la instrucción: lw $v0, 0x8000($gp) Carga la palabra que comienza en 10000000 16 .
Llamadas a sistema SPIM y MARS ofrecen servicios tipo sistema operativo a través de la instrucción  syscall . Los servicios permiten leer del teclado, escribir a la consola y manejar archivos del sistema. Para pedir un servicio, el programa carga el número de servicio en $v0 y los argumentos en $a0-$a3. Los servicios que regresan un valor lo hacen en $v0.
Hola mundo en MIPS .data str: .asciiz  “ Hola mundo” .text main: li $v0, 4  # llamada al sistema para print_str la $a0, str  # dirección del string a imprimir syscall  # imprime el string li $v0, 10  # llamada al sistema para terminar syscall  # termina
Llamadas al sistema Servicio Código Argumentos Resultado print _int 1 $a0 = integer print_float 2 $f12 = float print_double 3 $f12 = float print_string 4 $a0 = string read _int 5 integer (en $v0) read_float 6 float (en $v0) read_double 7 double (en $v0) read_string 8 $a0 = buffer, $a1 =  tamaño sbrk 9 $a0 = cantidad direcci ón  (en $v0) exit 10 print_char 11 $a0 = char read_char 12 char (en $v0) open 13 $a0 = nombre del archivo (string), $a1 = banderas, $a2 = modo handle (en $a0) read 14 $a0 = handle, $a1 = buffer, $a2 = tama ño num. de caracteres leídos (en $a0) write 15 $a0 = handle, $a1 = buffer, $a2 = tama ño num. de caracteres escritos (en $a0) close 16 $a0 = handle exit2 17 $a0 = result
Lenguaje ensamblador Comentarios con gato (#) o punto y coma (;). Los identificadores pueden tener letras, números, puntos (.) y guiones bajos (_). No pueden comenzar con número. Los opcodes son palabras reservadas. Las etiquetas terminan con dos puntos (:). .data item:  .word 1 .text .globl main # Debe ser global main: lw $t0, item
Lenguaje ensamblador Los números están en base 10 por default. La base 16 se indica con 0x. Los strings se encierran con comillas dobles (“”). Caracteres especiales en strings como en C Nueva línea \n Tabulador \t Comilla  \“
Directivas del ensamblador .align n – Alinea el dato a 2 n  bytes. Con n=0 se suspende la alineación hasta el siguiente .data. .ascii str – Almacena un string en memoria, pero no lo termina en nulo. .asciiz str - Almacena un string en memoria y lo termina en nulo. .byte b 1 …b n  – Almacena los valores en bytes consecutivos de memoria.
Directivas del ensamblador .data [dir] – Define el comienzo del segmento de datos. Si el argumento opcional  dir  está presente, el segmento comienza en esa dirección. .double d 1 ,…, d n  – Almacena los valores reales de doble precisión en localidades consecutivas de memoria. .extern sym size – Declara que el dato almacenado en  sym  tiene tamaño  size  y es global. El dato está guardado en el segmento de datos. .float f 1 ,…, f n  – Almacena los valores reales de precisión sencilla en localidades consecutivas de memoria.
Directivas del ensamblador .globl sym – Declara que  sym  es global y puede ser accesado desde otros archivos. .half h 1 ,…, h n  – Almacena los datos de 16 bits en medias palabras consecutivas de memoria. .kdata [dir] – Define el comienzo del segmento de datos del kernel. Si el argumento opcional  dir  está presente, el segmento comienza en esa dirección. .ktext [dir] – Define el comienzo del segmento de código del kernel. Si el argumento opcional  dir  está presente, el segmento comienza en esa dirección.
Directivas del ensamblador .space n – Reserva  n  bytes de espacio en el segmento actual. En SPIM debe ser el segmento de datos. .text [dir] – Define el comienzo del segmento de código. Si el argumento opcional  dir  está presente, el segmento comienza en esa dirección. .word w 1 ,…, w n  – Almacena los datos de 32 bits en palabras consecutivas de memoria.

Mars

  • 1.
    MARS (MIPS Assemblerand Rutine Simulator )
  • 2.
    Programación en MIPSMIPS( Microprocessor without Interlocked Pipeline Stages ) MARS es un entorno de desarrollo integrado (IDE) ligero para programar en lenguaje ensamblador MIPS, destinados a la educación. Camino típico: Ensamblador de MIPS. Traduce instrucciones de lenguaje ensamblador a lenguaje de máquina. Probar el código en un simulador de MIPS. Correr el código objeto en un sistema MIPS real.
  • 3.
    Programación en MIPSSistemas para Windows: MARS. Desarrollado en Missouri State University. http://courses.missouristate.edu/KenVollmar/MARS/ El sistema ofrece: Interface gráfica de usuario. Ensamblador extendido con seudo-instrucciones. Simulador de una arquitectura MIPS.
  • 4.
    HISTORIA MARS 1.0fue lanzado en enero de 2005 y difundido durante una presentación de afiches en SIGCSE 2005. MARS 2.0 fue lanzado en septiembre de 2005. Se incorporaron modificaciones de importancia tanto a la interfaz gráfica como al ensamblador, registros de punto flotante y las instrucciones más relevantes. MARS 3.0 fue lanzado en agosto de 2006, su importancia radica en una gran expansión del conjunto de instrucciones MIPS-32. En enero 2010, fue lanzada la versión 3.8. Tiene como novedad dos nuevas herramientas aportadas por Ingo Kofler de la Universidad de Klagenfurt en Austria.
  • 5.
    MARS MARS tienealgunas ventajas: Configurable. Herramientas. Por ejemplo para visualizar los accesos a memoria y un simulador de un caché de datos. No requiere instalación (privilegios de administrador). MARS tiene algunas desventajas: Al depender de la máquina virtual de Java algunos estudiantes tienen problemas de instalación en su respectivo Sistema Operativo. La aplicación está disponible sólo en inglés.
  • 6.
    Uso de lamemoria Por convención, los sistemas basados en MIPS dividen la memoria en 3 segmentos: Segmento de texto ( text segment ). Segmento de datos ( data segment ). Segmento de pila ( stack segment ).
  • 7.
    Segmento de textoEl segmento de texto, a partir de la dirección 400000 16 , es donde se guarda el código del programa. En los programas, el segmento de texto se marca por medio de la instrucción .text .
  • 8.
    Segmento de datosEl segmento de datos ( data segment ), a partir de la dirección 10000000 16 , es donde se guardan los datos. Se indica por medio de la instrucción .data . A su vez, el segmento de datos consta de dos partes: Datos estáticos. Contiene variables de tamaño fijo y que necesitan ser accesados durante todo el programa. Por ejemplo, variables globales. Datos dinámicos. Contiene variables que se crean durante el programa. Por ejemplo, espacio asignado con malloc en C, u objetos creados en Java.
  • 9.
    Segmento de pilaEl segmento de pila ( stack segment ), a partir de la dirección 7FFFFFFC 16 , es donde se guardan los stack frames.
  • 10.
    Uso de lamemoria Reservado Datos estáticos Datos dinámicos Segmento de texto Segmento de datos Segmento de pila 400000 16 10000000 16 7FFFFFFC 16
  • 11.
    Acceso a lamemoria Por convención, los sistemas MIPS dedican el registro $gp como apuntador a los datos estáticos. Asignándole a $gp la dirección 10008000 16 y usando constantes de 16 bits con signo, el programa puede accesar los primeros 64KB del segmento de datos (direcciones 10000000 16 a 10010000 16 ). Por ejemplo, la instrucción: lw $v0, 0x8000($gp) Carga la palabra que comienza en 10000000 16 .
  • 12.
    Llamadas a sistemaSPIM y MARS ofrecen servicios tipo sistema operativo a través de la instrucción syscall . Los servicios permiten leer del teclado, escribir a la consola y manejar archivos del sistema. Para pedir un servicio, el programa carga el número de servicio en $v0 y los argumentos en $a0-$a3. Los servicios que regresan un valor lo hacen en $v0.
  • 13.
    Hola mundo enMIPS .data str: .asciiz “ Hola mundo” .text main: li $v0, 4 # llamada al sistema para print_str la $a0, str # dirección del string a imprimir syscall # imprime el string li $v0, 10 # llamada al sistema para terminar syscall # termina
  • 14.
    Llamadas al sistemaServicio Código Argumentos Resultado print _int 1 $a0 = integer print_float 2 $f12 = float print_double 3 $f12 = float print_string 4 $a0 = string read _int 5 integer (en $v0) read_float 6 float (en $v0) read_double 7 double (en $v0) read_string 8 $a0 = buffer, $a1 = tamaño sbrk 9 $a0 = cantidad direcci ón (en $v0) exit 10 print_char 11 $a0 = char read_char 12 char (en $v0) open 13 $a0 = nombre del archivo (string), $a1 = banderas, $a2 = modo handle (en $a0) read 14 $a0 = handle, $a1 = buffer, $a2 = tama ño num. de caracteres leídos (en $a0) write 15 $a0 = handle, $a1 = buffer, $a2 = tama ño num. de caracteres escritos (en $a0) close 16 $a0 = handle exit2 17 $a0 = result
  • 15.
    Lenguaje ensamblador Comentarioscon gato (#) o punto y coma (;). Los identificadores pueden tener letras, números, puntos (.) y guiones bajos (_). No pueden comenzar con número. Los opcodes son palabras reservadas. Las etiquetas terminan con dos puntos (:). .data item: .word 1 .text .globl main # Debe ser global main: lw $t0, item
  • 16.
    Lenguaje ensamblador Losnúmeros están en base 10 por default. La base 16 se indica con 0x. Los strings se encierran con comillas dobles (“”). Caracteres especiales en strings como en C Nueva línea \n Tabulador \t Comilla \“
  • 17.
    Directivas del ensamblador.align n – Alinea el dato a 2 n bytes. Con n=0 se suspende la alineación hasta el siguiente .data. .ascii str – Almacena un string en memoria, pero no lo termina en nulo. .asciiz str - Almacena un string en memoria y lo termina en nulo. .byte b 1 …b n – Almacena los valores en bytes consecutivos de memoria.
  • 18.
    Directivas del ensamblador.data [dir] – Define el comienzo del segmento de datos. Si el argumento opcional dir está presente, el segmento comienza en esa dirección. .double d 1 ,…, d n – Almacena los valores reales de doble precisión en localidades consecutivas de memoria. .extern sym size – Declara que el dato almacenado en sym tiene tamaño size y es global. El dato está guardado en el segmento de datos. .float f 1 ,…, f n – Almacena los valores reales de precisión sencilla en localidades consecutivas de memoria.
  • 19.
    Directivas del ensamblador.globl sym – Declara que sym es global y puede ser accesado desde otros archivos. .half h 1 ,…, h n – Almacena los datos de 16 bits en medias palabras consecutivas de memoria. .kdata [dir] – Define el comienzo del segmento de datos del kernel. Si el argumento opcional dir está presente, el segmento comienza en esa dirección. .ktext [dir] – Define el comienzo del segmento de código del kernel. Si el argumento opcional dir está presente, el segmento comienza en esa dirección.
  • 20.
    Directivas del ensamblador.space n – Reserva n bytes de espacio en el segmento actual. En SPIM debe ser el segmento de datos. .text [dir] – Define el comienzo del segmento de código. Si el argumento opcional dir está presente, el segmento comienza en esa dirección. .word w 1 ,…, w n – Almacena los datos de 32 bits en palabras consecutivas de memoria.