07.05.2013 Views

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

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!