Documente Academic
Documente Profesional
Documente Cultură
Departamento de Informtica
Grupo de Arquitectura de Computadores, Comunicaciones y Sistemas
UNIVERSIDAD CARLOS III DE MADRID
Contenido
Fundamentos bsicos de la programacin en ensamblador
Ensamblador del MIPS 32, modelo de memoria y
representacin de datos
Formato de las instrucciones y modos de direccionamiento
Llamadas a procedimientos y uso de la pila
ARCOS-UC3M
Estructura de Computadores
ARCOS-UC3M
Estructura de Computadores
4
ARCOS-UC3M
Estructura de Computadores
Qu es un computador?
resultados
datos
Procesador
Instrucciones
ARCOS-UC3M
Estructura de Computadores
Instruccin mquina
001 AB 00000000101
Cdigo de operacin
Operandos
ARCOS-UC3M
Registros
Direcciones de memoria
Nmeros
Estructura de Computadores
PC
000100
RI
MAR
Decodificacin de la instruccin
Direccin
000100
MBR
Contenido
0010000000000000
Ejecucin de la instruccin
Volver a fetch
Memoria
ARCOS-UC3M
Estructura de Computadores
Estructura de Computadores
Programa
Secuencia ordenada de instrucciones mquina que se ejecutan
en secuencia
00001001110001101010111101011000
10101111010110000000100111000110
11000110101011110101100000001001
01011000000010011100011010101111
ARCOS-UC3M
Estructura de Computadores
temp = v[k];
v[k] = v[k+1];
v[k+1] = temp;
temp = v[k];
v[k] = v[k+1];
v[k+1] = temp;
compilador
Lenguaje ensamblador
(Ej: MIPS)
lw
lw
sw
sw
$t0, 0($2)
$t1, 4($2)
$t1, 0($2)
$t0, 4($2)
Ensamblador
Lenguaje Mquina
(MIPS)
ARCOS-UC3M
0000
1010
1100
0101
1001
1111
0110
1000
1100
0101
1010
0000
Estructura de Computadores
0110
1000
1111
1001
1010
0000
0101
1100
1111
1001
1000
0110
0101
1100
0000
1010
1000
0110
1001
1111
10
Lenguaje ensamblador
Emplea cdigos nemnicos para representar instrucciones
add suma
lw carga un dato de memoria
Emplea nombres simblicos para designar a datos y
referencias
$t0 identificador de un registro
Cada instruccin en ensamblador se corresponde con una
instruccin mquina
add $t1, $t2, $t3
ARCOS-UC3M
Estructura de Computadores
11
Modelo de programacin de un
computador
Un computador ofrece un modelo de programacin que est
formando:
Juego de instrucciones (lenguaje ensamblador)
Una instruccin incluye:
Cdigo de operacin
Otros elementos: identificadores de registros, direcciones de
memoria o nmeros
Elementos de almacenamiento
Registros
Memoria
Registros de los controladores de E/S
Modos de ejecucin
ARCOS-UC3M
Estructura de Computadores
12
Arquitectura MIPS
MIPS R2000/R3000
Procesador de 32 bits
Tipo RISC
CPU +
coprocesadores auxiliares
Coprocesador 0
excepciones, interrupciones
y sistema de memoria
virtual
Coprocesador 1
FPU (Unidad de Punto
Flotante)
ARCOS-UC3M
Estructura de Computadores
13
Banco de registros
Nombre
Simblico
del
registro
Nmero
Uso
zero
Constante 0
at
v0, v1
2, 3
a0, , a3
4, , 7
t0, , t7
8, , 15
s0, , s7
16, , 23
t8, t9
24, 25
k0, k1
26, 27
gp
28
sp
29
Puntero a pila
fp
30
ra
31
ARCOS-UC3M
Estructura de Computadores
Hay 32 registros
Tamao de
1 palabra (4 bytes)
Se nombran con
un $ al principio
Convenio de uso
Reservados
Argumentos
Resultados
Temporales
Punteros
14
Tipos de instrucciones
De transferencia
Aritmtica
Lgicas
De desplazamiento
De rotacin
De comparacin
De bifurcacin
ARCOS-UC3M
Estructura de Computadores
15
Transferencia de datos
Copia de un dato en un registro. Carga inmediata
li $t0 5
$t0
5
Registro a registro
move $a0 $t0
$a0
$t0
ARCOS-UC3M
Estructura de Computadores
16
Aritmticas
Realiza operaciones aritmticas de entero (ALU) o aritmtica de
coma flotante (FPU)
Ejemplos de operaciones con enteros
Sumar
add $t0, $t1, $t2 $t0
addi $t0, $t1, 5
$t0
addu $t0, $t1, $t2 $t0
Restar
sub $t0 $t1 1
Multiplicar
mul $t0 $t1 $t2
Dividir
div $t0, $t1, $t2
$t0
rem $t0, $t1, $t2
$t0
ARCOS-UC3M
$t1 + $t2
$t1 + 5
$t1 + $t2
Estructura de Computadores
17
Ejemplo
int
int
int
int
a = 5;
b = 7;
c = 8;
d;
d = a * (b + c)
ARCOS-UC3M
li $t0, 5
li $t1, 7
li $t2, 8
Estructura de Computadores
18
Ejemplo
int
int
int
int
a = 5;
b = 7;
c = 8;
d;
li
li
li
li
$t0, 5
$t1, 7
$t2, 8
$t3 10
d=-(a*(b-10)+c)
sub
mul
add
li
mul
ARCOS-UC3M
Estructura de Computadores
$t4,
$t4,
$t4,
$t5,
$t4,
$t1,
$t4,
$t4,
-1
$t4,
$t3
$t0
$t2
$t5
19
Lgicas
Operaciones booleanas
Ejemplos:
AND
and $t0 $t1 $t2
1100
OR
or $t0 $t1 $t2 ($t0 = $t1 | $t2)
ori $t0 $t1 80 ($t0 = $t1 | 80)
1010
1000
1100
OR
1010
1110
NOT
not $t0 $t1
XOR
or $t0 $t1 $t2
($t0 = ! $t1)
NOT
10
01
1100
XOR
1010
0110
ARCOS-UC3M
Estructura de Computadores
20
Ejemplo
li $t0, 5
li $t1, 8
ARCOS-UC3M
Estructura de Computadores
21
Solucin
li $t0, 5
li $t1, 8
and
ARCOS-UC3M
Estructura de Computadores
22
Desplazamientos
De movimiento de bits
Ejemplos:
Desplazamiento lgico a la derecha
srl $t0 $t0 4 ($t0 = $t0 >> 4 bits)
01110110101
01110110101
11110110101
ARCOS-UC3M
Estructura de Computadores
23
Ejemplo
li $t0, 5
li $t1, 6
ARCOS-UC3M
Estructura de Computadores
24
Ejemplo
li $t0, 5
li $t1, 6
$t0, $t1, 1
ARCOS-UC3M
Estructura de Computadores
25
Ejemplo
li $t0, 5
li $t1, 6
ARCOS-UC3M
Estructura de Computadores
26
Ejemplo
li $t0, 5
li $t1, 6
ARCOS-UC3M
Estructura de Computadores
27
Rotaciones
De movimiento de bits
Ejemplos:
Rotacin a la izquierda
rol $t0 $t0 4
rotan 4 bits
Rotacin a la derecha
ror $t0 $t0 5 rotan 5 bits
ARCOS-UC3M
Estructura de Computadores
01110110101
01110110101
28
Instrucciones de comparacin
seq $t0, $t1, $t2
sneq $t0, $t1, $t2
sge $t0, $t1, $t2
sgt $t0, $t1, $t2
sle $t0, $t1, $t2
slt $t0, $t1, $t2
ARCOS-UC3M
if ($t1 == $t2)
if ($t1 !=$t2)
if ($t1 >= $t2)
if ($t1 > $t2)
if ($t1 <= $t2)
if ($t1 < $t2)
Estructura de Computadores
$t0 = 1;
$t0 = 1;
$t0 = 1;
$t0 = 1;
$t0 = 1;
$t0 = 1;
else $t0 = 0
else $t0 = 0
else $t0 = 0
else $t0 = 0
else $t0 = 0
else $t0 = 0
29
Instrucciones de comparacin
seq $t0, $t1, $t2
sneq $t0, $t1, $t2
sge $t0, $t1, $t2
sgt $t0, $t1, $t2
sle $t0, $t1, $t2
slt $t0, $t1, $t2
ARCOS-UC3M
Set if equal
Set if no equal
Set if greater or equal
Set if greater than
Set if less or equal
Set if less than
Estructura de Computadores
30
Instrucciones de bifurcacin
Cambian la secuencia de ejecucin de las instrucciones
de un programa
Distintos tipos:
Bifurcacin o salto condicional:
beq $t0 $t1 0xE00012
Salta a la posicin 0xE00012, si valor $t0 == $t1
Llamadas a funciones:
jal 0x20001E jr $ra
ARCOS-UC3M
Estructura de Computadores
31
Instrucciones de bifurcacin
beqz
beq
bneq
bge
bgt
ble
blt
ARCOS-UC3M
$t0, direccion
$t0, $t1, direccion
$t0, $t1, direccion
$t0, $t1, direccion
$t0, $t1, direccion
$t0, $t1, direccion
$t0, $t1, direccion
Branch if $t0 == 0
Branch if equal (t0 == t1)
Branch if not equal (t0 t1)
Branch if greater or equal (t0 t1)
Branch if greater than (t0 > t1)
Branch if less or equal (t0 t1)
Branch if less than (t0 <t1)
Estructura de Computadores
32
Estructuras de control
while
int i;
i=0;
while (i < 10)
{
/* accin */
i = i + 1 ;
}
while:
li
$t0 0
li
$t1 10
fin:
...
ARCOS-UC3M
Estructura de Computadores
33
Ejemplo
Calcular la suma 1 + 2 + 3 + . + 10
i=0;
s=0;
while (i <= 10)
{
s = s + i;
i = i + 1;
}
}
Resultado en $t1
ARCOS-UC3M
Estructura de Computadores
34
Solucin
Calcular la suma 1 + 2 + 3 + . + 10
i=0;
s=0;
while (i <= 10)
{
s = s + i;
i = i + 1;
}
}
while:
fin:
li
li
li
bge
add
addi
b
...
$t0 0
$t1 0
$t2 10
$t0 t2 fin
$t1 $t1 $t0
$t0 $t0 1
while
Resultado en $t1
ARCOS-UC3M
Estructura de Computadores
35
Ejemplo
Calcular el nmero de 1s que hay en un registro ($t0).
Resultado en $t3
i = 0;
n = 45; #numero
s=0;
while (i < 32)
{
b = ultimo bit de n
s = s + b;
se desplaza n un bit
a la derecha
i = i + 1 ;
}
}
ARCOS-UC3M
Estructura de Computadores
36
Solucin
Calcular el nmero de 1s que hay en un registro ($t0).
Resultado en $t3
i = 0;
n = 45; #numero
s=0;
while (i < 32)
{
b = ultimo bit de n
s = s + b;
se desplaza n un bit
a la derecha
i = i + 1 ;
}
}
ARCOS-UC3M
while:
fin:
Estructura de Computadores
li
li
li
li
bge
and
add
srl
addi
b
...
$t0 0
#i
$t1 45
#n
$t2 32
$t3 0
#s
$t0 t2 fin
$t4 $t1 1
$t3 $t3 $t4
$t1 $t1 1
$t0 $t0 1
while
37
Ejemplo
Obtener los 16 bits superiores de un registro ($t0) y dejarlos en
los 16 bits inferiores de otro ($t1)
ARCOS-UC3M
Estructura de Computadores
38
Solucin
Obtener los 16 bits superiores de un registro ($t0) y dejarlos en
los 16 bits inferiores de otro ($t1)
srl
ARCOS-UC3M
$t1,
01110110101
$t0,
16
Se desplaza a la derecha 16
Posiciones (de forma lgica)
Estructura de Computadores
39
Estructuras de control
if
int b1 = 4;
int b2 = 2;
li
li
li
if (b2 == 8) {
b1 = 0;
}
...
fin:
ARCOS-UC3M
Estructura de Computadores
$t0 4
$t1 2
$t2 8
fin
40
Estructuras de control
if-else
int a=1;
int b=2;
li
$t1 1
li
$t2 2
if (a < b)
{
// accin 1
}
else
{
// accin 2
}
# cond.
else: ...
# accin 2
b
fin
# incond.
then: ...
# accin 1
fin: ...
ARCOS-UC3M
Estructura de Computadores
41
Ejemplo
Determinar si el contenido de un registro ($t2) es par. Si es par
se almacena en $t1 un 1, sino se almacena un 0
ARCOS-UC3M
Estructura de Computadores
42
Solucin
Determinar si el contenido de un registro ($t2) es par. Si es par
se almacena en $t1 un 1, sino se almacena un 0
li
$t2
li
$t1
rem $t1
$t2
beq $t1
$0
$t1
then
# se obtiene el resto
# cond.
else: li $t1 0
b fin
# incond.
then: li $t1 1
fin: ...
ARCOS-UC3M
Estructura de Computadores
43
Ejemplo
Determinar si el contenido de un registro ($t2) es par. Si es par
se almacena en $t1 un 1, sino se almacena un 0. En este caso
consultando el ltimo bit
ARCOS-UC3M
Estructura de Computadores
44
Solucin
Determinar si el contenido de un registro ($t2) es par. Si es par
se almacena en $t1 un 1, sino se almacena un 0. En este caso
consultando el ltimo bit
li
$t2 9
li
$t1 1
and $t1
$t2
beq $t1 $0
$t1
then
else: li $t1 0
b fin
# incond.
then: li $t1 1
fin: ...
ARCOS-UC3M
Estructura de Computadores
45
Ejemplo
Calcular an
a en $t0
n en $t1
El resultado en $t2
a=8
n=4;
i=0;
p = 1;
while (i < n)
{
p = p * a
i = i + 1 ;
}
}
ARCOS-UC3M
Estructura de Computadores
46
Solucin
Calcular an
a en $t0
n en $t1
El resultado en $t2
a=8
n=4;
i=0;
p = 1;
while (i < n)
{
p = p * a
i = i + 1 ;
}
}
while:
fin:
ARCOS-UC3M
Estructura de Computadores
li
li
li
li
$t0
$t1
$t2
$t4
8
4
1
0
bge
mul
addi
b
move
47
Contenido
Fundamentos bsicos de la programacin en ensamblador
Ensamblador del MIPS 32, modelo de memoria y
representacin de datos
Formato de las instrucciones y modos de direccionamiento
Llamadas a procedimientos y uso de la pila
ARCOS-UC3M
Estructura de Computadores
48
Simulador SPIM
http://pages.cs.wisc.edu/~larus/spim.html
ARCOS-UC3M
Estructura de Computadores
49
ARCOS-UC3M
Estructura de Computadores
50
Tarea
Instalar en el simulador SPIM que se va a utilizar en las
prcticas.
http://pages.cs.wisc.edu/~larus/spim.html
http://sourceforge.net/projects/spimsimulator/files/
ARCOS-UC3M
Estructura de Computadores
51
ARCOS-UC3M
Estructura de Computadores
52
Arquitectura MIPS
MIPS R2000/R3000
Procesador de 32 bits
Tipo RISC
CPU +
coprocesadores auxiliares
Coprocesador 0
excepciones, interrupciones
y sistema de memoria
virtual
Coprocesador 1
FPU (Unidad de Punto
Flotante)
ARCOS-UC3M
Estructura de Computadores
53
Banco de registros
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ARCOS-UC3M
Hay 32 registros
4 bytes de tamao
(una palabra)
Se nombran con
un $ al principio
Convenio de uso
Reservados
Argumentos
Resultados
Temporales
Punteros
Estructura de Computadores
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
54
Banco de registros
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ARCOS-UC3M
$zero
Estructura de Computadores
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
55
Banco de registros
0
1
2
3
4
5
6
7
$zero
8
9
$t0
$t1
$t2
$t3
$t4
$t5
$t6
$t7
Valores temporales
10
11
12
13
14
15
ARCOS-UC3M
$t8
$t9
Estructura de Computadores
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
56
Banco de registros
0
1
2
3
4
5
6
7
$zero
8
9
$t0
$t1
$t2
$t3
$t4
$t5
$t6
$t7
Valores guardados
10
11
12
13
14
15
ARCOS-UC3M
Estructura de Computadores
$s0
$s1
$s2
$s3
$s4
$s5
$s6
$s7
$t8
$t9
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
57
Banco de registros
0
1
2
3
4
5
6
7
$zero
8
9
10
11
12
13
14
15
ARCOS-UC3M
$v0
$v1
$a0
$a1
$a2
$a3
$t0
$t1
$t2
$t3
$t4
$t5
$t6
$t7
$s0
$s1
$s2
$s3
$s4
$s5
$s6
$s7
$t8
$t9
Paso de parmetros y
Gestin de subrutinas
Estructura de Computadores
$sp
$fp
$ra
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
58
Banco de registros
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ARCOS-UC3M
$zero
$at
$v0
$v1
$a0
$a1
$a2
$a3
$t0
$t1
$t2
$t3
$t4
$t5
$t6
$t7
Otros
Estructura de Computadores
$s0
$s1
$s2
$s3
$s4
$s5
$s6
$s7
$t8
$t9
$k0
$k1
$gp
$sp
$fp
$ra
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
59
Distribucin de la memoria
Hay 4 GB de memoria
direccionables en total
Parte de esa memoria la
utilizan los distintos
segmentos de un
proceso
Otra parte de la
memoria est reservada:
Un mini-sistema
operativo reside en
los primeros 4 MB
de memoria
ARCOS-UC3M
Estructura de Computadores
60
Distribucin de la memoria de un
programa
ARCOS-UC3M
Estructura de Computadores
61
01011001
Segmento de Pila
$sp
01011001
Segmento de pila
Variables locales
Contexto de funciones
Segmento de datos
Datos estticos
$gp
01011001
Segmento de Datos
Segmento de Texto
ARCOS-UC3M
pc
01011001
Estructura de Computadores
62
Estructura de un programa
ARCOS-UC3M
Estructura de Computadores
63
Simulador SPIM
Banco de
registros
$0, $1, $2,
$f0, $f1,
Segmento
de cdigo
Segmento
de datos
Segmento
de pila
Otros
ARCOS-UC3M
Estructura de Computadores
64
Simulador SPIM
Banco de
registros
$0, $1, $2,
$f0, $f1,
Segmento
de cdigo
Segmento
de datos
Segmento
de pila
ARCOS-UC3M
Estructura de Computadores
65
ARCOS-UC3M
Estructura de Computadores
66
operandos
.directiva
hola.s
.data
msg_hola: .asciiz "hola mundo\n"
.text
.globl main
main:
# printf("hola mundo\n") ;
li $v0 4
la $a0 msg_hola
syscall
ARCOS-UC3M
Estructura de Computadores
67
.globl main
main:
# printf("hola mundo\n") ;
li $v0 4
#cdigo de llamada
la $a0 msg_hola
syscall
ARCOS-UC3M
Estructura de Computadores
68
Uso
.data
.text
.ascii
tira de caracteres
.asciiz
tira de caracteres
.byte
1, 2, 3
.half
.word
800000, 800001
.float
1.23, 2.13
.double 3.0e21
.space
10
.extern etiqueta n
.globl
etiqueta
.align
ARCOS-UC3M
Estructura de Computadores
69
ARCOS-UC3M
Estructura de Computadores
70
Llamadas al sistema
El simulador incluye un pequeo sistema operativo.
Ofrece 17 servicios.
Invocacin:
Cdigo de servicio en $v0.
Otros parmetros en registros concretos.
Invocacin mediante instruccin syscall.
ARCOS-UC3M
Estructura de Computadores
71
Llamadas al sistema
Servicio
Cdigo de
llamada ($v0)
Argumentos
Resultado
print_int
$a0 = integer
print_float
$f12 = float
print_double
$f12 = double
print_string
$a0 = string
read_int
integer en $v0
read_float
float en $f0
read_double
double en $f0
read_string
$a0=buffer,
$a1=longitud
sbrk
$a0=cantidad
exit
10
ARCOS-UC3M
Estructura de Computadores
direccin en $v0
72
Llamadas al sistema
Servicio
Cdigo de
llamada ($v0)
Argumentos
Resultado
print_char
11
read_char
12
open
13
read
14
write
15
close
16
exit2
17
ARCOS-UC3M
Estructura de Computadores
73
Ejemplo
ARCOS-UC3M
Estructura de Computadores
74
Ejemplo
ARCOS-UC3M
Estructura de Computadores
75
Modelo de memoria.
Direccionamiento por bytes
Los computadores actuales direccionan la memoria por bytes.
Un computador con direcciones de n bits puede direccionar 2n
bytes
Un computador con direcciones de 32 bits (MIPS 32)
puede direccionar 232 bytes de memoria= 4 GB
Las direcciones que genera un computador se refieren a bytes
El MIPS incluye instrucciones para acceder a:
bytes
palabras (4 bytes consecutivos)
ARCOS-UC3M
Estructura de Computadores
76
Espacio de direcciones.
Direccionamiento por bytes
Direcciones Byte
(contenido)
de bytes
0
1
2
3
4
5
6
Direccin: 6 (000110)
Contenido: 00001101 (9)
00001101
2n-1
ARCOS-UC3M
Estructura de Computadores
77
Espacio de direcciones.
Direccionamiento por bytes
Direcciones Byte
de bytes
(contenido)
0x0F000000
0x0F000001
0x0F000002
0x0F000003
ARCOS-UC3M
Direccin: 0x0F000002
Contenido: 00001101 (9)
00001101
Estructura de Computadores
78
Espacio de direcciones
Direcciones Byte
(contenido)
de bytes
0
1
2
3
4
5
6
00001101
2n-1
ARCOS-UC3M
Estructura de Computadores
79
7
8
4
3
Fsicamente
Direcciones
de palabras
0
1
2
3
4
Palabra de 32 bits
(contenido)
7
byte 0
byte 1
byte 2
byte 3
2n-4
Estructura de Computadores
80
Acceso a memoria
Para un computador de 32 bits con direccionamiento por bytes:
La palabra tiene 32 bits (cuatro bytes)
Se pueden direccionar 232 bytes
La memoria est formada por 230 palabras
Existen instrucciones que permite acceder a:
Bytes almacenados en una direccin: A31 A0
Palabras almacenadas a partir de una direccin: A31 A0
ARCOS-UC3M
Estructura de Computadores
81
$t1, 0x6
Direcciones Byte
(contenido)
de bytes
0
1
2
3
4
5
6
Direccin: 6 (000110)
Contenido: 00001101 (9)
00001101
$t1
31
24 23
16 15
87
2n-1
ARCOS-UC3M
Estructura de Computadores
82
$t1, 0x6
Direcciones Byte
(contenido)
de bytes
0
1
2
3
4
5
6
Direccin: 6 (000110)
Contenido: 00001101 (9)
00001101
$t1
00000000
00000000
00000000
31
24 23
16 15
87
00001101
0
2n-1
ARCOS-UC3M
Estructura de Computadores
83
$t1, 0x6
Direcciones Byte
(contenido)
de bytes
0
1
2
3
4
5
6
Direccin: 6 (000110)
Contenido: 11111101 (-3 en complemento a 2)
11111101
$t1
31
24 23
16 15
87
2n-1
ARCOS-UC3M
Estructura de Computadores
84
$t1, 0x6
Direcciones Byte
(contenido)
de bytes
0
1
2
3
4
5
6
Direccin: 6 (000110)
Contenido: 11111101 (-3 en complemento a 2)
11111101
$t1
31
11111111
11111111
11111111
24 23
16 15
87
11111101
0
2n-1
ARCOS-UC3M
Estructura de Computadores
85
$t1, 0x6
Direcciones Byte
(contenido)
de bytes
0
1
2
3
4
5
6
Direccin: 6 (000110)
Contenido: 11111101 (-3 en complemento a 2)
11111101
$t1
31
11111111
11111111
11111111
24 23
16 15
87
11111101
0
Mantiene el signo
2n-1
ARCOS-UC3M
Estructura de Computadores
86
Direccin: 6 (000110)
Contenido: 11111101 (-3 en complemento a 2)
11111101
$t1
31
24 23
16 15
87
2n-1
ARCOS-UC3M
Estructura de Computadores
87
Direccin: 6 (000110)
Contenido: 11111101 (-3 en complemento a 2)
11111101
$t1
00000000
00000000
31
24 23
16 15
0000000
87
11111101
0
2n-1
ARCOS-UC3M
Estructura de Computadores
88
Direccin: 6 (000110)
Contenido: 11111101 (-3 en complemento a 2)
11111101
$t1
00000000
00000000
31
24 23
16 15
0000000
87
11111101
0
2n-1
ARCOS-UC3M
Estructura de Computadores
89
Fsicamente
Byte
0
1
2
3
4
5
6
7
Palabra de 32 bits
7
8
4
3
5
3
2
7
0
1
2
3
4
7
5
8
3
byte 0
4
2
byte 1
3
7
byte 2
byte 3
$t1
31
ARCOS-UC3M
24 23
Estructura de Computadores
16 15
87
90
Fsicamente
Byte
0x5
0
1
2
3
4
5
6
7
Palabra de 32 bits
7
8
4
3
5
3
2
7
0
1
2
3
4
7
5
8
3
byte 0
4
2
byte 1
3
7
byte 2
byte 3
$t1
31
ARCOS-UC3M
24 23
Estructura de Computadores
16 15
87
91
Fsicamente
Byte
0x5
0
1
2
3
4
5
6
7
7
8
4
3
5
3
2
7
Palabra de 32 bits
0
1
2
3
4
0x1
7
5
8
3
byte 0
4
2
byte 1
3
7
byte 2
byte 3
$t1
31
ARCOS-UC3M
24 23
Estructura de Computadores
16 15
87
92
Fsicamente
Byte
0x5
0
1
2
3
4
5
6
7
7
8
4
3
5
3
2
7
Palabra de 32 bits
0
1
2
3
0x1
7
5
8
3
byte 0
4
2
byte 1
3
7
byte 2
byte 3
Se transfiere al
procesador
5
$t1
31
ARCOS-UC3M
24 23
Estructura de Computadores
16 15
87
93
Fsicamente
Byte
0
1
2
3
4
5
6
7
Palabra de 32 bits
7
8
4
3
5
3
2
7
0
4
8
12
16
7
5
8
3
byte 0
4
2
byte 1
3
7
byte 2
byte 3
00000.000101
2
5
$t1
0
31
ARCOS-UC3M
0
24 23
Estructura de Computadores
0
16 15
3
87
94
Almacenamiento de palabras en la
memoria
Direcciones Byte
(contenido)
de bytes
0
1
2
3
4
5
6
7
8
2n-1
ARCOS-UC3M
Estructura de Computadores
95
Almacenamiento de palabras en la
memoria
Direcciones Byte
(contenido)
de bytes
0
1
2
3
4
5
6
7
8
Palabra de 32 bits
byte0
byte1
31
24 23
+ significativo
byte2
16 15
byte3
87
0
- significativo
2n-1
ARCOS-UC3M
Estructura de Computadores
96
Almacenamiento de palabras en la
memoria
Palabra de 32 bits
byte0
byte1
31
24 23
+ significativo
A
A+1
A+2
A+3
byte2
16 15
byte3
87
byte0
byte1
byte2
byte3
0
- significativo
A
A+1
A+2
A+3
BigEndian
byte3
byte2
byte1
byte0
LittleEndian
00000000
00000000
00000000
00011011
A
A+1
A+2
A+3
BigEndian
ARCOS-UC3M
00011011
00000000
00000000
00000000
LittleEndian
Estructura de Computadores
97
A
A+1
A+2
A+3
00000000
00000000
00000000
00011011
A
A+1
A+2
A+3
BigEndian
ARCOS-UC3M
LittleEndian
Estructura de Computadores
98
A
A+1
A+2
A+3
00000000
00000000
00000000
00011011
BigEndian
ARCOS-UC3M
Transmisin de
datos por la red
Estructura de Computadores
A
A+1
A+2
A+3
LittleEndian
99
A
A+1
A+2
A+3
00000000
00000000
00000000
00011011
BigEndian
ARCOS-UC3M
Transmisin de
datos por la red
Estructura de Computadores
A
A+1
A+2
A+3
00000000
00000000
00000000
00011011
LittleEndian
100
A
A+1
A+2
A+3
00000000
00000000
00000000
00011011
A
A+1
A+2
A+3
BigEndian
00000000
00000000
00000000
00011011
LittleEndian
ARCOS-UC3M
Estructura de Computadores
101
lw $t1, 0x4
Byte
0
1
2
3
4
5
6
7
00000000
00000000
00000001
00001101
Direccin 4 (000110)
Contenido: 00000000000000000000000100001101(2 = 269(10
Computador BigEndian
$t1
31
ARCOS-UC3M
24 23
Estructura de Computadores
16 15
87
102
lw $t1, 0x4
Fsicamente
Byte
0
1
2
3
4
5
6
7
Palabra de 32 bits
0
1
2
3
4
00000000
00000000
00000001
00001101
00000000
byte 0
00000000
byte 1
00000001
byte 2
00001101
byte 3
$t1
31
ARCOS-UC3M
24 23
Estructura de Computadores
16 15
87
103
lw $t1, 0x4
Fsicamente
Byte
0x4
0
1
2
3
4
5
6
7
Palabra de 32 bits
0
1
2
3
00000000
00000000
00000001
00001101
00000000
00000000
byte 0
byte 1
00000001
byte 2
00001101
byte 3
$t1
31
ARCOS-UC3M
24 23
Estructura de Computadores
16 15
87
104
lw $t1, 0x4
Fsicamente
Byte
0x4
0
1
2
3
4
5
6
7
Palabra de 32 bits
0
1
2
3
00000000
00000000
00000001
00001101
00000000
00000000
byte 0
00000001
byte 1
byte 2
00001101
byte 3
Se transfiere al procesador
la palabra de memoria 1
00000000
00000000
00000001
00001101
$t1
31
ARCOS-UC3M
24 23
Estructura de Computadores
16 15
87
105
lw $t1, 0x4
Fsicamente
Byte
0
1
2
3
4
5
6
7
Palabra de 32 bits
0
1
2
3
00000000
00000000
00000001
00001101
00000000
byte 0
00000000
00000000
byte 1
00000000
00000001
byte 2
00000001
00001101
byte 3
00001101
Se copia la palabra
$t1
00000000
31
ARCOS-UC3M
Estructura de Computadores
00000000
00000001
24 23
16 15
00001101
87
106
0x0F000000
0x0F000001
0x0F000002
0x0F000003
ARCOS-UC3M
lw $t1, 0x0F000000
0xCB
0x12
0x08
0x02
Estructura de Computadores
107
0x0F000000
0x0F000001
0x0F000002
0x0F000003
lw $t1, 0x0F000000
0xCB
0x12
0x08
0x02
Se copia la palabra
(el contenido de la direccin)
0xCB
$t1
11001011
31
ARCOS-UC3M
0x12
0x08
0x02
00010010
00001000
00000010
24 23
16 15
87
Estructura de Computadores
108
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0xCB
0x12
0x08
0x02
0x08
$t1
00000000
31
ARCOS-UC3M
00000000
00000000
24 23
16 15
Estructura de Computadores
00001000
87
109
la $t1, 0x0F000000
Se copia la direccin,
no el contenido
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0xCB
0x12
0x08
0x02
0x0F
$t1
00001111
31
ARCOS-UC3M
0x00
0x00
0x00
00000000
00000000
00000000
24 23
16 15
87
0
Estructura de Computadores
110
Ejemplo
Direcciones Byte
(contenido)
de bytes
li $t1, 18
li $t2, 24
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0x0F000004
0x0F000005
0x0F000006
0x0F000007
ARCOS-UC3M
Estructura de Computadores
111
Ejemplo
Direcciones Byte
(contenido)
de bytes
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0x0F000004
0x0F000005
0x0F000006
0x0F000007
li $t1, 18
li $t2, 24
$t1
00000000
31
$t2
00000000
31
ARCOS-UC3M
00000000
00000000
24 23
16 15
00010010
87
00000000
00000000
24 23
16 15
00011000
87
Estructura de Computadores
112
Ejemplo
Direcciones Byte
de bytes
(contenido)
sw $t1, 0x0F000000
Escribe el contenido de un registro en memoria (la
palabra completa)
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0x0F000004
0x0F000005
0x0F000006
0x0F000007
00000000
00000000
00000000
00010000
$t1
00000000
31
$t2
00000000
31
ARCOS-UC3M
00000000
00000000
24 23
16 15
00010010
87
00000000
00000000
24 23
16 15
00011000
87
Estructura de Computadores
113
Ejemplo
Direcciones Byte
de bytes
(contenido)
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0x0F000004
0x0F000005
0x0F000006
0x0F000007
00000000
00000000
00000000
00010000
00000000
00000000
00000000
00011000
sw $t1, 0x0F000000
sw $t2, 0x0F000004
$t1
00000000
31
$t2
00000000
31
ARCOS-UC3M
00000000
00000000
24 23
16 15
00010010
87
00000000
00000000
24 23
16 15
00011000
87
Estructura de Computadores
114
Ejemplo
Direcciones Byte
de bytes
(contenido)
sb $t1, 0x0F000001
Escribe el contenido del byte menos significativo
del registro $t1 en memoria
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0x0F000004
0x0F000005
0x0F000006
0x0F000007
00010010
$t1
00000000
31
ARCOS-UC3M
00000000
00000000
24 23
16 15
Estructura de Computadores
00010010
87
115
Ejemplo
Direcciones Byte
de bytes
(contenido)
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0x0F000004
0x0F000005
0x0F000006
0x0F000007
00000000
00000000
00000000
00010000
00000000
00000000
00000000
00011000
lw $t3, 0x0F000000
$t3
00000000
31
$t1
00000000
31
$t2
00000000
31
ARCOS-UC3M
00000000
00000000
24 23
16 15
00010010
87
00000000
00000000
24 23
16 15
00010010
87
00000000
00000000
24 23
16 15
00011000
87
Estructura de Computadores
116
Datos no alineados
Lgicamente
lw $t1, 0x05
????
Byte
0
1
2
3
4
5
6
7
8
Palabra de 32 bits
0
1
2
00000000
00000000
00000001
00001101
Fsicamente
3
4
00000000
00000000
00000001
00001101
byte 0
byte 1
byte 2
byte 3
Palabra
ARCOS-UC3M
Estructura de Computadores
117
Alineacin de datos
direccin
31
0
4
8
12
23
15
16
20
24
ARCOS-UC3M
Estructura de Computadores
118
Alineacin de datos
En general:
Un dato que ocupa K bytes est alineado cuando la
direccin D utilizada para accederlo cumple que:
D mod K = 0
ARCOS-UC3M
Estructura de Computadores
119
Alineacin de datos
En general los computadores no permiten el acceso a datos no
alineados
Objetivo: minimizar el nmero de accesos a memoria
El compilador se encarga de asignar a los datos las
direcciones adecuadas
Algunas arquitecturas como Intel permiten el acceso a datos no
alineados
El acceso a un dato no alineado implica varios accesos a
Palabra de 32 bits
memoria
0
1
2
3
4
ARCOS-UC3M
00000000
00000000
00001110
00001101
byte 0
Estructura de Computadores
byte 1
byte 2
byte 3
120
Resumen
Un programa para poder ejecutarse debe estar cargado junto
con sus datos en memoria
Todas las instrucciones y los datos se almacenan en memoria,
por tanto todo tiene una direccin de memoria
Las instrucciones y los datos
En un computador como el MIPS 32 (de 32 bits)
Los registros son de 32 bits
En la memoria se pueden almacenar bytes (8 bits)
Instrucciones memoria registro: lb, lbu, sb
Instrucciones registro memoria: sb
Estructura de Computadores
121
Instrucciones y pseudoinstrucciones
Una instruccin en ensamblador se corresponde con una
instruccin mquina
Ocupa 32 bits
addi $t1, $t1, 2
Una pseudoinstruccin en ensamblador se corresponde con
varias instrucciones mquina.
li $t1, 0x00800010
No cabe en 32 bits, pero se puede utilizar como
pseudoinstruccin.
Es equivalente a:
lui $t1, 0x0080
ori $t1, $t1, 0x0010
ARCOS-UC3M
Estructura de Computadores
122
reg2,reg1
Se convierte en:
add
ARCOS-UC3M
reg2,$zero,reg1
Estructura de Computadores
123
lw
sw
lb
sb
lbu
ARCOS-UC3M
124
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0xCB
0x12
0x08
0x02
$t0
31
24 23
16 15
87
31
24 23
16 15
87
$t1
ARCOS-UC3M
Estructura de Computadores
125
0x0F000000
0x0F000001
0x0F000002
0x0F000003
la $t0, 0x0F000000
0xCB
0x12
0x08
0x02
$t0
31
24 23
16 15
87
31
24 23
16 15
87
$t1
ARCOS-UC3M
Estructura de Computadores
126
0x0F000000
0x0F000001
0x0F000002
0x0F000003
la $t0, 0x0F000000
Se copia la direccin,
no el contenido
0xCB
0x12
0x08
0x02
$t0
00001111
00000000
00000000
31
24 23
16 15
00000000
87
31
87
$t1
ARCOS-UC3M
24 23
Estructura de Computadores
16 15
127
0x0F000000
0x0F000001
0x0F000002
0x0F000003
lbu
$t1, ($t0)
0xCB
0x12
0x08
0x02
$t0
00001111
00000000
00000000
31
24 23
16 15
00000000
87
31
87
$t1
ARCOS-UC3M
24 23
Estructura de Computadores
16 15
128
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0xCB
0x12
0x08
0x02
lbu
$t0
$t1
ARCOS-UC3M
$t1, ($t0)
00001111
00000000
00000000
31
24 23
16 15
00000000
87
00000000
00000000
00000000
31
24 23
16 15
11001011
87
Estructura de Computadores
129
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0xCB
0x12
0x08
0x02
lw
$t0
$t1
ARCOS-UC3M
$t1, ($t0)
00001111
00000000
00000000
31
24 23
16 15
00000000
87
11001011
00010010
00001000
31
24 23
16 15
00000010
Estructura de Computadores
87
130
Estructura de Computadores
131
ARCOS-UC3M
Estructura de Computadores
132
resultado ;
int
op1 = 100 ;
int
op2 = -10 ;
resultado:
op1:
op2:
.word 0
.word 100
.word -10
...
...
.text
.globl main
main ()
lw $t2 op2
{
resultado = op1 + op2 ;
...
}
ARCOS-UC3M
Estructura de Computadores
133
Ejercicio
Indique un fragmento de cdigo en ensamblador con la misma
funcionalidad que:
int
int
int
int
b;
a = 100 ;
c = 5 ;
d;
main ()
{
d = 80;
b = -(a+b*c+a);
}
Estructura de Computadores
134
ARCOS-UC3M
Estructura de Computadores
Direccion_inicio
v[0]
v[1]
v[2]
v[N-1]
135
vec: .space 20
int vec[5] ;
...
main ()
{
vec[4] = 8;
#5 elem.*4 bytes
.text
.globl main
main:
la $t1 vec
li $t2
sw $t2 16($t1)
...
ARCOS-UC3M
Estructura de Computadores
136
vec: .space 20
int vec[5] ;
...
main ()
{
vec[4] = 8;
#5 elem.*4 bytes
.text
.globl main
main:
li
$t0 16
la
$t1
vec
$t2
sw
$t2, ($t3)
...
ARCOS-UC3M
Estructura de Computadores
137
int vec[5] ;
...
.align
2
#siguiente dato alineado
vec: .space 20
#5 elem.*4 bytes
a 4
.text
main ()
{
vec[4] = 8;
}
.globl main
main:
li $t2
li $t1
16
sw $t2 vec($t1)
...
ARCOS-UC3M
Estructura de Computadores
138
Ejercicio
Si V es un array de nmeros enteros (int)
V representa la direccin de inicio de vector
En qu direccin se encuentra el elemento V[5]?
Qu instruccin permite cargar en el registro $t0 el valor
v[5]?
ARCOS-UC3M
Estructura de Computadores
139
1 vector
2 vector
ARCOS-UC3M
Estructura de Computadores
140
vec: .space 20
#5 elem.*4 bytes
main ()
{
m[0][1] = m[0][0] +
m[1][0] ;
...
}
.text
.globl main
main:
lw $t1 mat+0
lw $t2 mat+12
add $t3 $t1 $t2
sw
$t3 mat+4
...
ARCOS-UC3M
Estructura de Computadores
141
main ()
{
printf(%s,ac1) ;
...
}
ARCOS-UC3M
.data
c1: .space 1
# 1 byte
c2: .byte h
ac1: .asciiz hola
...
.text
.globl main
main:
li $v0 4
la $a0 ac1
syscall
...
Estructura de Computadores
142
char
char
char
Char
...
c1 ;
c2=h ;
*ac1 = hola ;
*c;
c1:
.space 1
c2:
.byte h
# 1 byte
la $t0, ac1
li $a0, 1
main ()
{
c = ac1; int l = 0;
while (*c != NULL) {
c++; l++;
}
printf(%d, l);
...
}
$t1, ($t0)
b buc
fin:
li $v0 1
syscall
...
ARCOS-UC3M
Estructura de Computadores
143
Vectores y cadenas
En general:
lw $t0, 4($s3) # $t0
sw $t0, 4($s3) # M[$s3+4]
ARCOS-UC3M
Estructura de Computadores
M[$s3+4]
$t0
144
Ejercicio
Escriba un programa en ensamblador equivalente a:
int vec[100] ;
...
main ()
{
int i = 0;
for (i = 0; i < 100; i++)
vec[i] = 5;
Estructura de Computadores
145
Ejercicio
Escriba un programa en ensamblador equivalente a:
int vec[100] ;
...
main ()
{
int i = 0;
suma = 0;
for (i = 0; i < 100; i++)
suma = suma + vec[i];
}
Estructura de Computadores
146
Ejercicio
Escriba un programa que:
Indique el nmero de veces que aparece un carcter en una
cadena de caracteres
La direccin de la cadena se encuentra en $a0
El carcter a buscar se encuentra en $a1
El resultado se dejar en $v0
ARCOS-UC3M
Estructura de Computadores
147
$f0
$f2
$f31
$f30
B.R.
ALU
BUS
ARCOS-UC3M
Estructura de Computadores
148
ARCOS-UC3M
Estructura de Computadores
149
add.s
$f0
$f1
$f1 $f4
$f3
$f0
$f2
$f31
$f30
B.R.
f0 = f1 + f4
ALU
add.d
$f0 $f2
$f4
BUS
Estructura de Computadores
150
$f0,
direccion:
Estructura de Computadores
151
float resultado ;
float op1 = 100 ;
.float
.float 100
.float -10
...
.text
.globl main
main: l.s
main ()
l.s
{
resultado = op1 + op2 ;
...
}
ARCOS-UC3M
add.s
s.s
...
Estructura de Computadores
$f0 op1
$f1 op2
$f3 $f1 $f2
$f3 resultado
152
double resultado ;
double op1 = 100 ;
.double
.double 100
.double -10.27
...
.text
.globl main
main: l.d
main ()
l.d
{
resultado = op1 * op2 ;
...
}
ARCOS-UC3M
mul.d
s.d
...
Estructura de Computadores
$f0 op1
$f2 op2
# ($f0,$f1)
# ($f2,$f3)
153
mtc1
$t0
$f1
FPU
CPU
t0
t1
B.R. enteros
$f1
$f3
$f31
$f0
$f2
$f30
B.R.
U.C
ALU
BUS
ARCOS-UC3M
ALU
BUS
Estructura de Computadores
154
mfc1
$t0
$f1
FPU
CPU
t0
t1
B.R. enteros
$f1
$f3
$f31
$f0
$f2
$f30
B.R.
U.C
ALU
BUS
ARCOS-UC3M
ALU
BUS
Estructura de Computadores
155
mov.s
$f0
$f1
FPU
FPU
$f1
$f0
$f1
$f3
$f2
$f3
$f31
$f30
ALU
BUS
B.R.
$f31
$f0
$f2
$f30
ALU
BUS
$f0
ARCOS-UC3M
B.R.
Estructura de Computadores
$f1
156
mov.d
$f0
FPU
FPU
$f1
$f0
$f1
$f3
$f2
$f3
$f31
$f30
B.R.
$f31
$f0
$f2
$f30
B.R.
ALU
ALU
BUS
BUS
($f0, $f1)
ARCOS-UC3M
$f2
($f2, $f3)
Estructura de Computadores
157
Operaciones de conversin
cvt.s.w $f2 $f1
Convierte un entero ($f1) a simple precisin ($f2)
cvt.w.s $f2 $f1
Convierte de simple precisin ($f1) a entero ($f2)
cvt.d.w $f2 $f0
Convierte un entero ($f0) a doble precisin ($f2)
cvt.w.d $f2 $f0
Convierte de doble precisin ($f0) a entero ($f2)
cvt.d.s $f2 $f0
Convierte de simple precisin ($f0) a doble ($f2)
cvt.s.d $f2 $f0
Convierte de doble precisin ($f0) a simple($f2)
ARCOS-UC3M
Estructura de Computadores
158
Operaciones de carga
li.s $f4, 8.0
Carga el valor float 8.0 en el registro $f4
li.d $f2, 12.4
Carga el valor double 12.4 en el registro $f2
ARCOS-UC3M
Estructura de Computadores
159
Ejemplo
float PI
int
.text
.globl main
= 3,1415;
radio = 4;
float longitud;
main:
longitud = PI * radio;
ARCOS-UC3M
li.s
li
$f0 3.1415
$t0 4
mtc1
cvt.s.w
mul.s
$t0 $f1
$f2 $f1
$f0 $f2 $f1
Estructura de Computadores
# 4 en Ca2
# 4 ieee754
160
Ejemplo
float PI
int
.text
.globl main
= 3,1415;
radio = 4;
float longitud;
main:
longitud = PI * radio;
FPU
CPU
t0
t1
B.R. enteros
$f1
$f3
$f31
$f0
$f2
$f30
B.R.
li.s
li
$f0 3.1415
$t0 4
mtc1
cvt.s.w
mul.s
$t0 $f1
$f2 $f1
$f0 $f2 $f1
# 4 en Ca2
# 4 ieee754
U.C
ALU
BUS
ARCOS-UC3M
ALU
BUS
Estructura de Computadores
161
Ejercicio
Escriba un programa que:
Cargue el valor -3.141516 en el registro $f0
Permita obtener el valor del exponente y de la mantisa
almacenada en el registro $f0 (en formato IEEE 754)
Imprima el signo
Imprima el exponente
Imprima la mantisa
ARCOS-UC3M
Estructura de Computadores
162
Solucin
li $s0, 0x80000000
and $a0, $t0, $s0
srl $a0, $a0, 31
li $v0, 1
syscall
.data
saltolinea:
.text
.globl main
main:
li.s
.asciiz
"\n"
la $a0,
li $v0,
syscall
$f0, -3.141516
saltolinea
4
#se imprime
mov.s $f12, $f0
li $v0, 2
syscall
li $s0, 0x7F800000
and $a0, $t0, $s0
srl $a0, $a0, 23
li $v0, 1
syscall
la $a0,
li $v0,
syscall
la $a0,
li $v0,
syscall
# se
mfc1
saltolinea
4
copia al procesador
$t0, $f12
#signo
#exponente
saltolinea
4
li $s0, 0x007FFFFF
and $a0, $t0, $s0
li $v0, 1
syscall
#mantisa
jr $ra
ARCOS-UC3M
Estructura de Computadores
163
Contenido
Fundamentos bsicos de la programacin en ensamblador
Ensamblador del MIPS 32, modelo de memoria y
representacin de datos
Formato de las instrucciones y modos de direccionamiento
Llamadas a procedimientos y uso de la pila
ARCOS-UC3M
Estructura de Computadores
164
ARCOS-UC3M
Estructura de Computadores
165
op.
rs
rt
rd
shamt
func.
6 bits
5 bits
5 bits
5 bits
5 bits
6 bits
Tipo I
op.
rs
rt
offset
transferencia
inmediato
6 bits
5 bits
5 bits
16 bits
Tipo J
op.
aritmticas
offset
saltos
6 bits
ARCOS-UC3M
26 bits
Estructura de Computadores
166
Operandos a utilizar
Ubicacin de los operandos
Ubicacin del resultado
Ubicacin de la siguiente instruccin (si op. salto)
Implcito: PC
PC + 4 (apuntar a la siguiente
instruccin)
Explcito: j 0x01004
(modifica el PC)
ARCOS-UC3M
Estructura de Computadores
167
En la propia instruccin
En los registros del procesador
En memoria principal
En unidades de Entrada/Salida (I/O)
ARCOS-UC3M
Estructura de Computadores
168
Modos de direccionamiento
El modo de direccionamiento es un procedimiento que permite
determinar la ubicacin de un operando o una instruccin
Tipos:
Inmediato
Directo
De registro
Indirecto
Indirecto de registro
Relativo
A registro base
A registro ndice
A contador de programa
Implcito
De pila
ARCOS-UC3M
Estructura de Computadores
169
Direccionamiento inmediato
El operando es parte de la instruccin.
Ejemplo:
li
$a0
addi $t1
25
$t2
50
ARCOS-UC3M
Estructura de Computadores
170
Direccionamiento de registro
El operando se encuentra en el registro.
Ejemplo: move $a0 $a1
Copia en el registro $a0 el valor que hay en el registro $a1.
El identificador de $a0 y $a1 estn codificados en la instruccin.
op
rs
rt
16 bits
Operando
B.Reg.
Ventajas:
Acceso a registros es rpido
El nmero de registros es pequeo => pocos bits para
sucodificacin, instrucciones ms cortas
ARCOS-UC3M
Estructura de Computadores
171
Direccionamiento directo
El operando se encuentra en memoria, y la direccin est
codificada en la instruccin.
Ejemplo (MIPS): lw $t1, 0xFFF0
Carga en $t1 el dato que hay en la posicin de memoria 0xFFF0
memoria
Operando
op
rs
rt
16 bits
Desventajas:
Acceso a memoria es lento comparado con los registros
Direcciones largas => instrucciones ms largas
ARCOS-UC3M
Estructura de Computadores
172
memoria
B.Reg.
operando
op
rs
rt
direccin
16 bits
Ventajas:
Instrucciones cortas
En el caso del MIPS permite direccionar toda la memoria (32 bits)
ARCOS-UC3M
Estructura de Computadores
173
op
memoria
operando
direccin2
direccion1
Desventajas:
Puede requerir varios accesos a memoria
Es ms lento
ARCOS-UC3M
Estructura de Computadores
174
lw $a0 12($t1)
Instruccin
Codop Registro R
Desplazamiento
Memoria
Banco de Registros
Direccin de memoria
ARCOS-UC3M
Estructura de Computadores
Operando
175
.data
.align
vec: .space 20
#5 elem.*4 bytes
.text
int vec[5] ;
...
.globl main
main:
la $t1 vec
li $t2
main ()
{
v[4] = 8;
sw $t2 16($t1)
...
ARCOS-UC3M
Estructura de Computadores
176
lw $a0 direccion($t1)
direccin
Memoria
Registros
ndice/desplazamiento
ARCOS-UC3M
Estructura de Computadores
Operando
177
.data
.align
vec: .space 20
#5 elem.*4 bytes
.text
int vec[5] ;
...
.globl main
main:
li $t1 12
li $t2
main ()
{
v[3] = 8;
v[4] = 8;
sw $t2 vec($t1)
addi $t1
$t1
sw $t2 vec($t1)
...
}
ARCOS-UC3M
Estructura de Computadores
178
desplazamiento
PC
ARCOS-UC3M
Estructura de Computadores
179
ARCOS-UC3M
Estructura de Computadores
Instruccin:
or
$2,$0,$0
slt
$8,$0,$5
beq
$8,$0,3
add
$2,$2,$4
addi $5,$5,-1
j
0x100001
180
etiqueta se codifica
$9,$0,
16
CO
rs
rt
Dato inmediato
beq
add
addi
j
$t0,$1, fin
$t8,$t4,$t4
$t0,$0,-1
bucle
fin:
ARCOS-UC3M
Estructura de Computadores
181
beq
add
addi
j
$t0,$1, fin
$t8,$t4,$4t4
$t0,$0,-1
bucle
fin:
fin ==
ARCOS-UC3M
Estructura de Computadores
182
fin:
ARCOS-UC3M
Estructura de Computadores
li
li
li
li
bge
mul
addi
b
move
$t0 8
$t1 4
$t2 1
$t4 0
$t4 $t1 fin
$t2 $t2 $t0
$t4 $t4 1
while
$t2 $t4
183
while:
fin:
ARCOS-UC3M
li
li
li
li
bge
mul
addi
b
move
$t0 8
$t1 4
$t2 1
$t4 0
$t4 $t1 fin
$t2 $t2 $t0
$t4 $t4 1
while
$t2 $t4
Contenido
0x0000100
li
0x0000104
li
$t1 4
0x0000108
li
$t2 1
0x000010C
li
$t4 0
0x0000110
bge
0x0000114
mul
0x0000118
0x000011C
0x0000120
move $t2
Estructura de Computadores
$t0
while
$t4
184
while:
fin:
li
li
li
li
bge
mul
addi
b
move
$t0 8
$t1 4
$t2 1
$t4 0
$t4 $t1 fin
$t2 $t2 $t0
$t4 $t4 1
while
$t2 $t4
Contenido
0x0000100
li
0x0000104
li
$t1 4
0x0000108
li
$t2 1
0x000010C
li
$t4 0
0x0000110
bge
0x0000114
mul
0x0000118
0x000011C
0x0000120
move $t2
Estructura de Computadores
$t0
while
$t4
185
j direccion
op.
direccion
6 bits
26 bits
Instruccin
b desplazamiento
op.
6 bits
desplazamiento
5 bits
5 bits
16 bits
ARCOS-UC3M
Estructura de Computadores
186
Direccionamiento implcito
El operando no est codificado en la instruccin,
pero forma parte de esta.
Ejemplo: beqz $a0 etiqueta1
Si registro $a0 es cero, salta a etiqueta.
$a0 es un operando, $zero es el otro.
op
rs
16 bits
Ventajas
Es rpido: no es necesario acceder a memoria.
Instrucciones ms cortas
ARCOS-UC3M
Estructura de Computadores
187
Direccionamiento de pila
PUSH Reg
dato
cima
$sp
$sp
cima
ARCOS-UC3M
Estructura de Computadores
188
Direccionamiento de pila
POP Reg
dato
$sp
dato
cima
cima
$sp
ARCOS-UC3M
Estructura de Computadores
189
Direccionamiento de pila
190
PUSH $t0
POP $t0
lw $t0, ($sp)
add $sp, $sp, 4
ARCOS-UC3M
Estructura de Computadores
190
la $t0 label
inmediato
El segundo operando de la instruccin es una direccin
PERO no se accede a esta direccin, la propia direccin es el operando
directo a memoria
lw $t0 label
El segundo operando de la instruccin es una direccin
Hay que acceder a esta direccin para tener el valor con el que trabajar
bne $t0 $t1 label
relativo a registro PC
El tercer operando de la instruccin representa un desplazamiento
PERO no se accede a esta direccin, la propia direccin es PARTE del
operando
En el formato de esta instruccin, label se codifica como un nmero en
complemento a dos que representa el desplazamiento (como palabras)
relativo al registro PC
ARCOS-UC3M
Estructura de Computadores
191
ARCOS-UC3M
valor
$reg
dir
($reg)
desplazamiento($reg)
direccion($reg)
beq etiqueta
desplazamiento($sp)
Estructura de Computadores
192
Formato de instrucciones
Una instruccin mquina es autocontenida e incluye:
Cdigo de operacin
Direccin de los operandos
Direccin del resultado
Direccin de la siguiente instruccin
Tipos de representacin de los operandos
Una instruccin se divide en campos
Ejemplo de campos en una instruccin del MIPS:
op.
ARCOS-UC3M
rs
rt
rd
shamt
Estructura de Computadores
func.
193
Formato de instrucciones
Una instruccin normalmente ocupa una palabra pero
puede ocupar ms en algunos computadores
En el caso del MIPS todas las instrucciones ocupan una
palabra
Campo de cdigo:
Con n bits se pueden codificar 2n instrucciones
Si se quiere codificar ms se utiliza un campo de extensin
Ejemplo: en el MIPS las instrucciones aritmticas tienen
como cdigo de op = 0. La funcin concreta se codifica en el
campo func.
Tipo R
op.
rs
rt
rd
shamt
func.
aritmticas
ARCOS-UC3M
Estructura de Computadores
194
Estructura de Computadores
195
Longitud de formato
196
Alternativas:
Longitud nica: Todas las instrucciones tienen la misma
longitud de formato.
MIPS32: 32 bits
PowerPC: 32 bits
Longitud variable: Distintas instrucciones tienen distinta
longitud de formato.
Cmo se sabe la longitud de la instruccin? Cod. Op.
IA32 (Procesadores Intel): Nmero variable de bytes.
ARCOS-UC3M
Estructura de Computadores
196
CO
rs
rt
rd
sa
func
26
CO
Dato inmediato
16
CO
rs
rt
Dato inmediato
ARCOS-UC3M
Estructura de Computadores
197
CO
rs
rt
rd
sa
func
10
32
Estructura de Computadores
198
16
CO
rs
rt
Dato inmediato
22
21
-50
Estructura de Computadores
199
ARCOS-UC3M
Estructura de Computadores
200
Estructura de Computadores
201
Pregunta
202
ARCOS-UC3M
Estructura de Computadores
202
Cdigo de operacin
203
Tamao fijo:
n bits
2n cdigos de operacin.
m cdigos de operacin
log2m bits.
Campos de extensin
MIPS (instrucciones aritmticas-lgicas)
Op = 0; la instruccin est codificada en func
Tipo R
op.
rs
rt
rd
shamt
func.
aritmticas
Tamao variable:
Instrucciones ms frecuentes = Tamaos ms cortos.
ARCOS-UC3M
Estructura de Computadores
203
Ejemplo
ARCOS-UC3M
Estructura de Computadores
204
Solucin
palabra -> 16 bits
60 instrucciones
8 registros (en BR)
ADDx R1(reg.), R2(reg.), R3(reg.)
16 bits
ARCOS-UC3M
Estructura de Computadores
205
Solucin
16 bits
6 bits
Cdigo de
operacin
ARCOS-UC3M
Estructura de Computadores
206
Solucin
16 bits
ARCOS-UC3M
6 bits
Cdigo de
operacin
Operandos
(3 registros)
Estructura de Computadores
207
Solucin
16 bits
6 bits
Cdigo de
operacin
ARCOS-UC3M
Estructura de Computadores
208
Ejercicio
Sea un computador de 16 bits, que direcciona la memoria por
bytes y que incluye un repertorio con 60 instrucciones
mquina. El banco de registros incluye 8 registros. Indicar el
formato de la instruccin ADDV R1, R2, M, donde R1 y R2
son registros y M es una direccin de memoria.
ARCOS-UC3M
Estructura de Computadores
209
Ejercicio
Sea un computador de 32 bits, que direcciona la memoria por
bytes. El computador incluye 64 instrucciones mquina y 128
registros. Considere la instruccin SWAPM dir1, dir2, que
intercambia el contenido de las posiciones de memoria dir1 y
dir2. Se pide:
Indicar el espacio de memoria direccionable en este
computador.
Indicar el formato de la instruccin anterior.
Especifique un fragmento de programa en ensamblador del
MIPS 32 equivalente a la instruccin mquina anterior.
Si se fuerza a que la instruccin quepa en una palabra, qu
rango de direcciones se podra contemplar considerando que
las direcciones se representan en binario puro.
ARCOS-UC3M
Estructura de Computadores
210
CISC-RISC
CISC: Complex Instruction Set Architecture (http://es.wikipedia.org/wiki/RISC)
Muchas instrucciones.
Complejidad variable.
Diseo irregular.
RISC: Reduced Instruction Set Code (http://es.wikipedia.org/wiki/CISC)
Instrucciones bastante simples.
Nmero reducido de instrucciones.
Instrucciones de tamao fijo.
Banco de registros grande.
La mayora de las instrucciones usan registros.
Paso de parmetros a travs del banco de registros.
Arquitecturas segmentadas.
ARCOS-UC3M
Estructura de Computadores
211
Modelos de ejecucin
212
ARCOS-UC3M
Pila.
Registro acumulador.
Registros, Registro-Memoria, MemoriaRegistros, Registro-Memoria, Memoria-
Estructura de Computadores
212
Modelo de 3 direcciones
213
Registros
Los 3 operandos son registros.
Requiere operaciones de carga/almacenamiento.
ADD .R0, .R1, .R2
Memoria-Memoria
Los 3 operandos son direcciones de memoria.
ADD /DIR1, /DIR2, /DIR3
Registro-Memoria
Hbrido.
ADD .R0, /DIR1, /DIR2
ADD .R0, .R1, /DIR1
ARCOS-UC3M
Estructura de Computadores
213
Ejemplo
214
X = A + B * C
/DA
/DB
/DC
/DX
Modelo de ejecucin
ARCOS-UC3M
Estructura de Computadores
214
3 direcciones: R-R
215
LOAD
LOAD
MUL
LOAD
ADD
STORE
ARCOS-UC3M
.R0,
.R1,
.R0,
.R2,
.R0,
.R0,
/DB
/DC
.R0, .R1
/DA
.R0, .R2
/DX
6 instrucciones
4 acceso a memoria de datos
10 accesos a registros
Estructura de Computadores
215
3 direcciones: M-M
216
2 instrucciones
6 acceso a memoria de datos
0 accesos a registro
ARCOS-UC3M
Estructura de Computadores
216
Modelo de 2 direcciones
217
Registros
Los 2 operandos son registros.
Requiere operaciones de carga/almacenamiento.
ADD .R0, .R1 (R0 <- R0 + R1)
Memoria-Memoria
Los 2 operandos son direcciones de memoria.
ADD /DIR1, /DIR2 (MP[DIR1] <- MP[DIR1] +
MP[DIR2])
Registro-Memoria
Hbrido.
ADD .R0, /DIR1 (R0 <- R0 + MP[DIR1])
ARCOS-UC3M
Estructura de Computadores
217
2 direcciones: R-R
218
LOAD
LOAD
MUL
LOAD
ADD
STORE
.R0,
.R1,
.R0,
.R3,
.R0,
.R0,
/DB
/DC
.R1
/DA
.R3
/DX
6 instrucciones
4 acceso a memoria de datos
8 accesos a registro
ARCOS-UC3M
Estructura de Computadores
218
2 direcciones: M-M
219
3 instrucciones
6 acceso a memoria de datos
0 accesos a registro
ARCOS-UC3M
Estructura de Computadores
219
2 direcciones: R-M
220
LOAD
MUL
ADD
STORE
.R0,
.R0,
.R0,
.R0,
/DB
/DC
/DA
/DX
4 instrucciones
4 accesos a memoria de datos
4 accesos a registro
ARCOS-UC3M
Estructura de Computadores
220
Modelo de 1 direccin
221
ARCOS-UC3M
Estructura de Computadores
221
1 direccin
222
LOAD
MUL
ADD
STORE
/DB
/DC
/DA
/DX
4 instrucciones
4 accesos a memoria de datos
0 accesos a registro
ARCOS-UC3M
Estructura de Computadores
222
Modelo de 0 direcciones
223
ARCOS-UC3M
Estructura de Computadores
223
PUSH 5
ARCOS-UC3M
Estructura de Computadores
224
PUSH 5
PUSH 7
7
5
ARCOS-UC3M
Estructura de Computadores
225
PUSH 5
PUSH 7
ADD
12
ARCOS-UC3M
Estructura de Computadores
226
PUSH 5
PUSH 7
ADD
POP /DX
ARCOS-UC3M
Estructura de Computadores
227
0 direcciones
228
PUSH
PUSH
MUL
PUSH
ADD
POP
/DB
/DC
/DA
/DX
ARCOS-UC3M
6 instrucciones
4 accesos a memoria de datos
10 accesos a memoria de pila
Estructura de Computadores
228
Recordatorio:
Informacin de instruccin
229
Informacin:
Operacin a realizar.
Operandos.
Resultado.
Ubicacin de siguiente instruccin.
Parte de la informacin puede ser implcita.
ARCOS-UC3M
Estructura de Computadores
229
Contenido
Fundamentos bsicos de la programacin en ensamblador
Ensamblador del MIPS 32, modelo de memoria y
representacin de datos
Formato de las instrucciones y modos de direccionamiento
Llamadas a procedimientos y uso de la pila
ARCOS-UC3M
Estructura de Computadores
230
Procedimientos
Un procedimiento (funcin, subrutina) es un subprograma que
realiza una tarea especifica cuando se le invoca
Recibe argumentos o parmetros de entrada
Devuelve algn resultado
En ensamblador un procedimiento se asocia con un nombre
simblico que denota su direccin de inicio.
ARCOS-UC3M
Estructura de Computadores
231
Pasos en la ejecucin de un
procedimiento/funcin
Situar los parmetros en un lugar donde el procedimiento
pueda accederlos.
Transferir el control al procedimiento.
Adquirir los recursos de almacenamiento necesarios para el
procedimiento.
Realizar la tarea deseada.
Poner el resultado en un lugar donde el programa o
procedimiento que realiza la llamada pueda accederlo.
Devolver el control al punto de origen.
ARCOS-UC3M
Estructura de Computadores
232
int main() {
int z;
z=factorial(x);
print_int(z);
}
ARCOS-UC3M
int factorial(int x) {
int i;
int r=1;
for (i=1;i<=x;i++) {
r*=i;
}
return r;
}
Estructura de Computadores
233
factorial:
jal factorial
jr $ra
ARCOS-UC3M
Estructura de Computadores
234
0x00401000 factorial:
jr $ra
$ra = PC = 0x00001004
PC = 0x00401000
ARCOS-UC3M
Estructura de Computadores
235
0x00401000
jr $ra
$ra = 0x00001004
ARCOS-UC3M
Estructura de Computadores
236
jr $ra
PC = $ra = 0x00001004
$ra = 0x00001004
ARCOS-UC3M
Estructura de Computadores
237
0x00401000
jr $ra
PC = $ra = 0x00001004
ARCOS-UC3M
Estructura de Computadores
238
Instrucciones jal/jr
239
ARCOS-UC3M
Estructura de Computadores
239
Llamadas anidadas
0x00401000
jal 0x000080000
0x00008000
jr $ra
jr $ra
$ra = PC = 0x00001004
PC = 0x00401000
ARCOS-UC3M
Estructura de Computadores
240
Llamadas anidadas
0x00401000
0x00008000
jr $ra
jr $ra
$ra = PC = 0x00401024
PC = 0x00008000
ARCOS-UC3M
Estructura de Computadores
241
Llamadas anidadas
0x00401000
0x00008000
jr $ra
jr $ra
PC = $ra = 0x00401024
ARCOS-UC3M
Estructura de Computadores
242
Llamadas anidadas
0x00401000
0x00008000
jr $ra
jr $ra
?
PC = $ra = 0x00401024
ARCOS-UC3M
Estructura de Computadores
243
Llamadas anidadas
0x00401000
0x00008000
jr $ra
jr $ra
?
PC = $ra = 0x00401024
ARCOS-UC3M
Estructura de Computadores
244
ARCOS-UC3M
Estructura de Computadores
245
Ejecucin de un programa
Memoria
Principal
Sistema
Operativo
Disco
instrucciones
datos
Programa
en ejecucion
Fichero
ejecutable
pila
ARCOS-UC3M
Estructura de Computadores
246
memoria
pc
Segmento de Texto
01011001
Segmento de pila
Variables locales
Contexto de funciones
Segmento de Datos
Segmento de datos
$sp
01011001
Segmento de Pila
ARCOS-UC3M
Estructura de Computadores
247
Pila
PUSH Reg
dato
cima
$sp
$sp
cima
ARCOS-UC3M
Estructura de Computadores
248
Pila
POP Reg
dato
$sp
dato
cima
cima
$sp
ARCOS-UC3M
Estructura de Computadores
249
PUSH $t0
POP $t0
lw
$t0, ($sp)
addu $sp, $sp, 4
ARCOS-UC3M
Estructura de Computadores
250
$sp
ARCOS-UC3M
Estructura de Computadores
251
$sp
7
8
ARCOS-UC3M
Estructura de Computadores
252
$sp
7
8
li
sw
$t2, 9
$t2 ($sp)
ARCOS-UC3M
Estructura de Computadores
253
$sp
7
8
lw
$t2 ($sp)
ARCOS-UC3M
Estructura de Computadores
254
9
7
$sp
ARCOS-UC3M
Estructura de Computadores
255
Pila
uso de push y pop consecutivos
push $a0
push $t1
push $t2
push $s2
...
pop $s2
pop $t2
pop $t1
pop $a0
ARCOS-UC3M
Estructura de Computadores
256
Pila
uso de push y pop consecutivos
sub $sp $sp 4
sw
push
push
push
push
$a0
$t1
$t2
$s2
$a0
($sp)
$t1
($sp)
$t2
($sp)
...
sw
$s2
($sp)
...
pop
pop
pop
pop
$s2
$t2
$t1
$a0
lw $s2 ($sp)
add $sp $sp 4
lw $s2 ($sp)
add $sp $sp 4
lw $s2 ($sp)
add $sp $sp 4
lw $s2 ($sp)
add $sp $sp 4
ARCOS-UC3M
Estructura de Computadores
257
Pila
uso de push y pop consecutivos
push
push
push
push
$a0
$t1
$t2
$s2
...
pop
pop
pop
pop
$a0
12($sp)
sw
$t1
8($sp)
sw
$t2
4($sp)
sw
$s2
($sp)
...
$s2
$t2
$t1
$a0
lw
$s2
($sp)
lw
$t2
4($sp)
lw
$t1
8($sp)
lw
$a0
12($sp)
add $sp
ARCOS-UC3M
Estructura de Computadores
$sp
16
258
Ejemplo
(1) Se parte de un cdigo en lenguaje de alto nivel
259
int main() {
int z;
z=factorial(5);
print_int(z);
.
.
.
}
ARCOS-UC3M
int factorial(int x) {
int i;
int r=1;
for (i=1;i<=x;i++) {
r*=i;
}
return r;
}
Estructura de Computadores
259
Ejemplo
(2) Pensar en el paso de parmetros
260
ARCOS-UC3M
Estructura de Computadores
260
Ejemplo
(3) Se pasa a ensamblador cada funcin
261
int main() {
int z;
z=factorial(5);
print_int(z);
. . .
}
li $a0, 5
jal factorial
move $a0, $v0
li $v0, 1
syscall
# argumento
# llamada
# resultado
# llamada para
# imprimir un int
...
int factorial(int x) {
int i;
int r=1;
for (i=1;i<=x;i++) {
r*=i;
}
return r;
}
ARCOS-UC3M
factorial: li
li
bucle: bgt
mul
addi
b
fin: move
jr
Estructura de Computadores
$s1, 1
#s1 para r
$s0, 1
#s0 para i
$s0, $a0, fin
$s1, $s1, $s0
$s0, $s0, 1
bucle
$v0, $s1 #resultado
$ra
261
Ejemplo
(4) Se analizan los registros que se modifican
262
int factorial(int x) {
int i;
int r=1;
for (i=1;i<=x;i++) {
r*=i;
}
return r;
}
factorial: li
li
bucle: bgt
mul
addi
b
fin: move
jr
$s1, 1
#s1 para r
$s0, 1
#s0 para i
$s0, $a0, fin
$s1, $s1, $s0
$s0, $s0, 1
bucle
$v0, $s1 #resultado
$ra
ARCOS-UC3M
Estructura de Computadores
262
Ejemplo
(5) Se guardan los registros en la pila
263
int factorial(int x) {
int i;
int r=1;
for (i=1;i<=x;i++) {
r*=i;
}
return r;
}
factorial: sub
sw
sw
li
li
bucle: bgt
mul
addi
b
fin: move
lw
lw
add
jr
$sp, $sp, 8
$s0, 4($sp)
$s1, ($sp)
$s1, 1
#s1 para r
$s0, 1
#s0 para i
$s0, $a0, fin
$s1, $s1, $s0
$s0, $s0, 1
bucle
$v0, $s1 #resultado
$s1, ($sp)
$s0, 4($sp)
$sp, $sp, 8
$ra
Estructura de Computadores
263
Ejemplo 2
264
int main()
{
int z;
z=f1(5, 2);
print_int(z);
}
int f2(int c)
{
int s;
s = c * c * c;
return s;
}
ARCOS-UC3M
Estructura de Computadores
264
Ejemplo 2. Invocacin
265
int main()
{
int z;
li
$a0, 5
li
$a1, 2
jal f1
move $a0, $v0
li
$v0, 1
syscall
z=f1(5, 2);
print_int(z);
#
#
#
#
primer argumento
segundo argumento
llamada
resultado
# llamada para
# imprimir un int
ARCOS-UC3M
Estructura de Computadores
265
Ejemplo 2. Cuerpo de f1
266
f1: add
move
jal
add
$a0, $a1
f2
$v0, $s0, $v0
jr
$ra
}
int f2(int c)
{
int s;
s = c * c * c;
return s;
}
ARCOS-UC3M
Estructura de Computadores
266
f1: add
move
jal
add
$a0, $a1
f2
$v0, $s0, $v0
jr
$ra
}
int f2(int c)
{
int s;
s = c * c * c;
return s;
}
ARCOS-UC3M
Estructura de Computadores
267
f1: sub
sw
sw
sw
$sp, $sp, 12
$s0, 8($sp)
$a0, 4($sp)
$ra, ($sp)
add
move
jal
add
$a0, $a1
f2
$v0, $s0, $v0
lw
lw
lw
add
jr
$ra, ($sp)
$a0, 4($sp)
$s0, 8($sp)
$sp, $sp, 12
$ra
ARCOS-UC3M
Estructura de Computadores
268
Ejemplo 2. Cuerpo de f2
269
int f2(int c)
{
int s;
s = c * c * c;
return s;
ARCOS-UC3M
Estructura de Computadores
269
Tipos de subrutinas
270
Subrutina terminal.
No invoca a ninguna otra subrutina.
Subrutina no terminal.
Invoca a alguna otra subrutina.
ARCOS-UC3M
Estructura de Computadores
270
Activacin de procedimientos
Marco de pila
El marco de pila es el mecanismo que utiliza el compilador
para activar los procedimientos (subrutinas)
El marco de pila lo construyen en la pila el procedimiento
llamante y el llamado
Su manipulacin se hace a travs de dos registros:
$sp: puntero de pila, que apunta siempre a la cima de la
pila
$fp: puntero de marco de pila, que marca la zona de la pila
que pertenece al procedimiento llamado
El registro marco de pila ($fp) se utiliza en el procedimiento
llamado para:
Acceder a los parmetros que se pasan en la pila
Acceder a las variables locales del procedimiento
ARCOS-UC3M
Estructura de Computadores
271
Marco de pila
El marco de pila almacena:
Los parmetros introducidos por el procedimiento
llamante en caso de ser necesarios
El registro marco de pila del procedimiento
llamante (antiguo $fp)
Los registros guardados por la funcin (incluyen al
registro $ra en caso de procedimientos no
terminales)
Variables locales
ARCOS-UC3M
Estructura de Computadores
272
Marco de pila
$sp
Direcciones bajas
Variables locales del
procedimiento llamado
Registros guardados
$fp
por el llamado
Crecimiento de la pila
$fp antiguo
Parmetros
del llamante
Direcciones altas
ARCOS-UC3M
Estructura de Computadores
273
Crecimiento
return (v[1]);
de la pila
$sp
Estructura de Computadores
Argumento n5
Argumento n6
Direcciones altas
274
$sp
v[0]
v[1]
v[2]
$fp
return (v[1]);
v[3]
Crecimiento
de la pila
$fp antiguo
Estructura de Computadores
Argumento n5
Argumento n6
Direcciones altas
275
$sp
v[0]
v[1]
v[2]
$fp
return (v[1]);
v[3]
Crecimiento
de la pila
$fp antiguo
Argumento n5
Argumento n6
Direcciones altas
ARCOS-UC3M
Estructura de Computadores
276
ARCOS-UC3M
Estructura de Computadores
277
Uso
Preservar el valor
$v0-$v1
Resultados
No
$a0..$a3
Argumentos
Si
$t0..$t9
Temporales
No
$s0..$s7
Salvados
Si
$sp
Puntero de pila
Si
$fp
Si
$ra
Direccin de retorno
si
ARCOS-UC3M
Estructura de Computadores
278
Subrutina llamada
ARCOS-UC3M
Estructura de Computadores
279
Salvaguarda de registros
Subrutina llamante
280
Registros $t
pila
funcion
lw $t1, 4($sp)
lw $t0, ($sp)
addu $sp, $sp, 8
ARCOS-UC3M
Estructura de Computadores
280
Paso de parmetros
Subrutina llamante
281
ARCOS-UC3M
Estructura de Computadores
281
Paso de 2 parmetros
Banco de registros
282
$a0
$a1
$a2
$a3
Registros $t
Parmetro 1
Parmetro 2
Parmetro 3
Parmetro 4
pila
li $a0, 5
li $a1, 8
// param 1
// param 2
jal func
addu $sp, $sp, 16
ARCOS-UC3M
Estructura de Computadores
282
Paso de 6 parmetros
Banco de registros
283
$a0
$a1
$a2
$a3
Parmetro 5
Parmetro 6
Parmetro 1
Parmetro 2
Parmetro 3
Parmetro 4
Registros $t
li
li
li
li
pila
$a0,
$a1,
$a2,
$a3,
5
8
7
9
//
//
//
//
param
param
param
param
1
2
3
4
ARCOS-UC3M
Estructura de Computadores
283
Llamada a subrutina
Subrutina llamante
284
ARCOS-UC3M
Estructura de Computadores
284
ARCOS-UC3M
Estructura de Computadores
285
Ejecucin de la subrutina
286
ARCOS-UC3M
Estructura de Computadores
286
Al final
287
Subrutina llamada:
Restauracin de valores guardados
Se restauran los valores que se guardaron
Subrutina llamante:
Se restauran los valores guardados en la pila
ARCOS-UC3M
Estructura de Computadores
287
Ejemplo: factorial
factorial(a=4)
(a < 2) ?
6 * 4
factorial(a=3)
(a < 2) ?
2 * 3
void main () {
int resultado ;
resultado=factorial(4) ;
factorial(a=2)
(a < 2) ?
1 * 2
factorial(a=1)
printf(f(4)=%d,resultado);
}
ARCOS-UC3M
(a < 2) ?
Estructura de Computadores
288
Ejemplo: factorial
Direcciones bajas
$sp
Direcciones altas
ARCOS-UC3M
Estructura de Computadores
289
Ejemplo: factorial
factorial:
Direcciones bajas
# frame stack
subu $sp $sp 12
sw
$ra 4($sp)
sw
$fp 8($sp)
addu $fp $sp 8
$sp
$fp
$ra
$fp (antiguo)
Direcciones altas
ARCOS-UC3M
Estructura de Computadores
290
Ejemplo: factorial
factorial:
Direcciones bajas
# frame stack
subu $sp $sp 12
sw
$ra 4($sp)
sw
$fp 8($sp)
addu $fp $sp 8
bge $a0 2 b_else
li $v0 1
b
b_efs
b_else: sw $a0 -8($fp)
addi $a0 $a0 -1
jal factorial
lw $v1 -8($fp)
mul $v0 $v0 $v1
$sp
$a0
$fp
$ra
$fp (antiguo)
Direcciones altas
ARCOS-UC3M
Estructura de Computadores
291
Ejemplo: factorial
factorial:
Direcciones bajas
# frame stack
subu $sp $sp 12
sw
$ra 4($sp)
sw
$fp 8($sp)
addu $fp $sp 8
bge $a0 2 b_else
li $v0 1
b
b_efs
b_else: sw $a0 -8($fp)
addi $a0 $a0 -1
jal factorial
lw $v1 -8($fp)
mul $v0 $v0 $v1
# end frame stack
b_efs: lw $ra 4($sp)
lw $fp ($fp)
addu $sp $sp 12
jr $ra
ARCOS-UC3M
$a0
$ra
$sp
$fp (antiguo)
Direcciones altas
Estructura de Computadores
292
Estructura de Computadores
293
Banco de registros
Hueco para $a0
Hueco para $a1
Hueco para $a2
Hueco para $a3
$a0
$a1
$a2
$a3
Parmetro 1
Parmetro 2
Parmetro 3
Parmetro 4
Registros $t
pila
ARCOS-UC3M
Estructura de Computadores
294
ARCOS-UC3M
Estructura de Computadores
295
Estructura de Computadores
296
Compilador
Programa en ensambaldor
Ensamblador
Objeto: mdulo en lenguaje mquina
Enlazador
Ejecutable: programa en lenguaje mquina
Cargador
ARCOS-UC3M
Estructura de Computadores
Memoria
297
Compilador
Entrada: lenguaje de alto nivel (C, C++, )
Salida: cdigo en lenguaje ensamblador
Puede contener pseudoinstrucciones
Una pseudoinstruccin es una instruccin que entiende el
ensamblador pero que no tiene correspondencia directa con
una instruccin en lenguaje mquina
move $t1, $t2 or $t1, $t2, $zero
ARCOS-UC3M
Estructura de Computadores
298
Ensamblador
Entrada: cdigo en lenguaje ensamblador
Salida: Cdigo objeto escrito en lenguaje mquina
En ensamblador convierte las pseudoinstrucciones a
instrucciones mquina
Analiza las sentencias en ensamblador de forma
independiente, sentencia a sentencia
El ensamblador produce un fichero objeto (.o)
ARCOS-UC3M
Estructura de Computadores
299
Estructura de Computadores
300
Estructura de Computadores
301
Enlazador
Entrada: ficheros en cdigo objeto
Salida: Cdigo ejecutable
Combina varios archivos objeto (.o) en un nico fichero
ejecutable
Resuelve todas las referencias (instrucciones de salto y
direcciones de datos)
En enlazador asume que la primera palabra del segmento de
texto est en la direccin 0x00000000
Permite la compilacin separada de ficheros
El cambio en un fichero no implica recompilar todo el
programa completo
Permite el uso de funciones de biblioteca (.a)
ARCOS-UC3M
Estructura de Computadores
302
Enlazador
.o file 1
text 1
data 1
info 1
Linker
.o file 2
text 2
data 2
info 2
ARCOS-UC3M
Estructura de Computadores
a.out
Relocated text 1
Relocated text 2
Relocated data 1
Relocated data 2
303
ARCOS-UC3M
Estructura de Computadores
304
Cargador
Lee un fichero ejecutable (a.out) y lo carga en memoria
Memoria
Principal
Sistema
Operativo
Disco
instrucciones
datos
Programa
en ejecucion
Fichero
ejecutable
pila
ARCOS-UC3M
Estructura de Computadores
305
Cargador
Forma parte del sistema operativo
Lee la cabecera del ejecutable para determinar el tamao de
los segmentos de texto y datos
Crea un nuevo espacio de direcciones en memoria para ubicar
el segmento de texto, datos y pila
Copia las instrucciones y los datos con valor inicial del fichero
ejecutable (disco) a memoria
Copia los argumentos que se pasan al programa en la pila
Inicializa los registros. Fija el PC y el SP a sus posiciones
ARCOS-UC3M
Estructura de Computadores
306
Bibliotecas
Una biblioteca es una coleccin de objetos normalmente
relacionados entre s
Los mdulos objetos de los programas pueden incluir
referencias a smbolos definidos en alguno de los objetos de
una biblioteca (funciones o variables exportadas)
Las bibliotecas del sistema son un conjunto de bibliotecas
predefinidas que ofrecen servicios a las aplicaciones
Tipos:
Bibliotecas estticas: se enlazan con los ficheros objeto para
producir un fichero ejecutable que incluye todas las
referencias resueltas. Un cambio en la biblioteca implica
volver a enlazar y generar el ejecutable
Bibliotecas dinmicas (DLL, dynamically linked library)
ARCOS-UC3M
Estructura de Computadores
307
Bibliotecas dinmicas
Las rutinas de las bibliotecas no se enlazan en el archivo
ejecutable y no se cargan hasta que el programa se ejecuta
El programa incluye informacin para la localizacin de las
bibliotecas y la actualizacin de las referencias externas
durante la ejecucin
Ventajas:
Da lugar a ejecutables ms pequeos.
Solo se carga de la biblioteca aquello que se utiliza durante
la ejecucin.
El cambio en una biblioteca no afecta al ejecutable. No se
necesita volver a generar un nuevo ejecutable.
ARCOS-UC3M
Estructura de Computadores
308
Ejemplo
C ASM bj Exe Ejecucin
Programa C: ejemplo.c
#include <stdio.h>
int main (int argc, char *argv[])
{
int i, sum = 0;
for (i = 1; i <= 10; i++)
sum = sum + i + i;
printf (La suma 1 + ... +10
es %d\n",
sum);
ARCOS-UC3M
Estructura de Computadores
309
Compilacin
.text
.align
2
.globl
main
main:
subu $sp,$sp,24
sw $ra, 20($sp)
sw $a0, 4($sp)
sw $a1, 8($sp)
li $t0, 0
li $t1, 0
bucle:
bgt $t0, 10, fin
add $t1, $t1, $t0
addi $t0, $t0, 1
b bucle
ARCOS-UC3M
fin:
la $a0, str
li $a1, $t1
jal printf
move $v0, $0
lw $ra, 20($sp)
lw $a0, 4($sp)
lw $a1, 8($sp)
addiu $sp,$sp,24
jr $ra
.data
.align
0
str:
.asciiz " La suma
1 + ... +10 es
%d\n "
Estructura de Computadores
310
Compilacin
.text
.align
2
.globl
main
main:
subu $sp,$sp,24
sw $ra, 20($sp)
sw $a0, 4($sp)
sw $a1, 8($sp)
li $t0, 0
li $t1, 0
bucle:
bgt $t0, 10, fin
add $t1, $t1, $t0
addi $t0, $t0, 1
b bucle
ARCOS-UC3M
fin:
la $a0, str
li $a1, $t1
jal printf
move $v0, $0
lw $ra, 20($sp)
lw $a0, 4($sp)
lw $a1, 8($sp)
addiu $sp,$sp,24
jr $ra
.data
7 pseudo.align
0
instructiones
str:
.asciiz " La suma
1 + ... +10 es
%d\n "
Estructura de Computadores
311
Compilacin
Eliminacin de pseudoinstrucciones
.text
.align
2
.globl
main
main:
addiu $29,$29,-24
sw $31, 20($29)
sw $4, 4($29)
sw $5, 8($29)
ori $8, $0, 0
ori $9, $0, 0
bucle:
slti $1, $8, 11
beq $1, $0, fin
add $9, $9, $8
addi $8, $8, 1
bgez $0, bucle
ARCOS-UC3M
fin:
lui $4, l.str
ori $4, $4, r.str
addu $4, $0, $9
jal printf
addu $2, $0, $0
lw $31, 20($29)
lw $4, 4($29)
lw $5, 8($29)
addiu $29,$29,24
jr $31
Estructura de Computadores
312
Compilacin
Asignacin de direcciones
00
04
08
0c
10
14
18
1c
20
24
28
addiu $29,$29,-24
sw
$31, 20($29)
sw
$4, 4($29)
sw $5, 8($29)
ori $8, $0, 0
ori $9, $0, 0
slti $1, $8, 11
beq $1, $0, fin
add $9, $9, $8
addi $8, $8, 1
bgez $0, bucle
ARCOS-UC3M
2c
30
34
38
3c
40
44
48
4c
50
Estructura de Computadores
313
Compilacin
Creacin de la tabla de smbolos y de reubicacin
Tabla de smbolos
Etiqueta
main:
bucle:
str:
Informacin de reubicacin
Direccn
tipo Instr.
0x0000002c
lui
0x00000030
ori
0x00000038
jal
ARCOS-UC3M
Estructura de Computadores
Dependencia
l.str
r.str
printf
314
Compilacin
Resolver etiquetas relativas a PC
00
04
08
0c
10
14
18
1c
20
24
28
addiu $29,$29,-24
sw
$31, 20($29)
sw
$4, 4($29)
sw $5, 8($29)
ori $8, $0, 0
ori $9, $0, 0
slti $1, $8, 11
beq $1, $0, 3
add $9, $9, $8
addi $8, $8, 1
bgez $0, -4
ARCOS-UC3M
2c
30
34
38
3c
40
44
48
4c
50
Estructura de Computadores
315
ARCOS-UC3M
00100111101111011111111111101000
10101111101111110000000000010100
10101111101001000000000000000100
10101111101001010000000000001000
10001101000000000000000000000000
10101101001000000000000000011100
00101000001010000000000000001011
00010000001000000000000000000011
00000001001010000100100000100000
00100001000010000000000000000001
00000100000000001111111111111100
00111100000001000000000000000000
00110100100001000000000000000000
00000001001001000000000000100001
00001100000000000000000000000000
00000000000000000001000001000001
10001111101111110000000000010100
10001111101001000000000000000100
10001111101001010000000000001000
00000011111000000000000000011000
00000000000000001110100000001000
Estructura de Computadores
316
Enlazado
Combinar ejemplo.o y libc.a
Crear las direcciones de memoria absolutas
Modificar y mezclar las tablas de smbolos y de reubicacin
Symbol Table
Label
main:
loop:
str:
printf:
Address
0x00000000
0x0000001c
0x10000430
0x000003b0
Relocation Information
Address
0x0000002c
0x00000030
0x00000038
ARCOS-UC3M
317
Enlazado
Resolver las direcciones
00
04
08
0c
10
14
18
1c
20
24
28
addiu $29,$29,-24
sw
$31, 20($29)
sw
$4, 4($29)
sw $5, 8($29)
ori $8, $0, 0
ori $9, $0, 0
slti $1, $8, 11
beq $1, $0, 3
add $9, $9, $8
addi $8, $8, 1
bgez $0, -4
ARCOS-UC3M
2c
30
34
38
3c
40
44
48
4c
50
Estructura de Computadores
318
Enlazado
Generacin del fichero ejecutable
nico segmento de texto
nico segmento de datos
Cabecera con informacin sobre las secciones
ARCOS-UC3M
Estructura de Computadores
319