3. Instrucciones: lenguaje de la máquina

Transcripción

3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
3. Instrucciones: lenguaje de la máquina
Fundamentos de Computadores
Ingenierı́a de Telecomunicación
Raúl Durán Dı́az
Departamento de Automática
Escuela Politécnica Superior
Curso académico 2009–2010
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
1 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Contenidos
1
Iniciación a la arquitectura de la máquina MIPS
2
Repertorio de instrucciones y modos de direccionamiento
3
Subrutinas
4
Programando y ejecutando
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
2 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Introducción
Para manejar la máquina, hablamos su lenguaje.
Las “palabras” son instrucciones.
El vocabulario es el ((repertorio de instrucciones)).
Las instrucciones deben ser
lo más sencillas que sea posible, pero. . .
deben permitir cualquier operación, es decir, el repertorio debe
ser completo.
En la práctica, los repertorios de instrucciones de todas las
máquinas se parecen.
Revisión: 1.8
Raúl Durán Dı́az
3 / 50
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Concepto de programa almacenado
La idea clave de von Neumann es representar las instrucciones
mediante códigos numéricos, susceptibles de ser almacenados
en memoria como cualquier otro tipo de dato.
Nosotros no manejamos directamente los códigos numéricos,
sino un mnemónico asociado a cada instrucción.
Al conjunto de todos los mnemónicos lo llamamos lenguaje
máquina.
Existe un formato de instrucción, que nos permitirá traducir
los códigos numéricos a lenguaje máquina y viceversa.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
4 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Arquitectura MIPS
Tipo RISC (reduced intruction set computer):
esto significa mı́nimo número de instrucciones, todas muy
simples.
Dotado con 32 registros de propósito general y el contador de
programa, todos ellos de 32 bits.
Observación
Limitar el número de registros es bueno para poder conseguir una
elevada velocidad de operación en el hardware.
Revisión: 1.8
Raúl Durán Dı́az
5 / 50
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Arquitectura MIPS
Esta arquitectura es del tipo carga-almacenamiento:
⇒ Sólo permite operaciones con valores en los registros.
⇒ Interactúa con la memoria por medio de únicamente un par de
instrucciones de carga (lectura de memoria a registro) y
almacenamiento (escritura de registro a memoria).
La memoria es como un gran vector, direccionable byte a byte.
Lo normal es acceder en direcciones múltiplos del tamaño
accedido.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
6 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Excursus: acceso a memoria big endian
El byte 0 está en la posición más alta.
Usado en IBM 370, Sun SPARC, HP-PARISC, etc.
31
24
23
8
4
0
16
15
8
9
5
1
7
0
10
6
2
11
7
3
Direcciones
altas
⇑
Direcciones
bajas
Revisión: 1.8
Raúl Durán Dı́az
7 / 50
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Excursus: acceso a memoria little endian
El byte 0 está en la posición más baja.
Usado en x86, Digital VAX, Digital Alpha, Digital Unix, etc.
31
24
11
7
3
23
16
10
6
2
15
8
9
5
1
7
0
8
4
0
Direcciones
altas
⇑
Direcciones
bajas
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
8 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Arquitectura MIPS: registros
Los registros se nombran $0, $1,. . . ,$31.
Son casi de propósito general, excepto:
el registro 1, llamado $at, reservado al ensamblador;
los registros 26–27, llamados $k0 y $k1, reservados al kernel;
los registros 28–31, reservados a ciertos punteros.
El resto tiene un uso convenido, pero arbitrario.
Al final, todos tienen un sinónimo. Veamos el siguiente cuadro.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
9 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Nombres de los registros en MIPS
Nombre
$zero
$v0–$v1
$a0–$a3
$t0–$t7
$s0–$s7
$t8–$t9
$gp
$sp
$fp
$ra
Número
0
2–3
4–7
8–15
16–23
24–25
28
29
30
31
Uso
constante 0
resultados, evaluación de expresiones
argumentos
temporales
preservados en llamadas
temporales
puntero global
puntero de pila
puntero de cuadro
dirección de retorno
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
10 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Instrucciones para operaciones aritméticas
¿Cómo ensamblamos un código como éste?
Ejemplo en C
int i, j, f, g, h;
f = (g + h) - (i + j);
Podemos asignar las variables a registros y usar la
instrucciones de suma y resta enteras:
Lo mismo, ensamblado
add $t0, $s3, $s4
add $t1, $s0, $s1
sub $s2, $t0, $t1
en donde las instrucciones de suma y resta significan:
Regs[x] = Regs[y ] ± Regs[z]
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
11 / 50
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Instrucciones de acceso a memoria
Ejemplo en C
int g, h, A[100];
g = h + A[8];
Lo mismo, ensamblado
lw $t0, 32($s2)
add $s0, $t0, $s1
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
12 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Instrucciones de acceso a memoria
Ejemplo en C
int h, A[100];
A[4] = h + A[8];
A[4] += 5;
Lo mismo, ensamblado
lw
$t0, 32($s1)
add $t0, $t0, $s0
sw
$t0, 16($s1) ; se puede eliminar
addi $t0, $t0, 5
sw
$t0, 16($s1)
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
13 / 50
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Instrucciones de acceso a memoria
Ejemplo en C
int i, g, h, A[100];
g = h + A[i];
Lo mismo, ensamblado
add $t0, $s0, $s0
add $t0, $t0, $t0
add $t0, $t0, $s3
lw $t1, 0($t0)
add $s1, $s2, $t1
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
14 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Observaciones respecto a lo visto
En un programa hay más variables que registros. . .
⇒ pónganse en registros las variables más usadas.
El direccionamiento tipo base + desplazamiento es útil para
direccionar vectores y campos de estructuras.
Los operandos de todas las instrucciones están siempre en
registros.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
15 / 50
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Instrucciones de desplazamiento lógico y aritmético
Operación
Shift left
Shift right
AND bit a bit
OR bit a bit
en C
<<
>>
&
|
en ensamblador
sll $s1,$s2,d
srl $s1,$s2,d
and $s1,$s2,$s3
or $s1,$s2,$s3
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
16 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Resumen de instrucciones básicas
Instrucción
add $r3, $r2, $r1
sub $r3, $r2, $r1
addi $r2, $r1, n
lw $r2, n($r1)
sw $r1, n($r2)
sll $r1, $r2, d
srl $r1, $r2, d
and $r1, $r2, $r3
or $r1, $r2, $r3
Función
$r3 ← $r1 + $r2
$r3 ← $r1 - $r2
$r2 ← $r1 + n
$r2 ← M[$r1 + n]
M[$r2 + n] ← $r1
$r1 ← $r2 << d
$r1 ← $r2 >> d
$r1 ← $r2 & $r3
$r1 ← $r2 | $r3
Atención: El número n puede ser positivo o negativo.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
17 / 50
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Tomando decisiones
La gran potencia de la programación es la toma dinámica de
decisiones: para ello introducimos los saltos condicionales.
La idea es que la ejecución del código “salte” a una zona u
otra en función del resultado de la comparación de dos
registros.
Las instrucciones básicas son
beq $r1, $r2, Etiq1 ; Ir a Etiq1 si $r1 = $r2
bne $r1, $r2, Etiq2 ; Ir a Etiq2 si $r1 =
6 $r2
También existe el salto incondicional
j Etiqueta ; salta a Etiqueta incondicionalmente.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
18 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Ensamblamos una sentencia if-then-else
Ejemplo en C
int i, j, f, g, h;
if (i == j) f = g + h; else f = g - h;
Lo mismo, ensamblado
bne $s0, $s1, Else
add $s2, $s3, $s4
j Fin
Else:
sub $s2, $s3, $s4
Fin:
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
19 / 50
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Ensamblamos un bucle
Ejemplo en C
int i, j, k, A[100];
while (A[i] == k) i = i + j;
Lo mismo, ensamblado
Bucle: add $t0, $s0, $s0
add $t0, $t0, $t0
add $t0, $t0, $s3
lw $t1, 0($t0)
bne $t1, $s2, Fin
add $s0, $s0, $s1
j
Bucle
Fin:
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
20 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Más instrucciones de control de flujo
Para comparar un “menor que” tenemos:
slt $r3, $r1, $r2
$r3 recibe un 1 si $r1 < $r2 y un 0 en caso contrario.
Tenemos también
slti $r2, $r1, n
$r2 recibe un 1 si $r1 < n y un 0 en caso contrario.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
21 / 50
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Y otra instrucción de salto
Tenemos una instrucción que nos permite saltar a una
dirección variable, que esté contenida en un registro:
jr $r1
La instrucción siguiente a ésta será la que resida en la
dirección que está contenida en el registro $r1.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
22 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Resumen de instrucciones de control de flujo
Instrucción
beq $r1, $r2, etiq
bne $r1, $r2, etiq
slt $r1, $r2, $r3
slti $r1, $r2, n
j etiq
jr $r1
jal etiq
Función
($r1 == $r2)? $PC ← $PC+etiq : ∅
($r1 != $r2)? $PC ← $PC+etiq : ∅
($r2 < $r3)? $r1 ← 1 : $r1 ← 0
($r2 < n)? $r1 ← 1 : $r1 ← 0
$PC ← etiq
$PC ← $r1
$ra ← $PC+4; $PC ← etiq
Atención: Como antes, el número n puede ser positivo o negativo.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
23 / 50
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Representación de las instrucciones
Las instrucciones se representan binariamente, usando bytes.
En MIPS, todas las instrucciones tienen 4 bytes.
Los 32 bits se reparten en campos, algunos de los cuales son
fijos.
De esta forma, la interpretación de la instrucción es más
sencilla y uniforme.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
24 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Representación de las instrucciones
Para las instrucciones tipo R (varios registros involucrados):
op code
6 bits
RS
5 bits
RT
5 bits
RD
5 bits
SHAMT
5 bits
FUNC
6 bits
Significado de los campos
op code: código de operación básica
RS:
registro fuente 1
RT:
registro fuente 2
RD:
registro destino
SHAMT: shift amount
FUNC:
código de función concreta
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
25 / 50
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Representación de las instrucciones
Para las instrucciones tipo I (valores inmediatos involucrados):
op code
6 bits
RS
5 bits
RT
5 bits
dirección
16 bits
Significado de los campos
op code: código de operación básica
RS:
registro fuente
RT:
registro destino
dirección: número de 16 bits (±32767)
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
26 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Representación de las instrucciones
Para las instrucciones tipo J (transferencia de control):
op code
6 bits
dirección de salto
26 bits
Significado de los campos
op code:
código de operación básica
dirección de salto: dirección de la siguiente instrucción a ejecutar
Revisión: 1.8
Raúl Durán Dı́az
27 / 50
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Representación de las instrucciones básicas
add
sub
addi
lw
sw
j
Tipo
R
R
I
I
I
J
Opcode
0
0
8
35
43
2
RS
reg
reg
reg
reg
reg
n/a
RT
reg
reg
reg
reg
reg
n/a
RD
reg
reg
n/a
n/a
n/a
n/a
SHAMT
0
0
n/a
n/a
n/a
n/a
FUNC
32
34
n/a
n/a
n/a
n/a
dir
n/a
n/a
inm
dir
dir
n/a
Traducir el lenguaje ensamblador a código máquina es el papel del
as (o programa ensamblador).
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
28 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Representación de las instrucciones de control
beq
bne
slt
jr
jal
Tipo
I
I
R
R
J
Opcode
4
5
0
0
3
RS
reg
reg
reg
reg
n/a
RT
reg
reg
reg
0
n/a
RD
n/a
n/a
reg
0
n/a
SHAMT
n/a
n/a
0
0
n/a
FUNC
n/a
n/a
42
8
n/a
dir
dir
dir
n/a
n/a
n/a
Revisión: 1.8
Raúl Durán Dı́az
29 / 50
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Representación de las instrucciones lógicas
sll
srl
sra
and
or
Tipo
R
R
R
R
R
Opcode
0
0
0
0
0
RS
0
0
0
reg
reg
RT
reg
reg
reg
reg
reg
RD
reg
reg
reg
reg
reg
SHAMT
d
d
d
0
0
FUNC
0
2
3
36
37
dir
n/a
n/a
n/a
n/a
n/a
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
30 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Instrucciones básicas
Instrucciones de control de flujo
Representación de las instrucciones
Resumen de modos de direccionamiento
1
Registro: los operandos están en registros.
2
Inmediato: El operando es una constante contenida en la
propia instrucción.
3
Indexado, (base más desplazamiento): Un operando está en
memoria. La dirección es la suma del contenido de un registro
y de un valor inmediato.
4
Relativo a $PC: La dirección del operando es la suma del
registro $PC más una constante contenida en la instrucción.
5
Directo: La dirección de salto está (casi) contenida en la
instrucción.
Revisión: 1.8
Raúl Durán Dı́az
31 / 50
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Subrutinas o procedimientos
Las subrutinas o procedimientos estructuran el código: se les
pasan valores (argumentos) y devuelven resultados.
Permiten el reuso del software.
Aı́slan unas piezas del código de otras, facilitando el
mantenimiento.
Es un sirviente al que se le dan unos datos (los “argumentos”)
y nos devuelve un resultado (“valor de retorno”).
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
32 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Subrutinas o procedimientos
Para ejecutar correctamente una subrutina, los pasos son:
Actor
Principal:
Principal:
Subrutina:
Subrutina:
Subrutina:
Subrutina:
Acción
coloca argumentos en un lugar accesible a la subrutina.
transfiere el control.
reserva espacio para su ejecución.
ejecuta su función.
coloca el resultado en un lugar accesible al principal.
devuelve el control al punto de partida.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
33 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Más registros. . .
Para el intercambio de datos se utilizan ciertos registros
convenidos:
Nombre Uso
$a0–$a3 para pasar argumentos
$v0–$v1 para devolver los resultados
$ra
para la dirección de retorno
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
34 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
. . . y una nueva instrucción
Una instrucción especialmente pensada nos permite “saltar”
al comienzo de la subrutina al tiempo que se guarda la
dirección de retorno en el registro $ra.
jal Procedimiento
El nombre jal significa jump-and-link. El sentido es que
conservamos en $ra la dirección a la que se debe retornar.
La dirección de la instrucción que se ha de ejecutar se guarda
en el registro de instrucción, o $PC. Por tanto la dirección que
se ha de guardar en $ra es $PC+4.
Revisión: 1.8
Raúl Durán Dı́az
35 / 50
3. Instrucciones: lenguaje de la máquina
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Resumen de llamada a la subrutina
Los pasos para la llamada serán:
1
2
3
El principal coloca en $a0–$a3 los argumentos necesarios para
la ejecución de la subrutina.
Ésta realiza los cálculos y devuelve el/los resultado(s) en
$v0–$v1.
Devuelve el control con un simple jr $ra.
¿Y si no bastan con los registros de que se dispone? Ahora lo
vemos.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
36 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Un nuevo registro y la pila
Es muy probable que una subrutina necesite más registros que
los $a0–$a3 y $v0–$v1.
Antes de poder usar otros registros, éstos se deben archivar.
Para ello, se dedica un trozo de memoria, suficientemente
grande, como repositorio temporal.
Este repositorio se llama pila (en inglés, stack).
Se usa un registro, $sp, para saber en donde comienza el
espacio libre. Cada vez que se almacena o se extrae algo, se
ajusta.
Por razones históricas, crece hacia las direcciones bajas de
memoria.
Las operaciones de almacenamiento y extracción se llaman
push y pop, respectivamente.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
37 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Ensamblando una subrutina
Subrutina en C
int sub1(int g, int h, int i, int j)
{
int f;
f = (g + h) - (i + j);
return f;
}
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
38 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Ensamblando una subrutina
Subrutina
sub1:
subi
sw
sw
sw
add
add
sub
en ensamblador
$sp,
$t0,
$t1,
$s0,
$sp, 12
8($sp)
4($sp)
0($sp)
$t0, $a0, $a1
$t1, $a2, $a3
$s0, $t0, $t1
...
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
39 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Ensamblando una subrutina
Subrutina en ensamblador
...
add
$v0, $s0, $zero
lw
lw
lw
addi
$s0,
$t1,
$t0,
$sp,
jr
$ra
0($sp)
4($sp)
8($sp)
$sp, 12
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
40 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Convenios sobre el uso de registros
Convenimos en que los registros $t0–$t9 son temporales y no
hace falta guardarlos antes de usarlos.
En cambio, los registros $s0–$s7 sı́ deben ser “salvados”
antes de ser usados.
En la subrutina anterior nos ahorramos dos pushes.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
41 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
¿Y si la subrutina llama a otra?
Si una subrutina llama a otra, probablemente necesita usar
también los registros $a0–$a3, y guardar en $ra la dirección
de retorno. Hay un conflicto en el uso de los registros.
La solución es guardarlos en la pila antes de modificarlos,
restaurando su valor al final.
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
42 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Subrutina recursiva
Subrutina en C
int fact(int n)
{
if (n == 1) return 1;
else
return n*fact(n - 1);
}
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
43 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Subrutina recursiva
Subrutina ensamblada (I)
fact:
subi $sp, $sp, 8
sw
$ra, 4($sp)
sw
$a0, 0($sp)
subi $t0, $a0, 1
bne
$t0, $zero, F1
addi
addi
jr
$v0, $zero, 1
$sp, $sp, 8
$ra
...
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
44 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Subrutina recursiva
Subrutina ensamblada (II)
...
F1: subi
jal
$a0, $a0, 1
fact
lw
lw
addi
$a0, 0($sp)
$ra, 4($sp)
$sp, $sp, 8
mul
jr
$v0, $v0, $a0
$ra
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
45 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Estado de los registros en llamadas a subrutinas
Por convenio, el comportamiento es ası́:
Preservados
$s0–$s7
$sp
$ra
Memoria encima de $sp
No preservados
$t0–$t9
$a0–$a3
$v0–$v1
Memoria debajo de $sp
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
46 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Ciclo de programación
Programa C
Código ensamblado
Compilador
Código máquina
Ejecutable
Linker
Ensamblador
Programa cargado
Cargador
Figura: Procesos y resultados del ciclo de programación
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
47 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Estructura del programa cargado
$sp
$gp
7fff fffc
1000 8000
Pila
Datos dinámicos
Datos estáticos
1000 0000
Código (texto)
pc
0040 0000
Reservado
0
Figura: Zonas de memoria, una vez cargado el programa
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
48 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Estructura de un fichero objeto
Cabecera fichero objeto
Segmento de código
Segmento de datos
Información de realojo
Tabla de símbolos
Información de depuración
Figura: Partes de un fichero objeto, con extensión .o
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
49 / 50
Iniciación a la arquitectura de la máquina MIPS
Repertorio de instrucciones y modos de direccionamiento
Subrutinas
Programando y ejecutando
Lenguajes de programación de alto nivel
COBOL, PL/I
FORTRAN
PASCAL, C
ADA
Java, C++, SmallTalk
...
Revisión: 1.8
Raúl Durán Dı́az
3. Instrucciones: lenguaje de la máquina
50 / 50

Documentos relacionados