Repaso Arquitectura MIPS Fundamentos de los Computadores Grado en Ingeniería Informática Arquitectura MIPS Registros Instrucciones I t i Organización de memoria Formato de las instrucciones Modos de direccionamiento Subprogramas Lenguajes máquina y ensamblador 2 Registros del MIPS Los registros de los que se dispone son los siguientes: Registro contador de programa (PC) de 32 bits 32 registros de 32 bits: $0, $1… $31. ▫ $0: ▫ $1… $31: registro cuyo contenido siempre es 0 registros de propósito general 32 registros de punto flotante ▫ 32 simple precisión (32 bits): ▫ 16 doble precisión (64 bits): F0, F1, F2… F30, F31 F0, F2… F30 (direcciones pares) Registros HI y LO para resultados aritméticos de 64 bits. ▫ Multiplicación: HI,LO almacenan un producto de 64 bits ▫ División: LO almacena el cociente y HI el resto Lenguajes máquina y ensamblador 3 Arquitectura MIPS Registros Instrucciones I t i Organización de memoria Formato de las instrucciones Modos de direccionamiento Subprogramas Lenguajes máquina y ensamblador 4 Instrucciones del MIPS Tres categorías: Instrucciones aritmético/lógicas Instrucciones de carga/almacenamiento Instrucciones de control de flujo Lenguajes máquina y ensamblador 5 Instrucciones aritmético/lógicas Todas las operaciones aritméticas y lógicas tienen dos operandos y un resultado Los dos operandos normalmente están ubicados en registros i t y ell resultado lt d se almacena l en un registro it Existe un convenio de uso de registros A cada d registro i se le l asigna i un alias li ▫ Los registros $s0–$s7 ($16–$23) suelen usarse para valores de trabajo ▫ Los registros $t0–$t7 $t0 $t7 ($8–$15) ($8 $15) suelen usarse para valores temporales Una versión alternativa de algunas instrucciones permite que uno de los operandos sea un valor inmediato proporcionado por la propia instrucción Lenguajes máquina y ensamblador 6 Instrucciones aritmético/lógicas a=b+c add $ $s0,, $s1, $ , $s2 $ valor registro a $s0 $ b $s1 c $s2 NOTA: operación de suma con dos operandos en registros. Lenguajes máquina y ensamblador 7 Instrucciones aritmético/lógicas a=b+c+d add $ $s0,, $s1, $ , $s2 $ add $s0, $s0, $s3 valor registro a $s0 $ b $s1 c $s2 d $s3 NOTA: operación de suma con tres operandos en registros. Lenguajes máquina y ensamblador 8 Instrucciones aritmético/lógicas d=a–e sub $ $s0,, $s1, $ , $s2 $ valor registro d $s0 $ a $s1 e $s2 NOTA: operación de resta con dos operandos en registros. Lenguajes máquina y ensamblador 9 Instrucciones aritmético/lógicas a = b + 75 addi $ $s0,, $s1, $ , 75 valor registro a $s0 $ b $s1 NOTA: operación de resta con un operando en registro, siendo el otro un valor inmediato. Lenguajes máquina y ensamblador 10 Instrucciones aritmético/lógicas a = ((b + c) – d) AND e add $ $s0,, $s1, $ , $s2 $ sub $s0, $s0, $s3 and $s0, $s0, $s4 valor registro a $s0 $ b $s1 c $s2 d $s3 e $s4 NOTA: operación compleja que se realiza por pasos acumulando el resultado en el registro destino. Lenguajes máquina y ensamblador 11 Instrucciones aritmético/lógicas f = (g + h) – (i + j) add $ $s0,, $s1, $ , $s2 $ add $t0, $s3, $s4 sub $s0, $s0, $t0 valor registro f $s0 $ g $s1 h $s2 i $s3 j $s4 NOTA: operación compleja que se realiza por pasos usando un registro como almacenamiento temporal. Lenguajes máquina y ensamblador 12 Instrucciones aritmético/lógicas f = (g + h + i) – (i + j) add $ $s0,, $s1, $ , $s2 $ add $s0, $s0, $s3 add $t0, $s3, $s4 sub $s0, $s0, $t0 valor registro f $s0 $ g $s1 h $s2 i $s3 j $s4 NOTA: operación compleja que se realiza por pasos usando un registro como almacenamiento temporal. Lenguajes máquina y ensamblador 13 Instrucciones aritméticas Instrucción sumar sumar sin signo sumar inmediato sumar inmediato sin signo restar restar sin signo dividir dividir sin signo multiplicar multiplicar sin signo valor absoluto dividir dividir sin signo multiplicar multiplicar multiplicar sin signo Lenguajes máquina y ensamblador Ejemplo add $1,$2,$3 addu $1,$2,$3 addi $1,$2,10 addiu $1,$2,10 sub $1,$2,$3 subu $1,$2,$3 Significado $1= $2+$3 $1=$2+$3 $1=$2+10 $1=$2+10 $1=$2-$3 $1=$2-$3 Lo=$1$2 div $1,$2 Hi=$1mod$2 Lo=$1$2 divu $1,$2 Hi=$1mod$2 mult $1,$2 Hi,Lo=$1*$2 multu $1,$2 Hi,Lo=$1*$2 Pseudoinstrucciones abs $1=$2$3 div $1,$2,$3 (cociente) $1=$2$3 divu $1,$2,$3 (cociente) mul $1,$2,$3 $1=$2*$3 mulo $1,$2,$3 $1=$2*$3 mulou $1,$2,$3 $1=$2*$3 Comentarios Posible excepción por desbordamiento Posible excepción por desbordamiento Posible excepción por desbordamiento Posible excepción por desbordamiento - Posible excepción por desbordamiento Posible excepción por desbordamiento Posible excepción por desbordamiento 14 Instrucciones lógicas Instrucción and or xor nor andi ori xori shift left logical shift left logical variable shift right logical shift right logical variable shift right arithmetic shift right arithmetic variable Ejemplo and $1,$2,$3 or $1,$2,$3 xor $1,$2,$3 nor $1,$2,$3 andi $1,$2,10 ori $1,$2,10 xori $1,$2,10 sll $1,$2,10 sllv $1,$2,$3 srl $1,$2, 10 srlv $1 $1,$2,$3 $2 $3 sra $1,$2,10 srav $1,$2,$3 Lenguajes máquina y ensamblador Significado $1= $2&$3 $1=$2|$3 $1=$2$3 $1=~($2|$3) $1=$2&10 $1= $2|10 $1=$210 $1 $210 $1= $2<<10 $1= $2<<$3 $1=$2>>10 $1=$2>>$3 $1=$2>>10 $1=$2>>$3 Comentarios 15 Instrucciones de carga/almacenamiento Las operaciones de carga y almacenamiento permiten transferencias de datos entre memoria y registros El formato de la instrucción dispone de 16 bits pero no son suficientes para acceder a toda la memoria del computador Se considera que la dirección es un desplazamiento qque hayy qque sumar al contenido de un registro g base Las operaciones de carga (load) mueven un dato desde memoria hasta un registro y las operaciones de almacenamiento (store) al contrario Lenguajes máquina y ensamblador 16 Instrucciones de carga/almacenamiento a = memoria[2] lw $ $s0,, 8($s1) ($ ) valor registro a $s0 $ memoria $s1 memoria 0x00 0 0x04 1 0x08 2 0x0c 3 0x10 4 0x14 … NOTA: cargar un valor de memoria en un registro. Lenguajes máquina y ensamblador 17 Instrucciones de carga/almacenamiento memoria[2] = a sw $ $s0,, 8($s1) ($ ) valor registro a $s0 $ memoria $s1 memoria 0x00 0 0x04 1 0x08 2 0x0c 3 0x10 4 0x14 … NOTA: almacenar el valor de un registro en memoria. Lenguajes máquina y ensamblador 18 Instrucciones de carga/almacenamiento g = h + memoria[3] lw $ $t0,, 12($s2) ($ ) add $s0, $s1, $t0 valor registro g $s0 $ h $s1 memoria $s2 memoria 0x00 0 0x04 1 0x08 2 0x0c 3 0x10 4 0x14 … NOTA: realizar una operación con uno de los operandos en memoria. Lenguajes máquina y ensamblador 19 Instrucciones de carga/almacenamiento memoria[4] = a + memoria[4] lw $ $t0,, 4($s1) ($ ) add $t0, $t0, $s0 sw $t0,16($s1) valor registro a $s0 $ memoria $s1 memoria 0x00 0 0x04 1 0x08 2 0x0c 3 0x10 4 0x14 … NOTA: realizar una operación con uno de los operandos en memoria y almacenar el resultado en memoria. Lenguajes máquina y ensamblador 20 Instrucciones de transferencia de datos Instrucción carga byte carga byte sin ext. ext signo carga media palabra carga media palabra sin extensión de signo carga palabra carga inmediata de la parte más significativa “load upper inmediate” carga registro del coprocesador z almacena byte almacena media palabra almacena palabra almacena registro g en memoria registro del coprocesador z Ejemplo lb $1,10($2) lbu $1 $1,10($2) 10($2) lh $1,10($2) Significado $1=M[10+$2] $1=M[10+$2] $1=M[10+$2] Extiende el bit de signo No extiende el bit de signo Extiende el bit de signo lhu $1,10($2) $1=M[10+$2] No extiende el bit de signo lw $1,10($2) $1=M[10+$2] lui $1,50 $1=50*216 lwc1 $f0,10($2) ( ) $f0= M[10+$2] sb $1,10($2) sh $1,10($2) sw $1,10($2) M[10+$2]=$1 M[10+$2]=$1 M[10+$2]=$1 swc1 $f0,10($2) M[10+$2]=$f0 carga inmediata li $1,1000 carga dirección la $3,label Lenguajes máquina y ensamblador Comentarios Carga un dato de 16 bits en la parte más significativa del registro. Pseudoinstrucciones Carga de un dato de 32 bits $1=1000 $3 di $3=dirección ió d de Transfiere f la dirección de memoria no el contenido. label 21 Instrucciones de movimiento de datos Instrucción mover desde Hi mover desde Lo mover a Hi mover a Lo mover desde coprocesador z mover al coprocesador z transfiere o mueve transfiere doble desde coproc. 1 Lenguajes máquina y ensamblador Ejemplo Significado Comentarios mfhi $1 $1= Hi mflo $1 $1= Lo mthi $1 Hi=$1 mtlo $1 Lo=$1 $f0-$f30: Registros del coprocesador 1 mfcz $1,$f0 $1=$f0 mtcz $1,$f0 $f0=$1 Pseudoinstrucciones move $1,$2 $1=$2 $4=$F0 mfc1.d $4,$f0 $5=$F1 22 Instrucciones de control de flujo Las instrucciones de control de flujo generan un salto en la secuencia de ejecución del programa En general, existen dos tipos de instrucciones de salto Saltos condicionales: según una determinada condición se d id sii continuar decide i con la l secuencia i del d l programa o saltar l a otra posición Saltos S lt incondicionales: i di i l siempre i se produce d ell salto, lt no hay condiciones a tener en cuenta Lenguajes máquina y ensamblador 23 Saltos condicionales Normalmente son saltos relativos al PC La dirección de destino se da como un desplazamiento que se suma o resta al PC El código puede ejecutarse independientemente de su posición en memoria Los saltos suelen ser cortos, por lo que se utilizan pocos bits para especificar la dirección Lenguajes máquina y ensamblador 24 Saltos incondicionales La dirección de la siguiente instrucción es especificada por la instrucción de salto, salto pudiendo hacerlo de dos formas distintas Directa: el propio código de la instrucción contiene la dirección Indirecta: la instrucción indica un registro que contiene la dirección Lenguajes máquina y ensamblador 25 Instrucciones de control de flujo si (a = b) saltar a DESTINO beq q$ $s0,$s1, ,$ , DESTINO valor registro a $s0 $ b $s1 NOTA: saltar a una posición si dos valores son iguales. Lenguajes máquina y ensamblador 26 Instrucciones de control de flujo si (a ≠ b) saltar a DESTINO bne $ $s0,$s1, ,$ , DESTINO valor registro a $s0 $ b $s1 NOTA: saltar a una posición si dos valores son diferentes. Lenguajes máquina y ensamblador 27 Instrucciones de control de flujo saltar a DESTINO j DESTINO NOTA: saltar incondicionalmente a una posición. Lenguajes máquina y ensamblador 28 Instrucciones de control de flujo saltar a la posición indicada por el registro $s0 jjr $ $s0 NOTA: saltar incondicionalmente a la posición dada por un registro. Lenguajes máquina y ensamblador 29 Instrucciones de control de flujo si (a = b) si no sino: fin: fi f=f+2 f=f+4 bne $s0,$s1, sino addi $s2, $s2, 2 j fin addi $s2, $s2, 4 … valor registro a $s0 $ b $s1 f $s2 NOTA: elegir entre dos acciones distintas. Lenguajes máquina y ensamblador 30 Instrucciones de control de flujo contar hasta 5 en el registro $s0 bucle: fin: add $ $s0,, $0, $ , $0 $ addi $s1, $0, 5 beq $s0, $s1, fin addi $s0, $s0, 1 j bucle … NOTA: realizar una misma acción varias veces. Lenguajes máquina y ensamblador 31 Instrucciones de control de flujo sumar 1 a las 5 primeras posiciones de memoria bucle: fin: add $ $s0,, $0, $ , $0 $ addi $s1, $0, 20 beq $s0, $s1, fin lw $t0, memoria($s0) addi $t0, $t0, 1 sw $t0, $t0 memoria($s0) addi $s0, $s0, 4 j bucle … memoria 0x00 0 0x04 1 0x08 2 0x0c 3 0x10 4 0x14 … NOTA: realizar una misma acción varias veces pero en posiciones de memoria distintas. Lenguajes máquina y ensamblador 32 Instrucciones de salto Instrucción salta sobre igual salta sobre no igual salta sobre mayor o igual que cero salta sobre mayor o igual que cero y enlazar ..... salto incondicional salto incondicional (registro) salto incondicional y enlazar salto incondicional y enlazar (registro) salta sobre mayor o igual salta sobre mayor que salta sobre menor o igual salta sobre menor que ..... Lenguajes máquina y ensamblador Ejemplo beq $1,$2,100 bne $1,$2,100 bgez $1,100 Significado si($1==$2) ir a PC+4 +100 si($1!=$2) ir a PC+4 +100 si($1>=0) ir a PC+4 +100 bgezal $1,1000 si($1>=0) $31=PC+4; ir a 1000 Comentarios ir a 2000 j 2000 ir a $1 jr $1 $31=PC+4; ir a 10000 jal 10000 $31=PC+4; ir a $1 jalr $1 Pseudoinstrucciones si($1>=$2) si($1 $2) ir a PC PC+4 4 +100 100 bge $1 $1,$2,100 $2 100 si($1>$2) ir a PC+4 +100 bgt $1,$2,100 si($1<=$2) ir a PC+4 +100 ble $1,$2,100 si($1<$2) ir a PC+4 +100 blt $1,$2,100 33 Instrucciones de comparación Instrucción Inicializar menor que Ejemplo slt $1,$2,$3 Significado if ($2<$3) then $1=1 else $1=0 endif Comentarios inicializar menor que sin signo sltu $1,$2,$3 Inicializar menor que inmediato slti $1,$2,5 Inicializar menor que inmediato sin signo sltiu $1,$3,$5 Inicializa igual inicializa mayor y o igual g inicializa mayor que inicializa menor o igual inicializa no igual Lenguajes máquina y ensamblador Pseudoinstrucciones si ($2==$3) then $1=1 $1 1 seq $1,$2,$3 else $1=0 endif sge g $ $1,$2,$3 ,$ ,$ sgt $1,$2,$3 sle $1,$2,$3 sne $1,$2,$3 34 Arquitectura MIPS Registros Instrucciones I t i Organización de la memoria Formato de las instrucciones Modos de direccionamiento Subprogramas Lenguajes máquina y ensamblador 35 Organización de la memoria en el MIPS Los datos se almacenan en memoria siguiendo el convenio Big Endian Endian* El tamaño de palabra es de 32 bits 0x10203040 Los accesos deben estar alineados La memoria dispone de 232 bytes Hay 231 medias palabras Hay 230 palabras Hay 228 dobles palabras Memoria … 0 0x10 0x20 0x30 0x40 … 2n – 1 MIPS dispone p de cinco modos de direccionamiento Tres para acceso a operandos Dos para p ruptura p de secuencia ((condicional e incondicional)) (*) ¡ojo! El PCspim actúa como si fuera little endian porque se ejecuta en un Pentium. Lenguajes máquina y ensamblador 36 Arquitectura MIPS Registros Instrucciones I t i Organización de memoria Formato de las instrucciones Modos de direccionamiento Subprogramas Lenguajes máquina y ensamblador 37 Formato de las instrucciones Hay tres formatos posibles para las instrucciones, teniendo todos ellos 32 bits de longitud Formato R: OP destino (rd), fuente (rs), fuente (rt) op 6 bits Formato I: rt 5 bits rd 5 bits shamt 5 bits funct 6 bits OP ddestino ti (rt), ( t) fuente f t (rs), ( ) inmediato i di t op 6 bits Formato J: rs 5 bits rs 5 bits rt 5 bits inmediato/dirección 16 bits OP dirección op 6 bits Lenguajes máquina y ensamblador dirección objetivo 26 bits 38 Arquitectura MIPS Registros Instrucciones I t i Organización de memoria Formato de las instrucciones Modos de direccionamiento Subprogramas Lenguajes máquina y ensamblador 39 Modos de direccionamiento Los modos de direccionamiento de los que dispone la arquitectura MIPS son los siguientes: Registro: utilizado por las instrucciones aritmético/lógicas cuyos operandos están almacenados en registros add $1,$2,$3 $1= $2 + $3 formato R OP rs rt rd registro Lenguajes máquina y ensamblador 40 Modos de direccionamiento Los modos de direccionamiento de los que dispone la arquitectura MIPS son los siguientes: Inmediato: utilizado por las instrucciones aritmético/lógicas que operan el contenido de un registro con un valor inmediato y por las instrucciones que cargan valores inmediatos en registros o almacenan valores inmediatos en memoria addi $1,$2,25 $1= $2 + 25 formato I OP rs Lenguajes máquina y ensamblador rt inmediato 41 Modos de direccionamiento Los modos de direccionamiento de los que dispone la arquitectura MIPS son los siguientes: Base + desplazamiento: utilizado por las instrucciones de carga/almacenamiento lw sw $1, 100($2) $1, 100($2) $1 = mem[100+$2] mem[100+$2] = $1 formato I OP rs rt dirección + memoria registro Lenguajes máquina y ensamblador 42 Modos de direccionamiento Los modos de direccionamiento de los que dispone la arquitectura MIPS son los siguientes: Relativo al contador de programa: utilizado por las instrucciones de salto condicional beq $1,$2,destino si ($1 = $2) ir a destino formato I OP rs rt dirección + PC Lenguajes máquina y ensamblador 43 Modos de direccionamiento Los modos de direccionamiento de los que dispone la arquitectura MIPS son los siguientes: Pseudodirecto: utilizado por las instrucciones de salto incondicional j destino ir a destino formato J OP dirección PC Lenguajes máquina y ensamblador 44 Ejemplos de instrucciones add $s0, $s1, $s2 0x02328020 formato R op rs rt rd shamt funct 000000 10001 10010 10000 00000 100000 código de código de operación registro fuente registro fuente R17 registro fuente registro fuente R18 registro destino registro destino R16 desplazamiento distinción dentro dentro de la operación Lenguajes máquina y ensamblador 45 Ejemplos de instrucciones sub $s2, $t0, $t1 0x01099022 formato R op rs rt rd shamt funct 000000 01000 01001 10010 00000 010010 código de código de operación registro fuente registro fuente R8 registro fuente registro fuente R9 registro destino registro destino R18 desplazamiento distinción dentro dentro de la operación Lenguajes máquina y ensamblador 46 Ejemplos de instrucciones addi $s2, $s4, 23 0x22920017 formato I op rs rt inmediato 001000 10100 10010 0000000000010111 código de código de operación registro fuente registro fuente R20 registro destino registro destino R18 operando inmediato operando inmediato 23(10) 23 1 Lenguajes máquina y ensamblador 2 11 1 2 5 1 2 2 0 2 1 47 Ejemplos de instrucciones lui $s1, 0x1234 0x3C111234 formato I op rs rt inmediato 001111 00000 10001 0001001000110100 código de código de operación no se usa no se usa registro fuente registro destino registro destino R17 operando inmediato operando inmediato 1234(16) Lenguajes máquina y ensamblador 48 Ejemplos de instrucciones lw $s0, 32($s2) 0x8E500020 formato I op rs rt dirección 100011 10010 10000 0000000000100000 código de código de operación registro base registro base R18 registro destino registro destino R16 desplazamiento sobre el registro desplazamiento sobre el registro base 32(10) Lenguajes máquina y ensamblador 49 Ejemplos de instrucciones sw $s0, 4($s2) 0xAE500004 formato I op rs rt dirección 101011 10010 10000 0000000000000100 código de código de operación registro base registro base R18 registro fuente registro fuente R16 desplazamiento sobre el registro desplazamiento sobre el registro base 4(10) Lenguajes máquina y ensamblador 50 Ejemplos de instrucciones [0x00400024] [0x00400028] [0x0040002c] [0x00400030] destino: beq $t1, $t2, destino … … … 0x112A0002 f formato I t I op rs rt dirección 000100 01001 01010 0000000000000010 código de operación registro fuente R9 registro fuente R10 desplazamiento sobre el PC+4 2(10) X 0x24 + 4(10) = 0x28 0x30 – 0x28 = 8(10) = 1000(2) 10(2) Lenguajes máquina y ensamblador 51 Ejemplos de instrucciones [0x00400024] [0x00400028] [0x0040002c] [0x00400030] destino: j destino … … … 0x0810000c f formato J t J op dirección objetivo 000010 00000100000000000000001100 código de operación 26 bits de la dirección de destino del salto 0000 00000100000000000000001100 00 = 0x00400030 PC x4 Lenguajes máquina y ensamblador 52 Ejemplos de instrucciones [0x00400024] [0x00400028] [0x0040002c] [0x00400030] destino: jal destino … … … 0x0c10000c f formato J t J op dirección objetivo 000011 00000100000000000000001100 código de operación 26 bits de la dirección de destino del salto 0000 00000100000000000000001100 00 = 0x00400030 PC x4 Lenguajes máquina y ensamblador 53 Ejemplos de instrucciones jr $ra 0x03e00008 formato R op rs rt rd shamt funct 000000 11111 00000 00000 00000 001000 código de código de operación registro fuente registro fuente R31 no se usa no se usa registro fuente no se usa no se usa registro destino desplazamiento distinción dentro dentro de la operación Lenguajes máquina y ensamblador 54 Ejemplos de instrucciones Codifica en lenguaje máquina las siguientes instrucciones: bne $t1, $t0, alli slt $s0, $t0, $t1 lb $t1, 0($t0) l $t1, lw $t1 4($t0) alli: sb $t3, 5($t0) Decodifica las siguientes instrucciones asumiendo que el valor del PC es 0x00400000: 0 02 10018 0x02510018 0X01698822 0X0C100012 0X20090002 0X00129043 Lenguajes máquina y ensamblador 55 Ejemplos de instrucciones Codifica en lenguaje máquina las siguientes instrucciones: bne $t1, $t0, alli (0x15280004) slt $s0, $t0, $t1 (0x0109802a) lb $t1, 0($t0) (0x81090000) l $t1, lw $t1 4($t0) (0 8d090004) (0x8d090004) alli: sb $t3, 5($t0) (0xa10b0005) Decodifica las siguientes instrucciones asumiendo que el valor del PC es 0x00400000: 0 02 10018 (mult 0x02510018 ( $18 $19) $18, 0X01698822 (sub $17, $11,$9) 0X0C100012 (jal 0X00400048) 0X20090002 (addi $9, $0, 2) 0X00129043 (sra $18, $18, 1) Lenguajes máquina y ensamblador 56 Arquitectura MIPS Registros Instrucciones I t i Organización de memoria Formato de las instrucciones Modos de direccionamiento Subprogramas Lenguajes máquina y ensamblador 57 Subprogramas Un subprograma es una porción de código dentro de un programa más grande que realiza una tarea concreta de forma relativamente independiente al resto del código El uso de subprogramas proporciona d grandes dos d ventajas j Permite estructurar mejor los programas, descomponiendo problemas bl complejos l j en otros más á simples i l que se pueden d tratar por separado Permite P it reutilizar tili código, ódi dando d d lugar l a bibliotecas de subprogramas Lenguajes máquina y ensamblador 58 Instrucciones de llamada y retorno Los subprogramas pueden ser activados desde otras partes del programa principal La transferencia de control se realiza por medio de instrucciones de llamada y retorno El proceso de llamada debe almacenar parte del estado del computador, p , lo que q incluye y al menos la dirección de retorno Programa principal D1: instrucción 1 D2: instrucción 2 D3: Llamada a “X” D4: instrucción 4 . . Dn: instrucción n Guarda dirección D4 Subprograma X instrucción 1 instrucción 2 instrucción 3 retorno Almacenamiento temporal (registro o pila) Recupera D4 Lenguajes máquina y ensamblador 59 Instrucciones de llamada y retorno Las instrucciones de llamada son saltos incondicionales que almacenan la dirección de la siguiente instrucción de la secuencia en el registro $31 guardar la dirección de la siguiente instrucción de la secuencia (PC+4) y saltar a la posición M jal M Las instrucciones de retorno son saltos incondicionales a la dirección indicada ppor el registro g $$31 regresar a la posición indicada por el registro $31 jr $31 Lenguajes máquina y ensamblador 60 Uso de registros en subprogramas Los subprogramas utilizarán los mismos registros que el programa principal principal, por lo que hay que determinar qué ocurre con sus contenidos Hay dos convenios básicos para guardar los registros: ▫ Guarda el llamador (caller-saving): antes de llamar al subprograma se guardan los registros cuyo contenido se quiere preservar ▫ Guarda el llamado (called-saving): el subprograma llamado es quien se encarga de guardar los registros que quiera reutilizar Lenguajes máquina y ensamblador 61 Paso de parámetros Al llamar a un subprograma puede ser necesario pasarle parámetros parámetros, es decir, decir datos que necesitará para trabajar Los L subprogramas b también t bié pueden d generar resultados lt d que deberán ser proporcionados al programa principal La transferencia f i de d parámetros de d entrada d y resultados l d entre subprogramas se realizar por medio de estructuras d almacenamiento de l i temporall Registros Pila Lenguajes máquina y ensamblador 62 Etapas en la llamada a un subprograma P Programa principal i i l Paso 1: Paso de parámetros. parámetros - Colocar los parámetros en el lugar adecuado para pasarlos al subprograma (en registros o en la pila). Paso 2: Llamada al subprograma. S b Subprograma Paso 3: Salvar registros. - Crear el bloque de activación, que consiste en el conjunto de recursos de almacenamiento que necesitará el subprograma durante su ejecución. - Guardar en los registros que se deseen preservar para después de la ejecución del subprograma. Paso 4: Cuerpo del subprograma. - Ejecutar la tarea a realizar. Paso 5: Resultados. - Colocar los resultados en el lugar g adecuado para pasarlos al programa principal. - Restaurar registros. - Destruir D t i bloque bl d de activación. ti ió Paso 6: Retorno al programa principal. - Regresar a la dirección de memoria inmediatamente posterior a la llamada al subprograma. Lenguajes máquina y ensamblador 63 La pila Estructura de datos tipo LIFO (Last Input First Output) que se utiliza para Preservar datos durante la ejecución de subprogramas Pasar parámetros a subprogramas y devolver resultados Hay dos operaciones básicas que se realizan sobre pilas Guardar d (push) ( h) Recuperar (pop). Normalmente existe un registro llamado puntero de pila cuyo contenido apunta a la cima de la pila que, en general, crece hacia posiciones más bajas de memoria Lenguajes máquina y ensamblador 64 Operaciones sobre la pila Guardar (push) Recuperar (pop) 1. Decrementar puntero 2. Escribir en memoria MIPS: addi $sp $sp -4 $sp,$sp,-4 sw $reg, 0($sp) Memoria 1. Leer de memoria 2. Incrementar puntero MIPS: lw $reg 0($sp) $reg, addi $sp,$sp,4 Dirección Memoria Baja sp-4 Dirección Baja Valor guardado sp sp Valor leído sp+4 Alta Lenguajes máquina y ensamblador Alta 65 Bloque de activación en la pila # Programa principal … Llamar X(p1,p2,..) (p ,p , ) … Antes # Subprograma X(...) <guardar registros> <cuerpo> <restaurar registros> <retorno> Dirección baja de memoria sp -> sp -> Durante Después Recursos locales Registros guardados Dirección de retorno fpOLD <- fpNEW sp -> <- fpOLD <- fp Dirección alta de memoria Estado de la p pila antes,, durante y después p de la llamada a un procedimiento. p Bloque de activación sombreado Lenguajes máquina y ensamblador 66 Uso de la memoria 0x7FFFFFFF Pila Segmento de pila Datos dinámicos 0x10000000 Datos estáticos Código Segmento de datos Segmento de texto 0x00400000 0x00000000 Lenguajes máquina y ensamblador Reservada 67 Convenio de uso de registros Nombre Nº reg. g Uso Preservado en llamadas? $zero 0 Constante 0 - $at 1 Reservado para el ensamblador - $v0-$v1 2-3 Valores de resultados y evaluación de expresiones no $a0-$a3 4-7 Paso de parámetros (hasta cuatro; más a través de la pila) no $t0-$t7 8-15 Registros temporales no $s0 $s7 $s0-$s7 16 23 16-23 Registros que deben preservarse si $t8-$t9 24-25 Registros temporales no $k0-$k1 26-27 Reservado para el Sistema Operativo - $ $gp 28 P t Puntero global l b l (global ( l b l pointer) i t ) sii $sp 29 Puntero de pila (stack pointer) si $fp 30 Puntero de bloque de activación (frame pointer) si $ $ra 31 Di Dirección ió d de vuelta lt ((return t address) dd ) sii Las abreviaciones de dos letras y nombre de los registros reflejan los usos pensados para ellos en el convenio. Lenguajes máquina y ensamblador 68 Bibliografía Estructura y diseño de computadores Interficie circuitería/programación David A. Patterson y John L. Hennessy Editorial Reverté, 2000 Lenguajes máquina y ensamblador 69