Estructura de Computadores 4.- Programación en Ensamblador Parte II UNIVERSIDAD CARLOS III DE MADRID Área de Arquitectura y Tecnología de Computadores Contenido Directivas del ensamblador. Instrucciones de carga. Instrucciones de almacenamiento. Direccionamiento en carga y almacenamiento. Introducción a los saltos Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 2 – Segmento de datos Permite reservar posiciones de memoria en el segmento de datos. Iniciado por la directiva del ensamblador .data z Permite etiquetar posiciones de memoria. z Se puede indicar (opcionalmente) la posición de inicio. z En la sección data se pueden usar otras directivas. .data #posiciones de memoria .text #código del programa Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 3 – Directiva .word Permite almacenar datos de 32 bits. x: v: .data .word 10 .word 1,0xffffffff, 3, 5 Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 4 – Direccionamiento a nivel de byte 1 palabra = 4 bytes. Direcciones de memoria de MIPS Æ Dirección de un byte. Direcciones de palabras son múltiplos de 4. Dentro de una palabra hay dos posibilidades z Big Endian. z Little Endian. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 5 – Directiva .byte Permite almacenar datos de 8 bits x: y: .data .byte 255, 1, 2, 3 .byte 0x77, 0xff, 0x77, 0xff Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 6 – Directiva .half Permite almacenar datos de 16 bits. x: y: .data .half 355, 1, 2, 3 .half 0x0077, 0x1ff, 0x707, 0xffaa Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 7 – Directivas .float y .double Almacenan números en simple y doble precisión x: y: .data .float 1.3e-1 .double 1.5e+2, 0.5e-4 Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 8 – Directivas .ascii y .asciiz Almacenan cadenas con terminador nulo (.asciiz) o sin terminador (.ascii). cad1: cad2: cad3: .data .ascii “Hola” .asciiz “Hola” .ascii “Hola” Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 H o l a H o l a H o l a \0 Página – 9 – Directiva .space Reserva de espacio en el segmento de datos. z Útil para reserva de espacio para arrays. v: .data .space Segmento de pila 7 Segmento de datos Segmento de texto Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 10 – Alineación – Directiva .align Alinea el siguiente dato a una dirección múltiplo de 2n. Cad1: byte1: .data .asciiz "Hola" .align 1 .byte 0xff .align 1 .byte 0x2f Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 11 – Tipos de instrucciones MIPS Instrucciones z Son instrucciones reales del microprocesador. Pseudoinstrucciones z Son instrucciones que el ensamblador simula mediante varias instrucciones. z Hacen uso interno del registro $at. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 12 – Instrucciones de carga lw $reg, dir z Instrucción. z Load word. z Carga en el registro $reg la palabra que se encuentra en la dirección de memoria indicada por dir. ld $reg, dir z Pseudoinstrucción. z Load doubleword z Carga en los registros $reg y $reg+1 el valor de 64 bits que se encuentra almacenado a partir de la dirección de memoria indicada por dir. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 13 – Instrucciones de carga la $reg, dir z Pseudoinstrucción. z Load address. z Carga la dirección en el registro reg. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 14 – Instrucciones de carga lui $reg, inm z Instrucción. z Load upper inmediate. z Carga el dato inmediato inm (de 16 bits) en la mitad superior del registro $reg. li $reg, inm z Pseudoinstrucción. z Load inmediate. z Carga el dato inmediato inm en el registro $reg. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 15 – Instrucciones de carga lb $reg, dir z Instrucción. z Load byte. z Carga en el registro $reg el byte que se encuentra en la dirección de memoria indicada por dir. z Extiende signo del valor cargado en el registro lbu $reg, dir z Instrucción. z Load byte unsigned. z Carga en el registro $reg el byte que se encuentra en la dirección de memoria indicada por dir. z No extiende signo del valor cargado en el registro. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 16 – Instrucciones de carga lh $reg, dir z Instrucción. z Load halfword. z Carga en el registro $reg el valor de 16 bits que se encuentra en la dirección de memoria indicada por dir. z Extiende el signo del valor cargado en el registro. lhu $reg, dir z Instrucción. z Load halfword unsigned. z Carga en el registro $reg el valor de 16 bits que se encuentra en la dirección de memoria indicada por dir. z No extiende el signo del valor cargado en el registro. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 17 – Instrucciones de carga lwl $reg, dir Instrucción. z Load word left. z dir puede ser una dirección no alineada. z Carga los bytes desde la posición dir hasta el límite inferior de palabra en el registro $reg, rellenando con 0 por la derecha. z lwr $reg, dir Instrucción. z Load word right. z dir puede ser una dirección no alineada. z Carga los bytes desde la posición dir hasta el límite superior de palabra en el registro $reg, rellenando con 0 por la izquierda. z Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 18 – Instrucciones de carga ulh $reg, dir z Pseudoinstrucción. z Unaligned load halfword z dir puede ser una dirección no alineada. z Carga en el registro $reg el valor de 16 bits que se encuentra en la dirección de memoria indicada por dir. z Extiende el signo del valor cargado en el registro. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 19 – Instrucciones de carga ulhu $reg, dir z Pseudoinstrucción. z Unaligned load halfword unsigned. z dir puede ser una dirección no alineada. z Carga en el registro $reg el valor de 16 bits que se encuentra en la dirección de memoria indicada por dir. z No extiende el signo del valor cargado en el registro. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 20 – Instrucciones de carga ulw $reg, dir z Pseudoinstrucción. z Unaligned load word. z dir puede ser una dirección no alineada. z Carga en el registro $reg el valor de 32 bits que se encuentra en la dirección de memoria indicada por dir. z No extiende el signo del valor cargado en el registro. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 21 – Instrucciones de carga lwc0 lwc1 lwc2 lwc3 $reg, $reg, $reg, $reg, dir dir dir dir z Carga en el registro $reg del correspondiente coprocesador la palabra que se encuentra en la dirección indicada por dir. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 22 – Instrucciones de almacenamiento sw $reg, dir z Instrucción. z Store word. z Guarda el valor de $reg en la dirección dir. sd $reg, dir z Pseudoinstrucción. z Store doubleword. z Guarda el valor de los registros $reg y $reg+1 en la dirección dir. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 23 – Instrucciones de almacenamiento sb $reg, dir z Instrucción. z Store byte. z Guarda el byte de menor peso del registro $reg en la dirección dir. sh $reg, dir z Instrucción. z Store halfword. z Guarda la media palabra de menos peso del registro $reg en la dirección dir. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 24 – Instrucciones de almacenamiento swl $reg, dir z Instrucción. z Store word left. z dir puede ser una dirección no alineada. z Rellena desde la dirección dir hasta el limite inferior de la palabra con los bytes de la parte izquierda del registro $reg. swr $reg, dir z Instrucción. z Store word right. z dir puede ser una dirección no alineada. z Rellena desde la dirección dir hasta el límite superior de la palabra con los bytes de la parte derecha del registro $reg. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 25 – Instrucciones de almacenamiento ush $reg, dir z Pseudoinstrucción. z Unaligned store halfword. z dir puede ser una dirección no alineada. z Guarda la media palabra de menos peso del registro $reg en la dirección dir. usw $reg, dir z Pseudoinstrucción. z Unaligned store word. z dir puede ser una dirección no alineada. z Guarda la palabra del registro $reg en la dirección dir. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 26 – Instrucciones de carga swc0 swc1 swc2 swc3 $reg, $reg, $reg, $reg, dir dir dir dir z Guarda la palabra del registro $reg del correspondiente coprocesador en la dirección dir. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 27 – Direccionamiento Formato de instrucción de carga y almacenamiento: z op $reg, dir dir puede referenciar el valor de diversas formas z Diversos tipos de direccionamiento. Razones: z Poder direccionar todo el mapa de memoria. z Disponer de direccionamientos más rápidos para los accesos más frecuentes. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 28 – Direccionamiento inmediato Objeto = Dato inmediato. z op $reg, inm OP 6 bits 0 $reg 5 bits 5 bits inm 16 bits lui $1, 0xa73b 0x0f 6 bits 0 1 5 bits 5 bits 0xa73b 16 bits Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 29 – Direccionamiento indirecto Objeto se obtiene a través de la dirección almacenada en otro registro. z op $reg1, ($reg2) OP 6 bits $reg2 5 bits $reg1 5 bits 0 16 bits lw $t1, ($t2) 0x23 0xa 6 bits 5 bits 0x9 5 bits 0 16 bits Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 30 – Ejemplo .data .word 0x11223344 .word 0x55667788 .text .globl main x: y: main: la lw jr $t1, x $t2, ($t1) $ra Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 31 – Direccionamiento indexado Dirección del objeto se obtiene sumando el valor de un registro a un desplazamiento. z op $reg1, desplazamiento($reg2) OP 6 bits $reg2 5 bits $reg1 5 bits desplazamiento 16 bits lw $t1, 300($t2) 0x23 0xa 6 bits 5 bits 0x9 5 bits 0x012c 16 bits Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 32 – Salto incondicional j dir Instrucción. z Jump. z Salta a la dirección dir. z beq $reg1, $reg2, dir Instrucción. z Branch if equal. z Salta a la dirección dir si $reg1 es igual a $reg2 z bne $reg1, $reg2, dir Instrucción. z Branch if not equal z Salta a la dirección dir si $reg1 no es igual a $reg2 z Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 33 – Actividad Escriba un programa que sume todos los elementos de un array de números enteros. z El array tendrá 12 posiciones. z Cada posición estará formada por un número entero de 16 bits. z El programa dejará el resultado en $s0. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 34 – Actividad Escriba un programa que cuente las vocales que hay en una cadena. z ¡¡ Idea !! Î Utilice un vector con los valores de las vocales para realizar las comparaciones. Área de Arquitectura y Tecnología de Computadores UNIVERSIDAD CARLOS III DE MADRID Estructura de Computadores – Programación en ensamblador (II) Curso 2005/2006 Página – 35 –