Universidad Carlos III de Madrid Ingeniería Informática Estructura de Computadores Práctica 1: Programación en ensamblador Contenidos • Prácticas con SPIM: – Programa, documentación y enunciados. • Linux/Windows: – Entrar, salir, password y correo. • MIPS: – Bloques, registros, memoria, ensamblador. • SPIM: – Uso del simulador. • Ideas de diseño de programas: – Tipos datos básicos, estructuras de control, funciones. http://arcos.inf.uc3m.es/~ii_ec 2 Prácticas con SPIM (1) – Asignatura: • http://www.arcos.inf.uc3m.es/~ii_ec/ – Programa y documentación. • http://www.arcos.inf.uc3m.es/~ii_ec/descripcion.html #materiales – Enunciado de las prácticas. • http://www.arcos.inf.uc3m.es/~ii_ec/descripcion.html #practicas http://arcos.inf.uc3m.es/~ii_ec 3 Prácticas con SPIM (y 2) – Para mandar correo: • Dudas generales (normas, etc.): – mail [email protected] • Dudas sobre organización clases prácticas: – {fjblas,lmsan,acaldero,moises}@arcos.inf.uc3m.es • Dudas de la práctica – FORO -> http://apps.lab.inf.uc3m.es/foro/viewforum.php?f=8&sid=0 150272723b6719bbedcaf2b769b1a26 http://arcos.inf.uc3m.es/~ii_ec 4 Linux • Consultar el procedimiento de apertura de cuentas en: – http://www.lab.inf.uc3m.es/ • Estar atentos a los avisos del laboratorio los cuales se publican en los tablones de las aulas y en la Web: – http://www.lab.inf.uc3m.es/ http://arcos.inf.uc3m.es/~ii_ec 5 MIPS: introducción • Características del MIPS R2000 / R3000: – Procesadores de 32 bits. – Arquitectura RISC. – Hay 32 registros de 32 bits. • Se utilizará un simulador basado en MIPS R2000 / R3000: – SPIM. – Versiones para Windows, DOS y Linux. http://arcos.inf.uc3m.es/~ii_ec 6 MIPS: Diagrama de bloques http://arcos.inf.uc3m.es/~ii_ec 7 MIPS: Registros • Hay 32 registros de 32 bits. NOMBRE REGISTRO zero at v0, v1 a0, ..., a3 t0, ..., t7 s0, ..., s7 t8, t9 k0, k1 gp sp fp ra NÚMERO USO 0 1 2, 3 4, ...,7 8, ..., 15 16, ..., 23 24, 25 26, 27 28 29 30 31 Constante 0 Reservado para el ensamblador Evaluación de expresión y resultado de una rutina Argumento de entrada para rutinas Temporal (NO se conserva contenido entre llamadas) Temporal (se conserva contenido entre llamadas) Temporal (NO se conserva contenido entre llamadas) Reservado por el nucleo del sistema operativo. Puntero al area global Puntero a pila Puntero a marco de pila Direcciòn de retorno (usado en llamada de rutina) http://arcos.inf.uc3m.es/~ii_ec 8 MIPS: memoria • Datos estáticos, dinámicos y pila. Segmento de pila 0x7FFFFFFF Segmento de datos 0x10000000 Segmento de código 0x00400000 Reservado 0x00000000 http://arcos.inf.uc3m.es/~ii_ec 9 MIPS: Ensamblador Etiqueta: código instrucción, pseudo instr. ó directiva operandos # esto es un comentario hasta fin de línea .data item: .word 1 .text .globl main main: lw st0, item http://arcos.inf.uc3m.es/~ii_ec 10 MIPS: Ensamblador • Directivas de preproceso: DIRECTIVAS .data .text .ascii “tira de caracteres” .asciiz “tira de caracteres” .byte 1, 2, 3 .half 300, 301, 302 .word 80000, 80001 .float 1.23, 2.13 .double 3.0e21 .space 10 .extern etiqueta n .globl etiqueta .align n USO Los elementos siguientes se almacenan en segmento de datos. Los elementos siguientes se almacenan en segmento de código (texto). Almacena cadena caracteres NO terminada en carácter nulo. Almacena cadena caracteres terminada en carácter nulo. Almacena bytes en memoria, consecutivamente. Almacena medias palabras en memoria, consecutivamente. Almacena palabras en memoria, consecutivamente. Almacena float en memoria, consecutivamente. Almacena double en memoria, consecutivamente. Reserva un espacio de 10 bytes en el segmento actual. Declara que etiqueta es global de tamaño n. Declara etiqueta como global. Alinea el siguiente dato en un límite de 2^n. http://arcos.inf.uc3m.es/~ii_ec 11 MIPS: Ensamblador • Tipos de instrucciones: – Aritméticas y lógicas • add Rd, R1, R2 # add, addi, addu, addiu – Comparación • seq Rd, R1, R2 # seq, sge, sgt, sle, slt, slti, ... – Carga y almacenamiento • la Rd label # la, lb, lbu, lh, lw, sb, sh, sw – Salto condicional e incondicional • beq R1, R2, label # beqz, bge, bgt, ble, ... – Manejo excepciones / interrupciones • rfe, nop, break n, syscall. – etc. http://arcos.inf.uc3m.es/~ii_ec 12 MIPS: Ensamblador • Llamadas al sistema: http://arcos.inf.uc3m.es/~ii_ec 13 MIPS: Ensamblador • Modos de direccionamiento: FORMATO (registro) Valor Valor (registro) Identificador Identificador +/- valor Identificador (registro) Identificador +/- valor(registro) CÁLCULO DE LA DIRECCIÓN Contenido del registro (cr) Valor inmediato (vin) Vin + cr Dirección del identificador (did) Did +/- vin Did + vin Did +/- vin + cr http://arcos.inf.uc3m.es/~ii_ec EJEMPLO Lw $t0, ($t2) Lw $t0, 0x10010008 Lw $t0, 0x10010000($t1) Lw $t0, array Lw $t0, array+8 Lw $t0, array($t1) Lw $t0, array+4($t1) 14 SPIM Editor SPIM hola.s Emulador memoria USUARIO Ensamblador hola Llamadas al sistema Depurador http://arcos.inf.uc3m.es/~ii_ec CPU MIPS 2000 15 SPIM • Ejecutar simulador: xspim o spim. – – – – – – – – – – – help -- ayuda load "FILE" -- leer programa en memoria. print $N -- muestra el contenido del registro N. print ADDR -- muestra el contenido de la memoria en la dirección ADDR. breakpoint <ADDR> -- indica un punto de parada de ejecución. delete <ADDR> -- borra todos los puntos de parada. list -- lista los puntos de parada. run -- comenzar a ejecutar el programa. continue -- continuar la ejecución del programa. step <N> -- ejecutar N instrucciones exit -- salir del simulador. http://arcos.inf.uc3m.es/~ii_ec 16 SPIM http://arcos.inf.uc3m.es/~ii_ec 17 PC Spim http://arcos.inf.uc3m.es/~ii_ec 18 SPIM hola.s .data msg_hola: .asciiz "hola mundo\n" .text .globl main main: # printf("hola mundo\n") ; li $2 4 la $4 msg_hola syscall http://arcos.inf.uc3m.es/~ii_ec 19 SPIM • spim / xspim hola.s con instrucciones – – – – load ”hola.s" breakpoint main continue step 1 [0x0040002c] [0x00400030] [0x00400034] [0x00400038] hola mundo hola.s con pseudo-instrucciones 0x34020004 0x3c011001 0x3424000c 0x0000000c ori $2, $0, 4 lui $1, 4097 [msg_hola] ori $4, $1, 12 [msg_hola] syscall ; 8: li $2 4 ; 9: la $4 msg_hola ; 10: syscall – exit salir del simulador. http://arcos.inf.uc3m.es/~ii_ec 20 Ideas de diseño para SPIM : Tipos datos básicos (enteros) .data resultado: .space 4 # 4 bytes op1: .word 100 op2: .word -10 ... var integer resultado ; integer op1 = 100 ; integer op2 = -10 ; ... .text begin resultado := op1 + op2 ; ... End. .globl main main: lw $t1 op1 lw $t2 op2 add $t3 $t1 $t2 la $t4 resultado sw $t3 ($t4) ... http://arcos.inf.uc3m.es/~ii_ec 21 Ideas de diseño para SPIM : Tipos datos básicos (vectores) var vec: array [1..5] of integer; mat: array [1..2,1..3] of integer := [[11, 12, 13], [21, 22, 23]]; ... begin m[1][2] := m[1][1] + m[1][2] ; ... End. .data vec: .space 20 #5 elem.*4 bytes mat: .word 11, 12, 13 .word 21, 22, 23 ... .text .globl main main: lw $t1 mat+0 lw $t2 mat+12 add $t3 $t1 $t2 sw $t3 mat+4 ... http://arcos.inf.uc3m.es/~ii_ec 22 Ideas de diseño para SPIM : Tipos datos básicos (string) var c1: char ; c2: char := ‘h’ ; ac1: string := “hola” ; ... begin write(ac1) ; ... End. .data c1: .space 1 # 1 byte c2: .byte ‘h’ ac1: .asciiz “hola” ... .text .globl main main: li $v0 4 la $a0 ac1 syscall ... http://arcos.inf.uc3m.es/~ii_ec 23 Ideas de diseño para SPIM : Tipos datos básicos (boolean) var b1: boolean; b2: boolean := false ; ... .data b1: .space 4 b2: .word 0 ... # 4 bytes .text begin if (b1 = true) then begin b1 := true ; end; ... End. .globl main main: if_1: la $t0 b2 beq $t0 $0 fi_1 la $t0 b1 li $t1 1 sb $t1 ($t0) fi_1: ... http://arcos.inf.uc3m.es/~ii_ec 24 Ideas de diseño para SPIM : Estructuras de control (if) if (a < b) then begin { acción 1 } End; else begin { acción 2 } if_2: lw lw slt beq $t1 $t2 $t0 $t0 a b $t1 $t2 $0 else_2 then_2: ... # acción 1 b fi_2 End; else_2: ... # acción 2 fi_2: ... http://arcos.inf.uc3m.es/~ii_ec 25 Ideas de diseño para SPIM : Estructuras de control (switch) case (i) of begin 10: begin {acción 1} end; ... case_1: else: begin {acción por defecto} end; End; lw $t1 i li $t2 10 beq $t1 $t2 case_1_1 ... b default_1 case_1_1: ... # acción 1 b esac_1 default_1: ... # acción por defecto esac_1: ... http://arcos.inf.uc3m.es/~ii_ec 26 Ideas de diseño para SPIM : Estructuras de control (repeat until) var vec: array[0..3] of integer := [1,2,3,0] ; i: integer; Begin i:=0; repeat { acción } ... i := i + 1 ; until (vec[i] = 0) ; End. .data vec: .word 1,2,3,0 ... .text .globl main main: move $t0 $0 do_1: # acción addu $t0 $t0 4 lw $t1 vec($t0) beq $t1 $0 od_1 b do_1 od_1: ... http://arcos.inf.uc3m.es/~ii_ec 27 Ideas de diseño para SPIM : Estructuras de control (while) var vec: array[0..3] of integer := [1,2,3,0] ; i: integer; begin i:=0; while (vec[i] <> 0) do begin /* acción */ ... i := i + 1 ; end; End. .data vec: .word 1,2,3,0 ... .text .globl main main: move $t0 $0 while_1: lw $t1 vec($t0) beq $t1 $0 done_1 # acción addu $t0 $t0 4 b while_1 done_1: ... http://arcos.inf.uc3m.es/~ii_ec 28 Ideas de diseño para SPIM : Funciones (Marco de pila) • El marco de pila es una zona de memoria reservada dentro de la pila, para almacenar datos temporales de una función, como son: – Los registros que no quiera o deba modificar. – Las variables locales de la función. • El marco de pila es imprescindible si se quiere realizar funciones recursivas. • La creación y el uso del marco de pila debe seguir un estricto convenio. http://arcos.inf.uc3m.es/~ii_ec 29 Ideas de diseño para SPIM : Funciones (paso parámetros) • La función llamante antes de llamar debe: – Guardar los registros $a0..$a3 y $t0..$t9 que no quiera ver modificados en su marco de pila. – Pasar los argumentos en los registros $a0..$a3 Si hay mas deben colocarse en la pila justo al principio para que queden justo antes del marco de pila de la función llamada. – Ejecutar la instrucción jal para realizar la llamada, la cual guarda la dirección de retorno en el registro $ra http://arcos.inf.uc3m.es/~ii_ec 30 Ideas de diseño para SPIM : Funciones (paso parámetros) • La función llamada al empezar debe: – Reservar espacio para su marco de pila restando el tamaño correspondiente al registro $sp. – Guardar los registros $s0..$s7, $fp y $ra que necesite modificar en su marco de pila. ($fp se guarda al crear un marco de pila, o sea siempre, y $ra se guarda si se va a llamar a alguna función.) – Se termina el marco de pila guardando en $fp su posición inicial, ( que es igual a $sp + tamaño del marco de pila - 4) http://arcos.inf.uc3m.es/~ii_ec 31 Ideas de diseño para SPIM : Funciones (paso parámetros) • La función llamada al terminar debe: – Devolver en $v0 y $v1 el valor de retorno de la función, (si hay). – Restaurar los registros $s0..$s7, $fp y $ra que haya guardado anteriormente. – Eliminar el marco de pila sumando al registro $sp el tamaño del marco de pila. – Volver a la función llamante saltando a la dirección almacenada en el registro $ra. http://arcos.inf.uc3m.es/~ii_ec 32 Ideas de diseño para SPIM : Funciones (Esquema de un marco de pila) .... $fp Argumento 6 Argumento 5 + Registros guardados Dirección de crecimiento de la pila Variables locales $sp http://arcos.inf.uc3m.es/~ii_ec 33 Ideas de diseño para SPIM : Ejemplo funciones (intro) Function factorial ( a: integer ) : integer begin if (a < 2) then return 1 ; return a * factorial(a-1) ; End. begin ... resultado := factorial(4) ; End. factorial(a=4) (a < 2) ? 6 * 4 factorial(a=3) (a < 2) ? 2 * 3 factorial(a=2) (a < 2) ? 1 * 2 factorial(a=1) (a < 2) ? http://arcos.inf.uc3m.es/~ii_ec 34 Ideas de diseño para SPIM : Ejemplo funciones (paso parámetros 1/3) factorial: + # frame stack subu $sp $sp 12 sw $ra 12($sp) sw $fp 8($sp) addu $fp $sp 12 ... FP ra fp ... SP ... ... http://arcos.inf.uc3m.es/~ii_ec 35 Ideas de diseño para SPIM : Ejemplo funciones (paso parámetros 2/3) + # if ($a0 < bge li b 2) then return 1; $a0 2 b_else $v0 1 b_efs # return a * factorial(a-1); b_else: sw $a0 -8($fp) addi $a0 $a0 -1 jal factorial lw $v1 -8($fp) mul $v0 $v0 $v1 ... FP ra fp a a0 (a) SP http://arcos.inf.uc3m.es/~ii_ec ... a-1 ... ... ... 36 Ideas de diseño para SPIM : Ejemplo funciones (paso parámetros 3/3) + b_efs: # end frame stack lw $ra 12($sp) lw $fp 8($sp) addu $sp $sp 12 jr $ra FP ... ... SP ra fp a0 (a) ... http://arcos.inf.uc3m.es/~ii_ec 37