Tema 3: El nivel de lenguaje máquina - Blearning
Tema 3: El nivel de lenguaje máquina - Blearning Tema 3: El nivel de lenguaje máquina - Blearning
Tema 3: El nivel de lenguaje máquina • Introducción • Modos de direccionamiento • Tipos de instrucciones • Tipos y tamaños de los operandos • Formatos de las instrucciones • Procedimientos • Clasificación de las arquitecturas a nivel de lenguaje máquina • Caso de estudio: – Arquitectura del repertorio de instrucciones del procesador MIPS. Bibliografía básica: [Patt-95], [Henn-93] Fundamento de Computadores (1º II) Cap 2: El nivel de lenguaje máquina 1 de 64
- Page 2 and 3: Introducción • Nivel de lenguaje
- Page 4 and 5: Sintaxis típica de una instrucció
- Page 6 and 7: Modos de direccionamiento: Ubicaci
- Page 8 and 9: Modos de direccionamiento: Alineaci
- Page 10 and 11: Modos de direccionamiento: Tipos m
- Page 12 and 13: Breve descripción de la arquitectu
- Page 14 and 15: Codificación de los modos de direc
- Page 16 and 17: Tipos de instrucciones • Las oper
- Page 18 and 19: Saltos condicionales • Normalment
- Page 20 and 21: Procedimientos (o subrutinas) • C
- Page 22 and 23: Frecuencia de uso de las instruccio
- Page 24 and 25: Tipos y tamaños de los operandos
- Page 26 and 27: Frecuencia de uso de los tamaños d
- Page 28 and 29: Formatos de las instrucciones en el
- Page 30 and 31: Ejemplo de arquitectura RISC (Reduc
- Page 32 and 33: Pasos en la llamada a un procedimie
- Page 34 and 35: La Pila (o stack) • Estructura de
- Page 36 and 37: Bloque de activación antes, durant
- Page 38 and 39: Arquitectura MIPS: Convenio para el
- Page 40 and 41: Clasificación de las arquitecturas
- Page 42 and 43: Ventajas y desventajas de cada una
- Page 44 and 45: Arquitecturas de registros de prop
- Page 46 and 47: Lenguaje ensamblador • Introducci
- Page 48 and 49: Funcionamiento del ensamblador •
- Page 50 and 51: Utilidades de los ensambladores •
<strong>Tema</strong> 3: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong><br />
• Introducción<br />
• Modos <strong>de</strong> direccionamiento<br />
• Tipos <strong>de</strong> instrucciones<br />
• Tipos y tamaños <strong>de</strong> los operandos<br />
• Formatos <strong>de</strong> las instrucciones<br />
• Procedimientos<br />
• Clasificación <strong>de</strong> las arquitecturas a <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong><br />
• Caso <strong>de</strong> estudio:<br />
– Arquitectura <strong>de</strong>l repertorio <strong>de</strong> instrucciones <strong>de</strong>l procesador MIPS.<br />
Bibliografía básica:<br />
[Patt-95], [Henn-93]<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 1 <strong>de</strong> 64
Introducción<br />
• Nivel <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> o <strong>nivel</strong> ISA:<br />
– Interfaz crítico entre el software y el hardware. Nivel más bajo al que se<br />
pue<strong>de</strong> programar un computador.<br />
Software<br />
Hardware<br />
Arquitectura <strong>de</strong>l repertorio <strong>de</strong> instrucciones (o <strong>nivel</strong> ISA)<br />
• Instrucción: Or<strong>de</strong>n primitiva que <strong>de</strong>be ejecutar el hardware.<br />
• Objetivo común <strong>de</strong> los diseñadores <strong>de</strong> computadores:<br />
– Encontrar un <strong>lenguaje</strong> que haga fácil la construcción <strong>de</strong>l hardware y <strong>de</strong>l<br />
compilador.<br />
– Maximizar el rendimiento y minimizar el coste o precio.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 2 <strong>de</strong> 64
Características <strong>de</strong>l <strong>lenguaje</strong> <strong>máquina</strong><br />
• Instrucción: Or<strong>de</strong>n individual que ejecuta el hardware.<br />
– Información contenida en una instrucción:<br />
• Operación a realizar<br />
• Destino <strong>de</strong>l resultado <strong>de</strong> la operación<br />
• Especificación <strong>de</strong> los operandos<br />
• Siguiente instrucción a realizar (implícitamente la siguiente o la que se<br />
especifique en instrucciones <strong>de</strong> ruptura <strong>de</strong> secuencia).<br />
• Las características <strong>de</strong>l <strong>lenguaje</strong> <strong>máquina</strong> o <strong>nivel</strong> ISA <strong>de</strong> un<br />
computador vienen <strong>de</strong>terminadas por:<br />
– <strong>El</strong> repertorio <strong>de</strong> instrucciones<br />
– Los modos <strong>de</strong> direccionamiento (formas <strong>de</strong> localizar los operandos)<br />
– La representación y tipos <strong>de</strong> datos que pue<strong>de</strong> manejar<br />
– Formato <strong>de</strong> las instrucciones (modo en el que se codifican)<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 3 <strong>de</strong> 64
Sintaxis típica <strong>de</strong> una instrucción en <strong>lenguaje</strong><br />
ensamblador<br />
• Ejemplo: Lenguaje ensamblador <strong>de</strong>l procesador MIPS R2000/3000<br />
– 4 campos básicos: etiqueta, nemónico <strong>de</strong> la instrucción, operandos (fuentes<br />
y <strong>de</strong>stino) y comentarios (opcional).<br />
Operandos<br />
Etiqueta Instrucción Comentarios<br />
Destino Fuentes<br />
<strong>de</strong>mo: add $t1, $s1, $v0 # $t1= $s1 + $v0<br />
sumai: addi $t5, $s2, 5 # $t5= $s2 + 5<br />
carga: lw $s3, 100($zero)<br />
# $s3= M[100+$zero]<br />
# $zero = 0 siempre!<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 4 <strong>de</strong> 64
Modos <strong>de</strong> direccionamiento<br />
• ¿Qué se entien<strong>de</strong> por modo <strong>de</strong> direccionamiento?<br />
– Las diversas formas que tiene una arquitectura (procesador) <strong>de</strong> especificar<br />
la localización <strong>de</strong> los operandos (datos) a procesar.<br />
• ¿Dón<strong>de</strong> pue<strong>de</strong>n estar los operandos <strong>de</strong> una instrucción?<br />
– Particularizando para una <strong>máquina</strong> <strong>de</strong> registros <strong>de</strong> propósito general los<br />
operandos pue<strong>de</strong>n estar en:<br />
• En un registro <strong>de</strong>l procesador: add r3,r1,r2<br />
• En la propia instrucción (forma inmediata): addi r2,r1,4<br />
• En memoria: add r2,r1,M<br />
– Dirección efectiva (EA: Effective address): Dirección real <strong>de</strong> memoria<br />
especificada por un modo <strong>de</strong> direccionamiento.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 5 <strong>de</strong> 64
Modos <strong>de</strong> direccionamiento:<br />
Ubicación <strong>de</strong> los operandos<br />
• En Registros , en la propia instrucción (inmediato) o en Memoria<br />
Procesador<br />
Control<br />
Registros<br />
<br />
ALU<br />
Memoria<br />
Dirección Contenido<br />
...<br />
[0x00001144] addi $t0, $t1, 9 <br />
[0x00001148] lw $s0,1000($zero)<br />
...<br />
...<br />
[0x00001000] 0x00001998 <br />
...<br />
...<br />
...<br />
...<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 6 <strong>de</strong> 64
Modos <strong>de</strong> direccionamiento:<br />
Interpretación <strong>de</strong> las direcciones <strong>de</strong> memoria<br />
• Convenios para clasificar los bytes <strong>de</strong> una palabra:<br />
– Little Endian: La dirección <strong>de</strong> un dato es la dirección <strong>de</strong> la parte menos significativa<br />
<strong>de</strong>l dato.<br />
– Big Endian: La dirección <strong>de</strong> un dato es la dirección <strong>de</strong> la parte más significativa <strong>de</strong>l<br />
dato.<br />
– Aspecto importante cuando se intercambia información entre distintas<br />
<strong>máquina</strong>s.<br />
Little Endian<br />
MSB LSB<br />
0x44332211<br />
55<br />
Memoria<br />
0<br />
.<br />
0x11<br />
0x22<br />
0x33<br />
0x44<br />
.<br />
2 n -1<br />
Big Endian<br />
MSB LSB<br />
0x11223344<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 7 <strong>de</strong> 64
Modos <strong>de</strong> direccionamiento:<br />
Alineación <strong>de</strong> los datos en memoria<br />
• Algunas arquitecturas exigen que los objetos mayores <strong>de</strong> un byte<br />
estén alineados en memoria.<br />
• Definición:<br />
– Un acceso a un objeto <strong>de</strong> tamaño t bytes en el byte <strong>de</strong> dirección D se alinea<br />
si D mod t = 0 (mod: resto <strong>de</strong> la división D/t).<br />
– Es <strong>de</strong>cir, la dirección <strong>de</strong>l objeto <strong>de</strong>be ser múltiplo <strong>de</strong> su tamaño en bytes.<br />
Objeto Bien alineado Mal alineado<br />
Byte 0,1,2,3,4,5,6,.. (nunca)<br />
Media palabra 0,2,4,6,8, ... 1,3,5,7, ...<br />
Palabra (4 bytes) 0,4,8,... 1,2,3,5,6,7,9,10,11,...<br />
Doble palabra 0,8, .. 1,2,3,4,5,6,7,9,10,11,12,13,14,15,....<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 8 <strong>de</strong> 64
Red <strong>de</strong> alineación<br />
Ejemplo<br />
Memoria:<br />
Registro:<br />
bit31<br />
bit31<br />
byte 3 byte 2 byte 1 byte 0<br />
bus<br />
Procesador<br />
.<br />
Red <strong>de</strong> alineación<br />
byte 3 byte 2 byte 1 byte 0<br />
Memoria<br />
Dirección Contenido<br />
0 Byte 0<br />
1 Byte 1<br />
2 Byte 2<br />
3 Byte 3<br />
4 Byte 4<br />
... ....<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 9 <strong>de</strong> 64<br />
bit0<br />
bit0<br />
bit0<br />
bit31
Modos <strong>de</strong> direccionamiento:<br />
Tipos más frecuentes<br />
Modo Ejemplo Significado<br />
Registro add r4,r3 r4 = r3+r4<br />
Inmediato add r4,#5 r4 = r4+5<br />
Directo add r1, (100) r1 = r1+M[100]<br />
Base + <strong>de</strong>splazamiento add r4,28(r1) r4 = r4 + M[28+r1]<br />
Indirecto por registro add r2, (r5) r2= r2 + M[r5]<br />
Indirecto por memoria add r1, @(r3) r1= r1 + M[M[r3]]<br />
In<strong>de</strong>xado add r3, (r1+r2) r3= r3+M[r1+r2]<br />
Autoincremento add r1,(r3)+ r1= r1 + M[r3]<br />
r3=r3+d<br />
(d:tamaño <strong>de</strong>l elemento)<br />
Auto<strong>de</strong>cremento add r1, -(r3) r3=r3-d<br />
r1= r1 + M[r3]<br />
(d:tamaño <strong>de</strong>l elemento)<br />
Escalado o índice add r1, 50(r2)[r3] r1= r1+M[50+r2+r3xd]<br />
(d: tamaño <strong>de</strong>l elemento)<br />
Ruptura <strong>de</strong> secuencia Saltos directos, relativos al PC, llamadas a<br />
subrutinas, etc..<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 10 <strong>de</strong> 64
Breve <strong>de</strong>scripción <strong>de</strong> la arquitectura MIPS<br />
Características generales<br />
• Máquina <strong>de</strong> carga-almacenamiento.<br />
– Los operandos <strong>de</strong> las operaciones que realiza la ALU tienen que estar en<br />
registros. No pue<strong>de</strong>n estar en memoria. Los datos se tienen que mover a los<br />
registros (instrucciones <strong>de</strong> carga/almacenamiento) para procesarlos.<br />
• Repertorio reducido tanto <strong>de</strong> instrucciones como <strong>de</strong> tipos <strong>de</strong><br />
datos.<br />
• Todas las instrucciones son <strong>de</strong> la misma longitud.<br />
• Número pequeño <strong>de</strong> modos <strong>de</strong> direccionamiento.<br />
– 3 para acceso a operandos<br />
– 2 para ruptura <strong>de</strong> secuencia (saltos y bifurcaciones)<br />
• Número reducido <strong>de</strong> formatos <strong>de</strong> instrucciones.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 11 <strong>de</strong> 64
Breve <strong>de</strong>scripción <strong>de</strong> la arquitectura MIPS<br />
Registros<br />
• 32 registros <strong>de</strong> 32 bits: $0 - $31.<br />
– $1 - $31: Registros <strong>de</strong> propósito general.<br />
– $0: Registro cuyo contenido siempre es 0.<br />
• Contador <strong>de</strong> Programa: PC<br />
• 32 registros <strong>de</strong> punto flotante.<br />
– 16 doble precisión (64 bits): F0-F2-....-F30<br />
– 16 simple precisión (32 bits): F0-F2- ...- F30 (direcciones pares)<br />
• Registros HI y LO para resultados aritméticos <strong>de</strong> 64 bits.<br />
– HI,LO: 64 bits. Producto aritmética entera (multiplicación)<br />
– LO: Cociente y HI: Resto para la división<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 12 <strong>de</strong> 64
Modos <strong>de</strong> direccionamiento <strong>de</strong>l procesador MIPS<br />
• Sólo 5 modos <strong>de</strong> direccionamiento:<br />
– Registro<br />
• add $t0,$s0,$s1 # $t0= $s0 + $s1<br />
– Inmediato<br />
• addi $t0,$t1,3 # $t0= $t1 +3<br />
– Base + <strong>de</strong>splazamiento<br />
• lw $t6, 100($s0) # Carga: t6 = M[100+$s0]<br />
• sw $t6, 100($s0) # Almacenamiento: M[100+$s0] = t6<br />
– Relativo al contador <strong>de</strong> programa<br />
• beq $t0,$t1,loop # Salto: si ($t0 = $t1) ir a loop<br />
– Pseudodirecto<br />
• j 1000 # Bifurcación a la posición 1000 (<strong>de</strong>ntro <strong>de</strong>l<br />
# segmento actual <strong>de</strong> 256 Mb)<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 13 <strong>de</strong> 64
Codificación <strong>de</strong> los modos <strong>de</strong> direccionamiento<br />
• La codificación <strong>de</strong> los modos <strong>de</strong> direccionamiento <strong>de</strong> los operandos<br />
<strong>de</strong>pen<strong>de</strong> <strong>de</strong>:<br />
– Número <strong>de</strong> modos <strong>de</strong> direccionamiento<br />
– Grado <strong>de</strong> in<strong>de</strong>pen<strong>de</strong>ncia entre modos y códigos <strong>de</strong> operación<br />
• Alternativas para la codificación según el número <strong>de</strong> modos <strong>de</strong><br />
direccionamiento que tenga una arquitectura:<br />
– Bajo: Codificación en el propio código <strong>de</strong> operación <strong>de</strong> la instrucción.<br />
In<br />
Código <strong>de</strong> operación ........... ............ .......... ..........<br />
– Alto: Utilización <strong>de</strong> especificadores <strong>de</strong> direcciones que indican el modo <strong>de</strong><br />
direccionamiento que utiliza cada operando.<br />
In<br />
Cód. Oper. Especificador ............ .......... ..........<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 14 <strong>de</strong> 64
Modos <strong>de</strong> direccionamiento y registros:<br />
Impacto en el tamaño <strong>de</strong> las instrucciones<br />
• <strong>El</strong> número <strong>de</strong> modos <strong>de</strong> direccionamiento y el número <strong>de</strong> registros <strong>de</strong><br />
una arquitectura influyen directamente en el tamaño <strong>de</strong> las<br />
instrucciones.<br />
– Cuanto mayor es el número <strong>de</strong> registros y modos <strong>de</strong> direccionamiento más<br />
bits se necesitarán para la codificación <strong>de</strong> los mismos. Por ejemplo: 32<br />
registros necesitarán como mínimo 5 bits para su codificación en la<br />
instrucción: 00000 (R0) ………. 11111 (R31).<br />
• Fuerzas que <strong>de</strong>be equilibrar el arquitecto <strong>de</strong> computadores:<br />
– <strong>El</strong> <strong>de</strong>seo <strong>de</strong> tener muchos registros y modos <strong>de</strong> direccionamiento<br />
– <strong>El</strong> impacto en el tamaño <strong>de</strong> las instrucciones -> tamaño <strong>de</strong> los programas<br />
– <strong>El</strong> <strong>de</strong>seo <strong>de</strong> tener instrucciones codificadas en longitu<strong>de</strong>s fáciles <strong>de</strong> manejar<br />
o <strong>de</strong>codificar por una implementación <strong>de</strong>terminada (hardware que ejecuta el<br />
repertorio <strong>de</strong> instrucciones).<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 15 <strong>de</strong> 64
Tipos <strong>de</strong> instrucciones<br />
• Las operaciones soportadas por la mayoría <strong>de</strong> las arquitecturas pue<strong>de</strong>n<br />
clasificarse según la siguiente tabla:<br />
Tipo <strong>de</strong> instrucción Ejemplos Comentarios<br />
Aritmética y lógica Operaciones aritméticas y lógicas: suma,<br />
resta, and, or, ...<br />
Transferencia <strong>de</strong> datos Transferencia <strong>de</strong> datos entre memoria y<br />
registros: Carga/almacenamiento.<br />
Control Salto, bifurcación, llamadas a subrutinas,<br />
retorno <strong>de</strong> subrutinas, excepciones,<br />
Sistema Llamadas al Sistema operativo, gestión<br />
<strong>de</strong> la memoria virtual.<br />
Categorías presente en todas las<br />
<strong>máquina</strong>s con un repertorio completo <strong>de</strong><br />
instrucciones.<br />
Varían entre las distintas arquitecturas<br />
pero todas proporcionan algún soporte <strong>de</strong><br />
instrucciones para funciones <strong>de</strong>l sistema.<br />
Punto Flotante operaciones en punto flotante: +, -, * y / . En <strong>máquina</strong>s <strong>de</strong>stinadas a realizar<br />
muchas operaciones en punto flotante<br />
Decimal Suma y multiplicación <strong>de</strong>cimal,<br />
conversiones <strong>de</strong> <strong>de</strong>cimal a caracteres.<br />
Ca<strong>de</strong>nas Comparar, mover, copiar o buscar en<br />
strings o ca<strong>de</strong>nas <strong>de</strong> caracteres.<br />
En algunas arquitecturas (VAX, 80x86)<br />
forman parte <strong>de</strong>l repertorio <strong>de</strong><br />
instrucciones y en otras las sintetiza el<br />
compilador a partir <strong>de</strong> instrucciones mas<br />
sencillas.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 16 <strong>de</strong> 64
Instrucciones para el control <strong>de</strong> flujo<br />
• Nomenclaturas más aceptadas<br />
– Saltos:<br />
• Rupturas <strong>de</strong> secuencias CONDICIONALES<br />
– Bifurcaciones:<br />
• Rupturas <strong>de</strong> secuencia NO CONDICIONALES.<br />
• Tipos <strong>de</strong> cambios <strong>de</strong> flujo<br />
– Saltos condicionales<br />
– Bifurcaciones<br />
– Llamadas a procedimientos<br />
– Retornos <strong>de</strong> procedimiento<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 17 <strong>de</strong> 64
Saltos condicionales<br />
• Normalmente, los saltos son relativos al PC<br />
– La dirección <strong>de</strong> <strong>de</strong>stino se da como un <strong>de</strong>splazamiento que se suma o resta<br />
al Contador <strong>de</strong> Programa (PC).<br />
• Código in<strong>de</strong>pendiente <strong>de</strong> la posición<br />
– Pue<strong>de</strong> ejecutarse in<strong>de</strong>pendientemente <strong>de</strong> su posición en memoria.<br />
• Un salto se realiza si la condición probada es verda<strong>de</strong>ra<br />
• la condición que se prueba pue<strong>de</strong> ser:<br />
– Un bit especial <strong>de</strong> estado que se activa en función <strong>de</strong>l resultado <strong>de</strong> la ALU.<br />
» add r1,r2,r3<br />
» bz label # si (bit <strong>de</strong> estado “zero” está activo) ir a label<br />
– Registro arbitrario que toma el valor <strong>de</strong>l resultado <strong>de</strong> una comparación.<br />
» sub r1,r2,r3<br />
» beqz r1,label # si (r1==0) ir a label<br />
– En la propia instrucción <strong>de</strong> salto se realiza la comparación.<br />
» beq $1,$2,label # si ($1==$2) ir a label<br />
• Los saltos suelen ser cortos -> pocos bits para especificar la<br />
dirección.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 18 <strong>de</strong> 64
Bifurcaciones<br />
• La dirección <strong>de</strong> la siguiente instrucción a ejecutar es la especificada por<br />
el campo <strong>de</strong> operandos <strong>de</strong> la instrucción <strong>de</strong> bifurcación.<br />
– Ejemplo: J 2000 # ir a la dirección 2000 <strong>de</strong> memoria<br />
• La dirección <strong>de</strong> salto pue<strong>de</strong> especificarse <strong>de</strong> las siguientes formas:<br />
– Directa<br />
• <strong>El</strong> campo <strong>de</strong> operandos <strong>de</strong> la instrucción especifica directamente la<br />
siguiente instrucción que se ha <strong>de</strong> ejecutar.<br />
– J 1000<br />
– Indirecta<br />
• Saltos indirectos por registros<br />
– jr $5<br />
• Retornos <strong>de</strong> procedimientos o subrutinas<br />
– RET # I8086: La dirección <strong>de</strong> retorno la recupera <strong>de</strong>l “stack”.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 19 <strong>de</strong> 64
Procedimientos (o subrutinas)<br />
• Concepto <strong>de</strong> procedimiento o subrutina<br />
– Pue<strong>de</strong> consi<strong>de</strong>rarse como una herramienta <strong>de</strong>l programador para<br />
estructurar los programas y permitir que un programa <strong>de</strong>sarrollado pueda<br />
ser reutilizado.<br />
– Librerías <strong>de</strong> subrutinas<br />
• Llamada y retorno <strong>de</strong> procedimientos: Funcionamiento simplificado<br />
Programa principal<br />
D1: instrucción 1<br />
D2: instrucción 2<br />
D3: Llamada a “pru “ pru”<br />
D4: instrucción 4<br />
.<br />
.<br />
Dn: instrucción n<br />
Guarda<br />
dirección<br />
D4<br />
Registro<br />
o<br />
Stack<br />
Procedimiento Pru<br />
Instrucción 1<br />
instrucción 2<br />
instrucción 3<br />
inst. inst.<br />
retorno<br />
Recupera<br />
D4<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 20 <strong>de</strong> 64
Instrucciones <strong>de</strong> llamada y retorno <strong>de</strong><br />
procedimientos<br />
• Incluyen la transferencia <strong>de</strong>l control y guardar algún estado.<br />
– Como mínimo, <strong>de</strong>be guardarse la dirección <strong>de</strong> retorno en algún lugar que<br />
normalmente es: Un registro <strong>de</strong>l procesador o la pila (stack).<br />
• Algunas arquitecturas proporcionan mecanismos para guardar los<br />
registros. En otras, es el propio compilador quien genera las<br />
instrucciones para guardar los registros.<br />
• Convenios básicos para guardar los registros:<br />
– Guarda llamador (caller-saving)<br />
• Antes <strong>de</strong> llamar al procedimiento, se guardan los registros cuyo<br />
contenido se quiere preservar <strong>de</strong>spués <strong>de</strong> la llamada.<br />
– Guarda el llamado (called-saving)<br />
• <strong>El</strong> procedimiento llamado guarda los registros que quiera a utilizar.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 21 <strong>de</strong> 64
Frecuencia <strong>de</strong> uso <strong>de</strong> las instrucciones<br />
Ejemplo: Top 10 80x86 Instructions<br />
Rank instruction Integer Average Percent total executed<br />
1 load 22%<br />
2 conditional branch 20%<br />
3 compare 16%<br />
4 store 12%<br />
5 add 8%<br />
6 and 6%<br />
7 sub 5%<br />
8 move register-register 4%<br />
9 call 1%<br />
10 return 1%<br />
Total 96%<br />
Simple instructions dominate instruction frequency<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 22 <strong>de</strong> 64
etur<br />
Operaciones básicas<br />
• Conclusión: Soportar las siguientes operaciones porque son las<br />
que predominan en el conjunto <strong>de</strong> instrucciones ejecutadas.<br />
Tipo <strong>de</strong> instrucción Instrucción <strong>de</strong>l procesador MIPS<br />
load lw $a0, -30($t5) # $a0=M[-30+$t5]<br />
store sw $t2, 100($s5) # M[100+$s5]=$t2<br />
add add $t0,$t1,$t2 # $t0= $t1+t2<br />
subtract sub $a0,$s0,$s1 # $a0= $s0-$s1<br />
move register-register add $t0,$zero,$t1 # $t0=$t1<br />
and and $t0,$t1,$t2 # $t0= $t1&$t2<br />
shift sll $t0,$t1,5 # $t0=$t1
Tipos y tamaños <strong>de</strong> los operandos<br />
• Tipos <strong>de</strong> operandos<br />
– Bit:<br />
• 0,1<br />
– Carácter<br />
• ASCII <strong>de</strong> 7 u 8 bits (extensiones gráficas)<br />
• EBCDIC <strong>de</strong> 8 bits (utilizado por los gran<strong>de</strong>s computadores IBM)<br />
– Enteros<br />
• Números positivos y negativos representados en complemento a 2.<br />
• Byte: 8 bits<br />
• Media palabra (half-word): 16 bits<br />
• Palabra: 32 bits<br />
– Punto flotante<br />
• IEEE 754: Estándar para la representación en punto flotante.<br />
• Simple precisión (32 bits) y doble precisión (64 bits).<br />
– Decimal<br />
• Decimal empaquetado: Decimal codificado en binario (BCD), 4 bits para<br />
cada dígito, dos dígitos por byte. Ejemplo: 01001001 -> 49<br />
• Decimal no empaquetado. Ejemplo: 00000100 00001001 -> 4 9<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 24 <strong>de</strong> 64
Especificación <strong>de</strong>l tipo <strong>de</strong> operando<br />
• Dos alternativas:<br />
– Codificarlo en el código <strong>de</strong> operación <strong>de</strong> la instrucción (caso más frecuente).<br />
– Añadir i<strong>de</strong>ntificadores al dato que posteriormente serán interpretados por el<br />
hardware (método raramente utilizado)<br />
• Tagged architectures: Máquina <strong>de</strong> Burroughs<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 25 <strong>de</strong> 64
Frecuencia <strong>de</strong> uso <strong>de</strong> los tamaños <strong>de</strong> operandos<br />
Doubleword<br />
Word<br />
Halfword<br />
Byte<br />
0%<br />
0%<br />
0%<br />
7%<br />
19%<br />
31%<br />
• Es importante que las arquitecturas soporten:<br />
– Números enteros <strong>de</strong> 8, 16 y 32 bits.<br />
– Números en punto flotante <strong>de</strong> 32 y 64 bits (estándar IEEE754).<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 26 <strong>de</strong> 64<br />
69%<br />
74%<br />
0% 20% 40% 60% 80%<br />
Frequency of reference by size<br />
Int Avg.<br />
FP Avg.
Formatos <strong>de</strong> las instrucciones<br />
• La información autocontenida en una instrucción se codifica con<br />
unos y ceros y se empaqueta en grupos <strong>de</strong> bits que <strong>de</strong>finen los<br />
diferentes campos <strong>de</strong> una instrucción.<br />
• Campos <strong>de</strong> una instrucción<br />
Campo 1 Campo 2 ............... Campo n<br />
11110011 11010 ................ 110000<br />
• Alternativas <strong>de</strong> diseño:<br />
– Instrucciones <strong>de</strong> longitud variable<br />
• Alta <strong>de</strong>nsidad <strong>de</strong> código.<br />
• Programas compactos o <strong>de</strong> tamaño reducido.<br />
• Difícil implementación hardware.<br />
– Instrucciones <strong>de</strong> longitud fija<br />
• Mayor rendimiento (vía segmentación <strong>de</strong> las instrucciones)<br />
• Los programas son <strong>de</strong> mayor tamaño.<br />
• Fácil implementación hardware.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 27 <strong>de</strong> 64
Formatos <strong>de</strong> las instrucciones en el procesador<br />
MIPS<br />
Sólo tres formatos:<br />
• Formato R: add rd,rs,rt<br />
op rs rt rd shamt funct Formato <strong>de</strong> instrucciones aritméticas<br />
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits Todas las instrucciones MIPS <strong>de</strong> 32 bits<br />
000000 01010 11111 00011 00000 100000 0x015f1820 add $3,$10,$31<br />
• Formato I: lw rt,inmediato(rs)<br />
op rs rt Dirección/inmediato Formato <strong>de</strong> instrucciones carga<br />
6 bits 5 bits 5 bits 16 bits Todas las instrucciones MIPS <strong>de</strong> 32 bits<br />
100011 00011 00101 0000000000100000 0x8c650020 lw $5,32($3)<br />
• Formato J: j dirección<br />
op Dirección objetivo Formato <strong>de</strong> instrucciones bifurcación<br />
6 bits 26 bits Todas las instrucciones MIPS <strong>de</strong> 32 bits<br />
000010 00000100000000000000000000 0x08100000 j 0x400000<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 28 <strong>de</strong> 64
Ejemplo <strong>de</strong> arquitectura CISC<br />
(Complex Instruction Set Computer)<br />
• Máquina representativa CISC: VAX 11/780<br />
– Objetivos <strong>de</strong> VAX:<br />
• Compiladores sencillos y alta <strong>de</strong>nsidad <strong>de</strong> código.<br />
– Estos objetivos dieron lugar a:<br />
• Formato <strong>de</strong> instrucciones <strong>de</strong> longitud variable.<br />
• Potentes modos <strong>de</strong> direccionamiento.<br />
• Potentes instrucciones y codificación <strong>de</strong> las mismas.<br />
• Arquitectura altamente ortogonal: <strong>El</strong> código <strong>de</strong> operación es in<strong>de</strong>pendiente<br />
<strong>de</strong> los modos <strong>de</strong> direccionamiento que son in<strong>de</strong>pendientes <strong>de</strong> los tipos <strong>de</strong><br />
datos e incluso <strong>de</strong>l número <strong>de</strong> operandos. Una instrucción pue<strong>de</strong> utilizar<br />
cualquier modo <strong>de</strong> direccionamiento y tipo <strong>de</strong> dato <strong>de</strong> los soportados.<br />
– Ejemplo: SUMA<br />
(código <strong>de</strong> operación) (tipos <strong>de</strong> datos:byte, word, ...)(nº <strong>de</strong> operandos: 2,3)<br />
addb2 addw2 addl2 addf2 addd2<br />
addb3 addw3 addl3 addf3 addd3<br />
Cientos <strong>de</strong> operaciones se expan<strong>de</strong>n a miles <strong>de</strong> instrucciones!<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 29 <strong>de</strong> 64
Ejemplo <strong>de</strong> arquitectura RISC<br />
(Reduced Instruction Set Computer)<br />
• Ejemplo <strong>de</strong> procesador RISC: MIPS<br />
– Objetivos <strong>de</strong> MIPS<br />
• Alto rendimiento vía segmentación.<br />
• Facilitar la implementación hardware <strong>de</strong> las instrucciones.<br />
• Compatibilidad con compiladores altamente optimizados.<br />
– Estos objetivos dieron lugar a:<br />
• Instrucciones sencillas.<br />
• Modos <strong>de</strong> direccionamiento sencillos.<br />
• Formato <strong>de</strong> instrucciones <strong>de</strong> longitud fija.<br />
• Gran número <strong>de</strong> registros.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 30 <strong>de</strong> 64
Procedimientos<br />
• Definición: Fragmento <strong>de</strong> código que realiza una tarea concreta y que<br />
pue<strong>de</strong> ser llamado o activado <strong>de</strong>s<strong>de</strong> otra parte <strong>de</strong>l programa.<br />
• Ventajas <strong>de</strong>l uso <strong>de</strong> procedimientos<br />
– Estructuración modular <strong>de</strong> los programas:<br />
• Nos permite <strong>de</strong>scomponer un programa complejo en otros más sencillos<br />
que se pue<strong>de</strong>n editar, compilar y <strong>de</strong>purar <strong>de</strong> forma in<strong>de</strong>pendiente.<br />
– Código reutilizable<br />
• Librerías <strong>de</strong> procedimientos<br />
Llamada a un procedimiento<br />
nombre_proc (pa1, pa2,...) p 1, p 2,..: parámetros actuales<br />
Formato<br />
Procedimiento nombre_proc(p1, p2,..) <strong>de</strong>claraciones<br />
inicio<br />
<br />
fin<br />
p1, p2,..: parámetros formales<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 31 <strong>de</strong> 64
Pasos en la llamada a un procedimiento<br />
Programa principal<br />
•<br />
Paso 1: Paso <strong>de</strong> parámetros. Colocar los<br />
parámetros <strong>de</strong> paso al procedimiento (en<br />
registros o stack).<br />
Paso 2: Llamada al procedimiento<br />
•<br />
•<br />
Procedimiento<br />
Paso 3: Salvar registros. Crear bloque <strong>de</strong><br />
activación (adquirir los recursos <strong>de</strong><br />
almacenamiento necesitados por el<br />
procedimiento). Guardar en el stack los<br />
registros que se <strong>de</strong>seen preservar (callee<br />
saving). Gestión <strong>de</strong>l bloque <strong>de</strong> activación.<br />
Paso 4: Cuerpo <strong>de</strong>l Procedimiento. Ejecuta<br />
tarea a realizar.<br />
Paso 5: Colocar los resultados para pasarlos<br />
al programa principal. Restaurar registros.<br />
Destruye bloque <strong>de</strong> activación.<br />
Paso 6: Retorno al procedimiento.<br />
Regresa al programa principal (dirección<br />
siguiente a la llamada <strong>de</strong> procedimiento).<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 32 <strong>de</strong> 64
Tipos <strong>de</strong> procedimientos<br />
• Procedimiento anidado<br />
– Un procedimiento A llama a otro B que a su vez llama a otro C y ......<br />
• Procedimiento recursivo<br />
– Procedimiento que se llama a si mismo<br />
• Procedimiento reentrante<br />
Guardar Guardar<br />
Proc A Proc B Proc C<br />
Recuperar<br />
Recuperar<br />
Procedimiento FACTORIAL (N)<br />
integer N, FACTORIAL<br />
if N
La Pila (o stack)<br />
• Estructura <strong>de</strong> datos tipo LIFO (Last Input First Output) útil para:<br />
– Contener valores pasados a un procedimiento como parámetros.<br />
– Salvar la información que se <strong>de</strong>see preservar en llamadas a procedimientos.<br />
• Por ejemplo, registros que el invocador no quiere cambiar.<br />
– Proporcionar a un procedimiento espacio para variables locales<br />
• Operaciones básicas:<br />
• Guardar (push) y recuperar (pop).<br />
• Normalmente, la estructura <strong>de</strong> datos crece hacia posiciones más bajas<br />
<strong>de</strong> memoria.<br />
• Puntero <strong>de</strong> pila (Stack Pointer, SP)<br />
– Puntero o registro cuyo contenido apunta a la cima <strong>de</strong> la pila.<br />
– Ejemplo: MIPS utiliza el registro 29 ($29 o $sp) como puntero <strong>de</strong> pila.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 34 <strong>de</strong> 64
Operaciones sobre la pila<br />
sp-4<br />
sp<br />
Guardar (push)<br />
1. Decrementar puntero<br />
2. Escribir en memoria (store)<br />
MIPS:<br />
addi $sp,$sp,-4<br />
sw $reg, 0($sp)<br />
Memoria Dirección<br />
Valor guardado<br />
Baja<br />
Alta<br />
Recuperar (pop)<br />
1. Leer <strong>de</strong> memoria (load)<br />
2. Incrementar puntero<br />
MIPS:<br />
lw $reg, 0($sp)<br />
addi $sp,$sp,4<br />
Memoria Dirección<br />
Valor leído<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 35 <strong>de</strong> 64<br />
sp<br />
sp+4<br />
Baja<br />
Alta
Bloque <strong>de</strong> activación antes, durante y <strong>de</strong>spués <strong>de</strong><br />
la llamada a un procedimiento<br />
# Programa principal<br />
.....<br />
Llamar_a B(p1,p2,..)<br />
Antes<br />
Dirección baja<br />
<strong>de</strong> memoria Durante Después<br />
sp -> Variables locales<br />
Registros<br />
guardados<br />
Dirección <strong>de</strong> retorno<br />
fpOLD sp -><br />
Ejemplo: Soporte a procedimientos <strong>de</strong> la<br />
arquitectura MIPS<br />
• Convenio <strong>de</strong> los programadores para el uso <strong>de</strong> los registros<br />
– $a0 - $a3: Registros para paso <strong>de</strong> hasta 4 parámetros.<br />
– $v0 - $v1: Registros para la <strong>de</strong>volución <strong>de</strong> resultados.<br />
– $gp: puntero global que apunta a un segmento <strong>de</strong> datos estáticos.<br />
– $sp: Puntero <strong>de</strong> pila.<br />
– $fp: Puntero <strong>de</strong> encuadre (frame pointer).<br />
– $ra: Registro para guardar la dirección <strong>de</strong> retorno al realizar la llamada.<br />
• Instrucción MIPS para llamada a procedimientos<br />
– Jump - and - Link (jal)<br />
• jal ProcedureAddress # $ra= PC+ 4; ir a ProcedureAddress<br />
• jalr registro # $ra= PC+ 4; ir a (registro)<br />
• Instrucción MIPS para el retorno <strong>de</strong> procedimientos<br />
– Jump Register (jr)<br />
• jr $ra # ir a la dirección dada por $ra<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 37 <strong>de</strong> 64
Arquitectura MIPS: Convenio para el uso <strong>de</strong> los<br />
registros en llamadas a procedimientos<br />
Nombre Nº reg. Uso<br />
Preservado<br />
en llamadas?<br />
$zero 0 Constante 0 -<br />
$at 1 Reservado para el ensamblador -<br />
$v0-$v1 2-3 Valores <strong>de</strong> resultados y evaluación <strong>de</strong> expresiones no<br />
$a0-$a3 4-7 Paso <strong>de</strong> parámetros (hasta cuatro; más a través <strong>de</strong> la pila) no<br />
$t0-$t7 16-23 Registros temporales no<br />
$s0-$s7 16-23 Registros que <strong>de</strong>ben preservarse si<br />
$t8-$t9 24-25 Registros temporales no<br />
$k0-$k1 26-27 Reservado para el Sistema Operativo -<br />
$gp 28 Puntero global (global pointer) si<br />
$sp 29 Puntero <strong>de</strong> pila (stack pointer) si<br />
$fp 30 Puntero <strong>de</strong> encuadre (frame pointer) si<br />
$ra 31 Dirección <strong>de</strong> vuelta (return address) si<br />
Las abreviaciones <strong>de</strong> dos letras y nombre <strong>de</strong> los registros reflejan los usos pensados para ellos en el convenio.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 38 <strong>de</strong> 64
Ejemplo para MIPS<br />
SP <br />
SP=SP-20 <br />
# Ejemplo para MIPS<br />
# Programa principal<br />
main: li $a0,5<br />
li $a1,8<br />
jal multi<br />
....................<br />
# comienzo <strong>de</strong>l procedimiento<br />
multi: addi $sp,$sp,-20 # Crea bloque <strong>de</strong> activación.<br />
# Salva registros. Crea variables locales si se necesitan.<br />
sw $fp, 16($sp) # guarda fp antiguo<br />
sw $ra, 12($sp) # guarda dirección <strong>de</strong> retorno<br />
sw $s0, 8($sp) # guarda $s0<br />
sw $s1, 4($sp) # guarda $s1<br />
sw<br />
addi<br />
$s2, 0($sp) # guarda $s2<br />
$fp,$sp,16 # nuevo fp<br />
# cuerpo procedimiento<br />
.....<br />
# Restaura registros<br />
lw $s2, 0($sp) # recupera $s2<br />
lw $s1, 4($sp) # recupera $s1<br />
lw $s0, 8($sp) # recupera $s0<br />
lw $ra, 12($sp) # recupera dirección <strong>de</strong> retorno<br />
lw $fp, 16($sp) # recupera fp antiguo<br />
addi $sp,$sp,20 # Destruye bloque activación<br />
jr $ra # retorna al programa principal<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 39 <strong>de</strong> 64<br />
$s2<br />
$s1<br />
$s0<br />
Registros salvados<br />
$ra: dir. retorno<br />
$fp: frame pointer<br />
Dirección baja<br />
<strong>de</strong> memoria<br />
Clasificación <strong>de</strong> las arquitecturas a <strong>nivel</strong> <strong>de</strong><br />
<strong>lenguaje</strong> <strong>máquina</strong><br />
• La clasificación pue<strong>de</strong> realizarse atendiendo a varios criterios entre los<br />
que <strong>de</strong>stacamos:<br />
– Almacenamiento <strong>de</strong> los operandos en la CPU.<br />
• A<strong>de</strong>más <strong>de</strong> en memoria ¿dón<strong>de</strong> se encuentran los operandos?<br />
– Número <strong>de</strong> operandos explícitos por la instrucción.<br />
– Posición <strong>de</strong>l operando.<br />
– Tipo <strong>de</strong> instrucciones<br />
– Tipo y tamaño <strong>de</strong> los operandos<br />
• Almacenamiento <strong>de</strong> los operandos en la CPU.<br />
– Criterio más importante que nos permite diferenciar una arquitectura <strong>de</strong> otra.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 40 <strong>de</strong> 64
Clasificación <strong>de</strong> las arquitecturas atendiendo al<br />
almacenamiento <strong>de</strong> operandos en la CPU<br />
• Alternativas para almacenar operandos en la CPU<br />
Arquitectura Operandos Destino <strong>de</strong> Procedimiento para acce<strong>de</strong>r a<br />
explícitos resultados<br />
operandos explícitos<br />
Arquitectura <strong>de</strong> Pila 0 Pila Introducir y sacar <strong>de</strong> la pila<br />
Arquitectura <strong>de</strong> Acumulador 1 Acumulador Cargar/almacenar acumulador<br />
Arquitectura <strong>de</strong> Registros <strong>de</strong><br />
Propósito General<br />
2 ó 3 Registros o<br />
memoria<br />
• Ejemplo: C= A + B (C,A y B variables en memoria)<br />
Pila Acumulador Registros<br />
PUSH A LOAD A LOAD R1, A<br />
PUSH B ADD B ADD R1, B<br />
ADD STORE C STORE C,R1<br />
POP C<br />
Cargar/almacenar registro o memoria<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 41 <strong>de</strong> 64
Ventajas y <strong>de</strong>sventajas <strong>de</strong> cada una <strong>de</strong> las<br />
arquitecturas<br />
Tipo <strong>de</strong> <strong>máquina</strong> Ventaja Desventaja<br />
Pila Mo<strong>de</strong>lo sencillo para la evaluzación<br />
<strong>de</strong> expresiones.<br />
Instrucciones cortas. Buena <strong>de</strong>nsidad<br />
<strong>de</strong> código<br />
Acumulador Instrucciones cortas.<br />
Minimiza los estados internos <strong>de</strong> la<br />
<strong>máquina</strong><br />
Registro Mo<strong>de</strong>lo más general para la<br />
generación <strong>de</strong> código.<br />
Uso efectivo <strong>de</strong> los registros por los<br />
compiladores.<br />
Acceso no aleatorio a la pila. Difícil<br />
generación <strong>de</strong> código eficiente.<br />
Dificulta una implementación<br />
eficiente.<br />
Como el acumulador es sólo<br />
almacenamiento temporal, el tráfico<br />
<strong>de</strong> memoria es el más alto.<br />
Todos los operandos <strong>de</strong>ben ser<br />
nombrados -> instrucciones más<br />
largas.<br />
- Años 60: Arquitecturas <strong>de</strong> pila.<br />
- Años 70: Arquitecturas CISC (ej. VAX)<br />
- Años 80: Arquitecturas RISC (ej. MIPS)<br />
Las arquitecturas <strong>de</strong> registros son las que dominan hoy día!<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 42 <strong>de</strong> 64
Clasificación <strong>de</strong> las arquitecturas <strong>de</strong> registros <strong>de</strong><br />
propósito general<br />
• Clasificación <strong>de</strong> las arquitecturas <strong>de</strong> registros atendiendo a:<br />
– Número <strong>de</strong> operandos: 2 o 3.<br />
• add r1,r2 # r1=r1 + r2<br />
• add r1,r2,r3 # r1=r2 + r3<br />
– Número <strong>de</strong> operandos en memoria: <strong>de</strong> 0 a 3.<br />
• add r1,r2,r3 # r1=r2 + r3<br />
• add r1,r2,B # r1=r2 + EA(A)<br />
• add r1,B,A # r1=EA(A) + EA(B)<br />
• add C,B,A # EA(C)=EA(B) + EA(A)<br />
• Las arquitecturas <strong>de</strong> registros dominan hoy día.<br />
– Los registros son más rápidos que la memoria<br />
– Los registros son fáciles <strong>de</strong> usar por el compilador.<br />
– Los registros pue<strong>de</strong>n almacenar variables:<br />
• Reducción <strong>de</strong>l tráfico <strong>de</strong> memoria. Disminución <strong>de</strong>l tiempo <strong>de</strong> ejecución.<br />
• Mejor <strong>de</strong>nsidad <strong>de</strong> código: unos cuantos bits son suficientes para<br />
especificar un registro. En cualquier caso, menos que los necesarios<br />
para indicar una dirección <strong>de</strong> memoria.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 43 <strong>de</strong> 64
Arquitecturas <strong>de</strong> registros <strong>de</strong> propósito general<br />
más frecuentes<br />
Registro-Registro<br />
(0,3)<br />
Registro-Memoria<br />
(1,2)<br />
Memoria-Memoria<br />
(3,3)<br />
Tipo Ventajas Desventajas<br />
Instrucciones longitud fija.<br />
Fácil codificación.<br />
Mo<strong>de</strong>lo simple <strong>de</strong> generación <strong>de</strong><br />
código.<br />
Los datos pue<strong>de</strong>n ser accedidos sin<br />
cargarlos primero en registros.<br />
Fácil formato <strong>de</strong> instrucción.<br />
Buena <strong>de</strong>nsidad <strong>de</strong> código.<br />
Más compacta.<br />
No emplean registros para datos<br />
temporales<br />
Recuento <strong>de</strong> instrucciones más alto que las<br />
arquitecturas con referencias a memoria.<br />
La codificación <strong>de</strong> una dirección <strong>de</strong><br />
memoria y un registro en cada instrucción<br />
pue<strong>de</strong> restringir el número <strong>de</strong> registros.<br />
Los ciclos por instrucción varían por la<br />
posición <strong>de</strong>l operando.<br />
Notación (m,n). m: Número <strong>de</strong> operandos en memoria; n: Número <strong>de</strong> operandos totales.<br />
Gran variación en el tamaño <strong>de</strong> las<br />
instrucciones.<br />
Los accesos a memoria crean cuellos <strong>de</strong><br />
botella importantes.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 44 <strong>de</strong> 64
Número <strong>de</strong> registros en arquitecturas populares<br />
Máquina<br />
Número <strong>de</strong> registros <strong>de</strong><br />
propósito general<br />
Estilo <strong>de</strong> arquitectura Año<br />
EDSAC 1 Acumulador 1949<br />
IBM701 1 Acumulador 1953<br />
IBM360 16 Registro-memoria 1964<br />
DEC PDP11 8 Registro-memoria 1970<br />
INTEL 8008 1 Acumulador 1972<br />
MOTOROLA 6800 2 Acumulador 1974<br />
DEC VAX 16 Registro-memoria,<br />
memoriamemoria-<br />
1977<br />
INTEL 8086 1 Acumulador extendido 1978<br />
MOTOROLA 68000 16 Registro-memoria 1980<br />
INTEL 80386 8 Registro-memoria 1985<br />
MIPS 32 Registro-Registro<br />
(carga/almacenamiento)<br />
1985<br />
HP PA-RISC 32 “ 1986<br />
SPARC 32 “ 1987<br />
PowerPC 32 “ 1992<br />
DEC ALPHA 32 “ 1992<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 45 <strong>de</strong> 64
Lenguaje ensamblador<br />
• Introducción.<br />
• Ventajas e inconvenientes <strong>de</strong>l <strong>lenguaje</strong> ensamblador.<br />
• Funcionamiento <strong>de</strong>l ensamblador.<br />
• <strong>El</strong> montador <strong>de</strong> enlaces (o linker).<br />
• Utilida<strong>de</strong>s <strong>de</strong> los ensambladores.<br />
• Lenguaje ensamblador <strong>de</strong>l procesador MIPS R2000<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 46 <strong>de</strong> 64
Ventajas e inconvenientes <strong>de</strong>l <strong>lenguaje</strong><br />
ensamblador<br />
• Ventajas <strong>de</strong>l <strong>lenguaje</strong> ensamblador<br />
– Útil cuando es crítico alguno <strong>de</strong> los siguientes factores:<br />
• Tiempo <strong>de</strong> ejecución <strong>de</strong>l programa.<br />
• Tamaño <strong>de</strong>l programa.<br />
– <strong>El</strong> programador pue<strong>de</strong> seleccionar instrucciones específicas <strong>de</strong> la<br />
arquitectura para realizar una <strong>de</strong>terminada operación.<br />
• Inconvenientes <strong>de</strong>l <strong>lenguaje</strong> ensamblador<br />
– Los programas son específicamente inherentes a la <strong>máquina</strong>.<br />
– Son <strong>de</strong> mayor tamaño que los programas equivalentes escritos en <strong>lenguaje</strong><br />
<strong>de</strong> alto <strong>nivel</strong>. Menor productividad <strong>de</strong>l <strong>de</strong>sarrollo software.<br />
– Los programas son difíciles <strong>de</strong> leer, escribir y pue<strong>de</strong>n contener más errores.<br />
• Soluciones híbridas para aprovechar la fortaleza <strong>de</strong> cada <strong>lenguaje</strong><br />
– La mayor parte <strong>de</strong>l programa se escribe en alto <strong>nivel</strong>.<br />
– Las secciones críticas en <strong>lenguaje</strong> ensamblador.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 47 <strong>de</strong> 64
Funcionamiento <strong>de</strong>l ensamblador<br />
• Un ensamblador traduce un archivo con sentencias en <strong>lenguaje</strong><br />
ensamblador a un archivo <strong>de</strong> instrucciones <strong>máquina</strong> y datos binarios.<br />
• Traducción en dos pasadas:<br />
– Primera pasada:<br />
• Calcula las posiciones <strong>de</strong> memoria que correspon<strong>de</strong>n a los nombres<br />
simbólicos que aparecen en el programa para que sean conocidas<br />
cuando <strong>de</strong> traduzcan las instrucciones. Crea tabla <strong>de</strong> símbolos.<br />
– Segunda pasada:<br />
• Traduce cada sentencia <strong>de</strong>l <strong>lenguaje</strong> ensamblador al combinar los<br />
equivalentes numéricos <strong>de</strong> los códigos <strong>de</strong> operación, especificadores <strong>de</strong><br />
registros y rótulos <strong>de</strong> la tabla <strong>de</strong> símbolos en una instrucción legal.<br />
• Rótulos o etiquetas<br />
– Externos o globales: Pue<strong>de</strong>n ser referenciados <strong>de</strong>s<strong>de</strong> otro archivo distinto<br />
<strong>de</strong> aquél en el que se <strong>de</strong>fine (hay que <strong>de</strong>clararlos como tales).<br />
– Internos o locales: Sólo pue<strong>de</strong> ser referenciado en el archivo en el que se<br />
<strong>de</strong>fine (locales por <strong>de</strong>fecto).<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 48 <strong>de</strong> 64
<strong>El</strong> montador <strong>de</strong> enlaces (linker)<br />
• <strong>El</strong> ensamblador procesa cada archivo <strong>de</strong> un programa <strong>de</strong> forma<br />
individual. Solamente se conocen las direcciones <strong>de</strong> los rótulos locales.<br />
• Necesidad <strong>de</strong> otra herramienta: <strong>El</strong> montador <strong>de</strong> enlaces (o linker).<br />
– Combina una colección <strong>de</strong> archivos objetos y librerías (opcional) en otro<br />
archivo ejecutable al resolver los rótulos externos.<br />
– <strong>El</strong> ensamblador asiste al montador suministrándole una tabla <strong>de</strong> símbolos o<br />
rótulos y referencias no resueltas.<br />
Archivo<br />
fuente<br />
Archivo<br />
fuente<br />
Archivo<br />
fuente<br />
Ensamblador<br />
Ensamblador<br />
Ensamblador<br />
Archivo<br />
objeto<br />
Archivo<br />
objeto<br />
Archivo<br />
objeto<br />
Enlazador<br />
Librería<br />
Archivo<br />
ejecutable<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 49 <strong>de</strong> 64
Utilida<strong>de</strong>s <strong>de</strong> los ensambladores<br />
• Los ensambladores proporcionan diversas características (utilida<strong>de</strong>s)<br />
que facilitan al programador la escritura <strong>de</strong> los programas.<br />
• Utilida<strong>de</strong>s:<br />
– Directivas para organizar datos en memoria.<br />
• Permite al programador <strong>de</strong>scribir los datos <strong>de</strong> una manera más concisa<br />
y natural que la representación binaria: <strong>de</strong>cimal, ASCII, hexa<strong>de</strong>cimal,...<br />
– Macros<br />
• Permiten nombrar una secuencia <strong>de</strong> instrucciones frecuentemente<br />
utilizada. No confundir con procedimiento o subrutina.<br />
– Pseudoinstrucciones<br />
• Son proporcionadas por algunos <strong>lenguaje</strong>s ensambladores y no forman<br />
parte <strong>de</strong>l repertorio <strong>de</strong> instrucciones <strong>de</strong>l procesador. <strong>El</strong> ensamblador las<br />
sintetiza a partir <strong>de</strong> instrucciones puras <strong>de</strong>l procesador.<br />
– Utilización <strong>de</strong> símbolos<br />
• Muy útil en instrucciones <strong>de</strong> control <strong>de</strong> flujo o para hacer referencia a los<br />
datos.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 50 <strong>de</strong> 64
Lenguaje ensamblador MIPS R2000<br />
• Componentes <strong>de</strong> un procesador MIPS<br />
• Modos <strong>de</strong> direccionamiento<br />
• Sintaxis <strong>de</strong>l ensamblador<br />
• Directivas <strong>de</strong>l ensamblador soportadas por el simulador SPIM.<br />
• Formato <strong>de</strong> las instrucciones.<br />
• Repertorio <strong>de</strong> instrucciones<br />
– Aritméticas<br />
– Lógicas<br />
– Transferencia <strong>de</strong> datos<br />
– Movimiento <strong>de</strong> datos<br />
– Comparación<br />
– Salto y bifurcación<br />
• Ejemplo <strong>de</strong> programa en ensamblador<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 51 <strong>de</strong> 64
Componentes <strong>de</strong> un procesador MIPS<br />
• Componentes<br />
– CPU<br />
– Dos coprocesadores: 0 y 1.<br />
• CPU: 32 registros <strong>de</strong> propósito general<br />
– $0: Siempre contiene 0<br />
– $1-$31: Propósito general<br />
• C0: 4 registros<br />
– BadVAddr (reg. Nº 8), Status (reg. Nº 12)<br />
– Cause (reg. Nº 13), EPC (reg. Nº 14)<br />
• C1: 32 registros para punto flotante<br />
– 16 registros simple precisión<br />
• $f0, $f2, …. $f30 (32 bits)<br />
– 16 registros doble precisión (64 bits<br />
• $f0-$f1, $f2-$f3, …. $f30-$f31<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 52 <strong>de</strong> 64<br />
CPU<br />
Arithmetic<br />
unit<br />
Registers<br />
$0<br />
$31<br />
Memory<br />
Multiply<br />
divi<strong>de</strong><br />
Lo Hi<br />
Coprocessor 1 (FPU)<br />
Coprocessor 0 (traps and memory)<br />
Registers<br />
BadVAddr<br />
Status<br />
Cause<br />
EPC<br />
Registers<br />
$0<br />
$31<br />
Arithmetic<br />
unit
Convenio para el uso <strong>de</strong> la memoria en sistemas<br />
basados en el procesador MIPS<br />
0x7FFFFFFF Pila Segmento <strong>de</strong> pila<br />
0x10000000<br />
0x00400000<br />
0x00000000<br />
Datos dinámicos<br />
Datos estáticos<br />
Segmento <strong>de</strong> datos<br />
Código Segmento <strong>de</strong> texto<br />
Reservada<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 53 <strong>de</strong> 64
Modos <strong>de</strong> direccionamiento<br />
Register (direct)<br />
Immediate<br />
Base+in<strong>de</strong>x<br />
PC-relative<br />
op rs rt rd<br />
register<br />
op rs rt<br />
op rs rt<br />
register<br />
op rs rt<br />
PC<br />
immed<br />
immed<br />
immed<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 54 <strong>de</strong> 64<br />
+<br />
+<br />
Memory<br />
Memory
Sintaxis <strong>de</strong>l ensamblador<br />
• Líneas <strong>de</strong> comentarios<br />
– Todo lo que haya a partir <strong>de</strong>l simbolo # hasta el final <strong>de</strong> línea se ignora.<br />
• Directivas<br />
– Secuencia <strong>de</strong> caracteres, (_) y (.) que no empiezan por un número.<br />
• Etiquetas<br />
– Se <strong>de</strong>claran colocándolas al principio <strong>de</strong> línea y terminadas en (:).<br />
• Número <strong>de</strong>cimales y hexa<strong>de</strong>cimales<br />
– Números en base 10 por <strong>de</strong>fecto.<br />
– Hexa<strong>de</strong>cimales o en base 16 precedidos por 0x.<br />
• Ca<strong>de</strong>nas o strings<br />
– Las ca<strong>de</strong>nas están encerradas entre dos comillas (“).<br />
– Caracteres especiales:<br />
• \n Nueva línea<br />
• \t Tab<br />
• \” Comillas<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 55 <strong>de</strong> 64
Ejemplo <strong>de</strong> sintaxis<br />
############################################################################<br />
# Sintaxis <strong>de</strong>l ensamblador #<br />
############################################################################<br />
# Comienzo <strong>de</strong>l segmento <strong>de</strong> datos<br />
.data 0x10000000<br />
init: .word 0x10,25,0x11223344 # <strong>de</strong>claración <strong>de</strong> 3 variables tipo word (4 bytes)<br />
string: .asciiz “Soy una ca<strong>de</strong>na \n” # <strong>de</strong>claración <strong>de</strong> una ca<strong>de</strong>na<br />
# Comienzo <strong>de</strong>l segmento <strong>de</strong> código<br />
.text 0x400000<br />
.globl main # <strong>de</strong>claramos la etiqueta “main” como global<br />
main: lw $t0,-8($s0) # comentario<br />
addi $t0,$t0,1 # comentario<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 56 <strong>de</strong> 64
Directivas <strong>de</strong>l ensamblador <strong>de</strong> MIPS soportadas<br />
por el simulador SPIM<br />
•SPIM soporta un subconjunto <strong>de</strong> las directivas <strong>de</strong>l ensamblador MIPS<br />
– .align n<br />
– .ascii str<br />
– .asciiz str<br />
– .byte b1,b2,...<br />
– .half h1,h2,...<br />
– .word w1,w2,...<br />
– .float f1,f2,...<br />
– .double d1,d2,...<br />
– .space n<br />
– .data <br />
– .text <br />
– .ktext<br />
– .kdata<br />
<br />
– .globl símbolo<br />
– .extern símbolo size<br />
– .set noat<br />
– .set at<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 57 <strong>de</strong> 64
Formato <strong>de</strong> las instrucciones<br />
Sólo tres tipos <strong>de</strong> formatos:<br />
• Formato R: add rd,rs,rt<br />
op rs rt rd shamt funct Formato <strong>de</strong> instrucciones aritméticas<br />
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits Todas las instrucciones MIPS <strong>de</strong> 32 bits<br />
000000 01010 11111 00011 00000 100000 0x015f1820 add $3,$10,$31<br />
• Formato I: lw rt,inmediato(rs)<br />
op rs rt Dirección/inmediato Formato <strong>de</strong> instruciones <strong>de</strong> carga<br />
6 bits 5 bits 5 bits 16 bits Todas las instrucciones MIPS <strong>de</strong> 32 bits<br />
100011 00011 00101 0000000000100000 0x8c650020 lw $5,32($3)<br />
• Formato J: j dirección<br />
op Dirección objetivo Formato <strong>de</strong> instrucciones <strong>de</strong> bifurcación<br />
6 bits 26 bits Todas las instrucciones MIPS <strong>de</strong> 32 bits<br />
000010 000000000010000000000000000 0x08010000 j 0x400000<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 58 <strong>de</strong> 64
Repertorio <strong>de</strong> instrucciones MIPS:<br />
Instrucciones aritméticas<br />
Instrucción Ejemplo Significado Comentarios<br />
sumar add $1,$2,$3 $1= $2+$3 Posible excepción por <strong>de</strong>sbordamiento<br />
sumar sin signo addu $1,$2,$3 $1=$2+$3 -<br />
sumar inmediato addi $1,$2,10 $1=$2+10 Posible excepción por <strong>de</strong>sbordamiento<br />
sumar inmediato sin signo addiu $1,$2,10 $1=$2+10 -<br />
restar sub $1,$2,$3 $1=$2-$3 Posible excepción por <strong>de</strong>sbordamiento<br />
restar sin signo subu $1,$2,$3 $1=$2-$3 -<br />
dividir div $1,$2<br />
Lo=$1÷$2<br />
Hi=$1mod$2<br />
Posible excepción por <strong>de</strong>sbordamiento<br />
dividir sin signo divu $1,$2<br />
Lo=$1÷$2<br />
-<br />
Hi=$1mod$2<br />
multiplicar mult $1,$2 Hi,Lo=$1*$2 -<br />
multiplicar sin signo multu $1,$2 Hi,Lo=$1*$2 -<br />
Pseudoinstrucciones<br />
valor absoluto abs<br />
dividir div $1,$2,$3<br />
$1=$2÷$3<br />
(cociente)<br />
dividir sin signo divu $1,$2,$3<br />
$1=$2÷$3<br />
-<br />
(cociente)<br />
Posible excepción por <strong>de</strong>sbordamiento<br />
multiplicar mul $1,$2,$3 $1=$2*$3 -<br />
multiplicar mulo $1,$2,$3 $1=$2*$3 Posible excepción por <strong>de</strong>sbordamiento<br />
multiplicar sin signo mulou $1,$2,$3 $1=$2*$3 Posible excepción por <strong>de</strong>sbordamiento<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 59 <strong>de</strong> 64
Repertorio <strong>de</strong> instrucciones MIPS:<br />
Instrucciones lógicas<br />
Instrucción Ejemplo Significado Comentarios<br />
and and $1,$2,$3 $1= $2&$3<br />
or andi $1,$2,10 $1=$2&10<br />
xor xor $1,$2,$3 $1=$2⊕$3<br />
nor nor $1,$2,$3 $1=~($2|$3)<br />
andi andi $1,$2,10 $1=$2&10<br />
ori ori $1,$2,10 $1= $2|10<br />
xori xori $1,$2,10 $1=$2|10<br />
shift left logical sll $1,$2,10 $1= $2$3<br />
shift right arithmetic sra $1,$2,10 $1=$2>>10<br />
shift right arithmetic variable srav $1,$2,$3 $1=$2>>$3<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 60 <strong>de</strong> 64
Repertorio <strong>de</strong> instrucciones MIPS:<br />
Instrucciones <strong>de</strong> transferencia <strong>de</strong> datos<br />
Instrucción Ejemplo Significado Comentarios<br />
carga byte lb $1,10($2) $1=M[10+$2] Extien<strong>de</strong> el bit <strong>de</strong> signo<br />
carga byte sin ext. signo lbu $1,10($2) $1=M[10+$2] No extien<strong>de</strong> el bit <strong>de</strong> signo<br />
carga media palabra lh $1,10($2) $1=M[10+$2] Extien<strong>de</strong> el bit <strong>de</strong> signo<br />
carga media palabra sin<br />
extensión <strong>de</strong> signo<br />
lhu $1,10($2) $1=M[10+$2] No extien<strong>de</strong> el bit <strong>de</strong> signo<br />
carga palabra lw $1,10($2) $1=M[10+$2]<br />
carga inmediata <strong>de</strong> la<br />
parte más significativa<br />
“load upper inmediate”<br />
Carga registro <strong>de</strong>l<br />
coprocesador z<br />
16 Carga un dato <strong>de</strong> 16 bits en la parte más<br />
lui $1,50 $1=50*2<br />
significativa <strong>de</strong>l registro.<br />
lwc1 $f0,10($2) $f0= M[10+$2]<br />
almacena byte sb $1,10($2) M[10+$2]=$1<br />
almacena media palabra sh $1,10($2) M[10+$2]=$1<br />
almacena palabra sw $1,10($2) M[10+$2]=$1<br />
almacena registro en<br />
memoria registro <strong>de</strong>l swc1 $f0,10($2) M[10+$2]=$f0<br />
coprocesador z<br />
Pseudoinstrucciones<br />
Carga inmediata li $1,1000 $1=1000 Carga <strong>de</strong> un dato <strong>de</strong> 32 bits<br />
Carga dirección la $3,label<br />
$3=dirección <strong>de</strong><br />
label<br />
Transfiere la dirección <strong>de</strong> memoria no el<br />
contenido.<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 61 <strong>de</strong> 64
Repertorio <strong>de</strong> instrucciones MIPS:<br />
Instrucciones <strong>de</strong> movimiento <strong>de</strong> datos<br />
Instrucción Ejemplo Significado Comentarios<br />
mover <strong>de</strong>s<strong>de</strong> Hi mfhi $1 $1= Hi<br />
mover <strong>de</strong>s<strong>de</strong> Lo mflo $1 $1= Lo<br />
mover a Hi mthi $1 Hi=$1<br />
mover a Lo mtlo $1 Lo=$1<br />
mover <strong>de</strong>s<strong>de</strong> coprocesador z mfcz $1,$f0 $1=$f0 $f0-$f30: Registros <strong>de</strong>l coprocesador 1<br />
mover al coprocesador z mtcz $1,$f0 $f0=$1<br />
Pseudoinstrucciones<br />
transfiere o mueve move $1,$2 $1=$2<br />
transfiere doble <strong>de</strong>s<strong>de</strong> coproc. 1 mfc1.d $4,$f0<br />
$4=$F0<br />
$5=$F1<br />
Fundamento <strong>de</strong> Computadores (1º II) Cap 2: <strong>El</strong> <strong>nivel</strong> <strong>de</strong> <strong>lenguaje</strong> <strong>máquina</strong> 62 <strong>de</strong> 64
Repertorio <strong>de</strong> instrucciones MIPS:<br />
Instrucciones <strong>de</strong> comparación<br />
Instrucción Ejemplo Significado<br />
if ($2
Repertorio <strong>de</strong> instrucciones MIPS:<br />
Instrucciones <strong>de</strong> salto y bifurcación<br />
Instrucción Ejemplo Significado Comentarios<br />
salta sobre igual beq $1,$2,100 si($1==$2) ir a PC+4 +100<br />
salta sobre no igual bne $1,$2,100 si($1!=$2) ir a PC+4 +100<br />
salta sobre mayor o igual que cero bgez $1,100 si($1>=0) ir a PC+4 +100<br />
salta sobre mayor o igual que cero y<br />
bgezal $1,1000 si($1>=0) $31=PC+4; ir a 1000<br />
enlaza<br />
.....<br />
bifurcar j 2000 ir a 2000<br />
bifurcar registro jr $1 ir a $1<br />
Bifurcar y enlazar jal 10000 $31=PC+4; ir a 10000<br />
bifurcar y enlazar registro jalr $1 $31=PC+4; ir a $1<br />
Pseudoinstrucciones<br />
salta sobre mayor o igual bge $1,$2,100 si($1>=$2) ir a PC+4 +100<br />
salta sobre mayor que bgt $1,$2,100 si($1>$2) ir a PC+4 +100<br />
salta sobre menor o igual ble $1,$2,100 si($1