Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Departamento de Informática
Grupo de Arquitectura de Computadores, Comunicaciones y Sistemas
UNIVERSIDAD CARLOS III DE MADRID
Contenido
Arquitectura simple.
Facilidadde
aprendizaje.
Ensamblador similar al de
otros procesadores RISC
Usado en diversos
dispositivos
4
ARCOS Estructura de Computadores 4
¿Qué es un computador?
datos resultados
Procesador
Instrucciones
001 AB 00000000101
Código de operación
Registros
Operandos Direcciones de memoria
Números
MAR PC RI
Lectura
MBR Memoria
PC PC + 1 MAR MBR
RI MBR
000100 0010000000000000
Ejecución de la instrucción
Volver a fetch
Memoria
temp = v[k];
00001001110001101010111101011000
10101111010110000000100111000110 v[k] = v[k+1];
11000110101011110101100000001001
v[k+1] = temp;
01011000000010011100011010101111
temp = v[k];
Lenguaje de alto nivel v[k] = v[k+1];
(ej: C, C++) v[k+1] = temp;
compilador
lw $t0, 0($2)
Lenguaje ensamblador lw $t1, 4($2)
sw $t1, 0($2)
(Ej: MIPS) sw $t0, 4($2)
Ensamblador
Lenguaje Máquina 0000 1001 1100 0110 1010 1111 0101 1000
1010 1111 0101 1000 0000 1001 1100 0110
(MIPS) 1100 0110 1010 1111 0101 1000 0000 1001
0101 1000 0000 1001 1100 0110 1010 1111
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)
De transferencia
Aritmética
Lógicas
De desplazamiento
De rotación
De comparación
De bifurcación
Registro a registro
move $a0 $t0 $a0 $t0
int a = 5; li $t0, 5
int b = 7; li $t1, 7
int c = 8; li $t2, 8
int d;
int a = 5; li $t0, 5
int b = 7; li $t1, 7
int c = 8; li $t2, 8
int d; li $t3 10
d=-(a*(b-10)+c)
sub $t1, $t1, $t3
add $t1, $t1, $t2
mul $t0, $t0, $t1
li $t1, -1
mul $t0, $t0, $t1
Operaciones booleanas
Ejemplos:
AND
1100
and $t0 $t1 $t2 ($t0 = $t1 && $t2)
1010
AND
OR 1000
NOT NOT 10
not $t0 $t1 ($t0 = ! $t1) 01
XOR 1100
1010
or $t0 $t1 $t2 ($t0 = $t1 ^ $t2) XOR
0110
li $t0, 5
li $t1, 8
¿Cuál es el valor de $t2?
and $t2, $t1, $t0
li $t0, 5
li $t1, 8
¿Cuál es el valor de $t2?
and $t2, $t1, $t0
000 …. 0101 $t0
000 ….. 1000 $t1
and 000 ….. 0000 $t2
De movimiento de bits
Ejemplos:
Desplazamiento lógico a la derecha 0
srl $t0 $t0 4 ($t0 = $t0 >> 4 bits) 01110110101
De movimiento de bits
Ejemplos:
Rotación a la izquierda
rol $t0 $t0 4 ($t0 = $t0 >> 4 bits)
01110110101
Rotación a la derecha
ror $t0 $t0 5 ($t0 = $t0 << 5 bits)
01110110101
int i;
li $t0 0
li $t1 10
i=0; while: bge $t0 t1 fin
while (i < 10)
# acción
{
/* acción */ addi $t0 $t0 1
i = i + 1 ; b while
} fin: ...
}
Calcular la suma 1 + 2 + 3 + …. + 10
i=0;
li $t0 0
s=0;
li $t1 0
while (i < 10)
li $t2 10
{
while: bge $t0 t2 fin
s = s + i;
add $t1 $t1 $t0
i = i + 1;
addi $t0 $t0 1
}
b while
}
fin: ...
Resultado en $t1
i = 0;
li $t0 0 #i
n = 45; #numero
li $t1 45 #n
s=0;
li $t2 32
while (i < 32)
li $t3 0 #s
{
while: bge $t0 t2 fin
b = ultimo bit de n
and $t4 $t1 1
s = s + b;
add $t3 $t3 $t4
se desplaza n un bit
srl $t1 $t1 1
a la derecha
addi $t0 $t0 1
i = i + 1 ;
b while
}
fin: ...
}
ARCOS Estructura de Computadores 32
Ejemplo
0
01110110101 Se desplaza a la derecha 16
Posiciones (de forma lógica)
int b1 = 4;
int b2 = 2; li $t0 4
li $t1 2
li $t2 8
if (b2 == 8) {
bneq $t0 $t2 fin
b1 = 0;
} li $t0 0
... fin: ...
li $t2 9
li $t1 2
rem $t1 $t2 $t1 # se obtiene el resto
beq $t1 $0 then # cond.
else: li $t1 0
b fin # incond.
then: li $t1 1
fin: ...
a=8 li $t0 8
n=4; li $t1 4
i=0; li $t2 1
p = 1; li $t4 0
while (i < n) while: bge $t4 $t1 fin
{ mul $t2 $t2 $t0
p = p * a addi $t4 $t4 1
i = i + 1 ; b while
} fin: move $t2 $t4
}
http://pages.cs.wisc.edu/~larus/spim.html
SPIM es un simulador de una
arquitectura MIPS
Aplicación multiplataforma:
Linux
Windows
MacOS
Permite simular una
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)
0 Hay 32 registros 16
1 4 bytes de tamaño 17
2 18
(una palabra)
3 19
Se nombran con
4 20
5
un $ al principio 21
6 22
7 Convenio de uso 23
8 Reservados 24
9 Argumentos 25
10 Resultados 26
11 Temporales 27
12 Punteros 28
13 29
14 30
15 31
0 $zero 16
1 17
2 18
3 19
4 20
5 Valor cableado a cero 21
6 22
7 No puede modificarse 23
8 24
9 25
10 26
11 27
12 28
13 29
14 30
15 31
0 $zero 16
1 17
2 Valores temporales 18
3 19
4 20
5 21
6 22
7 23
8 $t0 $t8 24
9 $t1 $t9 25
10 $t2 26
11 $t3 27
12 $t4 28
13 $t5 29
14 $t6 30
15 $t7 31
0 $zero $s0 16
1 $s1 17
2 Valores guardados $s2 18
3 $s3 19
4 $s4 20
5 $s5 21
6 $s6 22
7 $s7 23
8 $t0 $t8 24
9 $t1 $t9 25
10 $t2 26
11 $t3 27
12 $t4 28
13 $t5 29
14 $t6 30
15 $t7 31
0 $zero $s0 16
1 $s1 17
2 $v0 $s2 18
3 $v1 $s3 19
4 $a0 $s4 20
5 $a1 $s5 21
6 $a2 $s6 22
7 $a3 $s7 23
8 $t0 $t8 24
9 $t1 $t9 25
10 $t2 26
11 $t3 27
12 $t4 Paso de parámetros y 28
13 $t5 Gestión de subrutinas $sp 29
14 $t6 $fp 30
15 $t7 $ra 31
0 $zero $s0 16
1 $at $s1 17
2 $v0 $s2 18
3 $v1 $s3 19
4 $a0 $s4 20
5 $a1 $s5 21
6 $a2 $s6 22
7 $a3 $s7 23
8 $t0 $t8 24
9 $t1 $t9 25
10 $t2 $k0 26
11 $t3 $k1 27
12 $t4 Otros $gp 28
13 $t5 $sp 29
14 $t6 $fp 30
15 $t7 $ra 31
Hay 4 GB de memoria
direccionables en total
Otra parte de la
memoria está reservada:
Un mini-sistema
operativo reside en
los primeros 4 MB
de memoria
Segmento de Datos
pc
Segmento de Texto 01011001
Segmento
de código
Segmento
de datos
Segmento
de pila
Otros
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
instrucción/pseudoinstrucción
etiqueta: 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
hola.s
.data
msg_hola: .asciiz "hola mundo\n"
.text
.globl main
main:
# printf("hola mundo\n") ;
li $v0 4 #código de llamada
la $a0 msg_hola
syscall
Invocación:
Código de servicio en $v0.
Otros parámetros en registros concretos.
Invocación mediante instrucción syscall.
2n-1
Dirección: 0x0F000002
0x0F000000
0x0F000001 Contenido: 00001101 (9)
0x0F000002 00001101
0x0F000003
2n-1
2n-4
$t1
31 24 23 16 15 87 0
2n-1
2n-1
$t1
31 24 23 16 15 87 0
2n-1
2n-1
$t1
31 24 23 16 15 87 0
2n-1
2n-1
$t1
31 24 23 16 15 87 0
$t1
31 24 23 16 15 87 0
$t1
31 24 23 16 15 87 0
Se transfiere al
procesador
5 3 2 7
$t1
31 24 23 16 15 87 0
5 3 2 7
$t1 0 0 0 3
31 24 23 16 15 87 0
0
1
2 Palabra almacenada a partir del byte 0
3
4
5
6 Palabra almacenada a partir del byte 4
7
8
2n-1
2n-1
A byte0 A byte3
A+1 byte1 A+1 byte2
A+2 byte2 A+2 byte1
A+3 byte3 A+3 byte0
BigEndian LittleEndian
A 00000000 A 00011011
A+1 00000000 A+1 00000000
A+2 00000000 A+2 00000000
A+3 00011011 A+3 00000000
BigEndian LittleEndian
Byte
0
1
2
3 Dirección 4 (000110)
4 00000000
5 00000000
Contenido: 00000000000000000000000100001101(2 = 269(10
6 00000001 Computador BigEndian
7 00001101
$t1
31 24 23 16 15 87 0
$t1
31 24 23 16 15 87 0
$t1
31 24 23 16 15 87 0
Se transfiere al
procesador
00000000 00000000 00000001 00001101
$t1
31 24 23 16 15 87 0
Se copia la palabra
0x0F000000 0xCB
0x0F000001 0x12
0x0F000002 0x08
0x0F000003 0x02
0x0F000000 0xCB
0x0F000001 0x12
0x0F000002 0x08
0x0F000003 0x02
Se copia la palabra
0x0F000000 0xCB
0x0F000001 0x12
0x0F000002 0x08
0x0F000003 0x02
Se copia el byte
Se copia la dirección,
no el contenido
0x0F000000 0xCB
0x0F000001 0x12
0x0F000002 0x08
0x0F000003 0x02
Direcciones Byte
de bytes (contenido) li $t1, 18
li $t2, 24
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0x0F000004
0x0F000005
0x0F000006
0x0F000007
Direcciones Byte
de bytes (contenido) li $t1, 18
li $t2, 24
0x0F000000
0x0F000001
0x0F000002
0x0F000003
0x0F000004
0x0F000005
0x0F000006
0x0F000007
$t1 00000000 00000000 00000000 00010010
31 24 23 16 15 87 0
Direcciones Byte
de bytes (contenido) sw $t1, 0x0F000000
0x0F000000 00000000
0x0F000001 00000000
0x0F000002 00000000
0x0F000003 00010000
0x0F000004
0x0F000005
0x0F000006
0x0F000007
$t1 00000000 00000000 00000000 00010010
31 24 23 16 15 87 0
Direcciones Byte
de bytes (contenido) sw $t1, 0x0F000000
sw $t2, 0x0F000004
0x0F000000 00000000
0x0F000001 00000000
0x0F000002 00000000
0x0F000003 00010000
0x0F000004 00000000
0x0F000005 00000000
0x0F000006 00000000
0x0F000007 00011000
$t1 00000000 00000000 00000000 00010010
31 24 23 16 15 87 0
Direcciones Byte
de bytes (contenido) lw $t3, 0x0F000000
0x0F000000 00000000
0x0F000001 00000000
0x0F000002 00000000
0x0F000003 00010000
0x0F000004 00000000
0x0F000005 00000000
0x0F000006 00000000
0x0F000007 00011000
$t1 00000000 00000000 00000000 00010010
31 24 23 16 15 87 0
dirección
31 23 15 7 0
0 Esta palabra está alineada, el resto no
4
8
12
16
20
24
En general:
Un dato que ocupa K bytes está alineado cuando la
dirección D utilizada para accederlo cumple que:
D mod K = 0
La alineación supone que:
Los datos que ocupan 2 bytes se encuentran en direcciones
pares
Los datos que ocupan 4 bytes se encuentran en direcciones
múltiplo de 4
Los datos que ocupan 8 bytes (double) se encuentran en
direcciones múltiplo de 8
La pseudoinstrucción move
move reg2,reg1
Se convierte en:
add reg2,$zero,reg1
Direcciones Byte
de bytes (contenido)
0x0F000000 0xCB
0x0F000001 0x12
0x0F000002 0x08
0x0F000003 0x02
$t0
31 24 23 16 15 87 0
$t1
31 24 23 16 15 87 0
Direcciones Byte
de bytes (contenido) la $t0, 0x0F000002
0x0F000000 0xCB
0x0F000001 0x12
0x0F000002 0x08
0x0F000003 0x02
$t0
31 24 23 16 15 87 0
$t1
31 24 23 16 15 87 0
Direcciones Byte
de bytes (contenido) la $t0, 0x0F000002
Se copia la dirección,
0x0F000000 0xCB
0x0F000001 0x12 no el contenido
0x0F000002 0x08
0x0F000003 0x02
$t1
31 24 23 16 15 87 0
Direcciones Byte
de bytes (contenido) lbu $t0, ($t1)
0x0F000000 0xCB
0x0F000001 0x12
0x0F000002 0x08
0x0F000003 0x02
$t1
31 24 23 16 15 87 0
Direcciones Byte
de bytes (contenido) lbu $t0, ($t1)
Direcciones Byte
de bytes (contenido) lw $t0, ($t1)
sw $t0, 0x0F000000
Copia la palabra almacenada en $t0 en la dirección
0x0F000000
sb $t0, 0x0F000000
Copia la byte almacenada en $t0 en la dirección
0x0F000000
main () .text
{ .globl main
v[4] = 8;
main: la $t1 vec
li $t2 8
} sw $t2 16($t1)
...
main () .text
{ .globl main
v[4] = 8;
main: li $t0 16
la $t1 vec
} add $t3, $t1, $t0
li $t2 8
sw $t2, ($t3)
...
En general:
lw $t0, 4($s3) # $t0 M[$s3+4]
sw $t0, 4($s3) # M[$s3+4] $t0
int vec[100] ;
...
main ()
{
int i = 0;
int vec[100] ;
...
main ()
{
int i = 0;
suma = 0;
ALU
BUS
U.C
ALU ALU
BUS BUS
U.C
ALU ALU
BUS BUS
BUS BUS
Se divide en campos:
Operación a realizar
Operandos a utilizar
Puede haber operando implícitos
Operandos a utilizar
Ubicación de los operandos
Ubicación del resultado
Ubicación de la siguiente instrucción (si op. salto)
Implícito: PC PC + ‘4’ (apuntar a la siguiente
instrucción)
Explícito: j 0x01004 (modifica el PC)
En la propia instrucción
En los registros del procesador
En memoria principal
En unidades de Entrada/Salida (I/O)
Ejemplo:
li $a0 25
addi $t1 $t2 50
op rs rt 16 bits
Operando
B.Reg.
Ventajas:
Acceso a registros es rápido
El número de registros es pequeño => pocos bits para
sucodificación, instrucciones más cortas
ARCOS Estructura de Computadores 144
Direccionamiento directo
Operando
op rs rt 16 bits
Problemas:
Acceso a memoria es lento comparado con los registros
Direcciones largas => instrucciones más largas
op rs rt 16 bits
Ventajas:
Instrucciones cortas
op direccion1
Problemas:
Puede requerir varios accesos a memoria
Es más lento
Instrucción
Codop Registro R Desplazamiento
Memoria
Registros
.data
Se carga en el registro .align 2 #siguiente dato alineado a 4
la dirección de inicio vec: .space 20 #5 elem.*4 bytes
del vector
.text
int vec[5] ; .globl main
... main: la $t1 vec
li $t2 8
main () sw $t2 16($t1)
{ ...
v[4] = 8;
Memoria
Registros
Índice/desplazamiento + Operando
.data
Se carga en el registro .align 2 #siguiente dato alineado a 4
la dirección de inicio vec: .space 20 #5 elem.*4 bytes
del vector
.text
int vec[5] ; .globl main
... main: li $t1 12
li $t2 8
main () sw $t2 vec($t1)
{ addi $t1 $t1 4
v[3] = 8; sw $t2 vec($t1)
v[4] = 8;
...
Instrucción
Codop desplazamiento
PC +
Si se cumple la condición
PC = PC + (etiqueta* 4)
Por tanto en:
bucle: beq $t0,$1, fin
add $t8,$t4,$4t4
addi $t0,$0,-1
j bucle
fin:
fin == 3
fin representa la
dirección donde se li $t0 8
encuentra la instrucción li $t1 4
li $t2 1
move
li $t4 0
while: bge $t4 $t1 fin
mul $t2 $t2 $t0
addi $t4 $t4 1
b while
fin: move $t2 $t4
Instrucción j direccion
op. direccion
6 bits 26 bits
Instrucción b desplazamiento
op. desplazamiento
6 bits 5 bits 5 bits 16 bits
op rs 16 bits
Ventajas
Es rápido: no es necesario acceder a memoria.
Instrucciones más cortas
dato $sp
cima $sp cima
Direccionamientos:
Inmediato valor
De registro $r
Directo dir
Indirecto de registro ($r)
Relativo a registro desplazamiento($r)
Relativo a PC beq etiqueta
Relativo a pila desplazamiento($sp)
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.
¿Cómo se sabe la longitud de la instrucción? Cod. Op.
IA32 (Procesadores Intel): Número variable de bytes.
6 5 5 5 5 6
CO rs rt rd sa func
CO rs rt Dato inmediato
MIPS Instruction:
add $8,$9,$10
Formato a utilizar:
6 5 5 5 5 6
CO rs rt rd sa func
0 9 10 8 0 32
Representación binaria de cada campo
MIPS Instruction:
addi $21,$22,-50
Formato a utilizar:
6 5 5 16
CO rs rt Dato inmediato
8 22 21 -50
Representación binaria de cada campo
001000 10110 10101 1111111111001110
Tamaño fijo:
n bits 2n códigos de operación.
m códigos de operación log2m bits.
Campos de extensión
MIPS (instrucciones aritméticas-lógicas)
Tipo R op. rs rt rd shamt func.
aritméticas
Tamaño variable:
Instrucciones más frecuentes = Tamaños más cortos.
Se pide:
Indicar el formato de la instrucción ADDx R1 R2 R3, donde
R1, R2 y R3 son registros.
16 bits
16 bits
6 bits
Código de
operación
16 bits
6 bits 3 bits 3 bits 3 bits
Código de Operandos
operación (3 registros)
16 bits
6 bits 3 bits 3 bits 3 bits 1 bit
Código de Operandos
operación (3 registros)
0 direcciones Pila.
1 dirección Registro acumulador
2 direcciones Registros, Registro-Memoria, Memoria-
Memoria.
3 direcciones Registros, Registro-Memoria, Memoria-
Memoria
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
Híbrido.
ADD .R0, /DIR1, /DIR2
ADD .R0, .R1, /DIR1
X = A + B * C
/DA A
/DB B
/DC C
Modelo de ejecución
/DX X
0 accesos a registro
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
Híbrido.
ADD .R0, /DIR1 (R0 <- R0 + MP[DIR1])
0 accesos a registro
4 accesos a registro
0 accesos a registro
PUSH 5
PUSH 7
ADD
POP /DX
7
5 12
Información:
Operación a realizar.
Operandos.
Resultado.
Ubicación de siguiente instrucción.
Parte de la información puede ser implícita.
int main() {
int factorial(int x) {
int z;
int i;
z=factorial(x);
int r=1;
print_int(z);
for (i=1;i<=x;i++) {
}
r*=i;
}
return r;
}
factorial:
… jr $ra
jal factorial
…
0x00401000
…
0x00001000 jal 0x00401000 jr $ra
0x00001004 …
$ra = PC = 0x00001004
PC = 0x00401000
0x00401000
…
0x00001000 jal 0x00401000 jr $ra
0x00001004 …
$ra = 0x00001004
0x00401000
…
0x00001000 jal 0x00401000 jr $ra
0x00001004 …
PC = $ra = 0x00001004
$ra = 0x00001004
0x00401000
…
0x00001000 jal 0x00401000 jr $ra
0x00001004 …
PC = $ra = 0x00001004
0x00401000
…
0x00001000 jal 0x00401000 jr $ra
0x00001004 …
jr $ra
$ra = PC = 0x00001004
PC = 0x00401000
0x00401000
0x00008000
0x00401020 jal 0x000080000
0x00401024
…
0x00001000 jal 0x00401000 jr $ra
0x00001004 …
jr $ra
$ra = PC = 0x00401024
PC = 0x00008000
0x00401000
0x00008000
0x00401020 jal 0x000080000
0x00401024
…
0x00001000 jal 0x00401000 jr $ra
0x00001004 …
jr $ra
PC = $ra = 0x00401024
0x00401000
0x00008000
0x00401020 jal 0x000080000
0x00401024
…
0x00001000 jal 0x00401000 jr $ra
0x00001004 …
jr $ra
?
PC = $ra = 0x00401024
0x00401000
0x00008000
0x00401020 jal 0x000080000
0x00401024
…
0x00001000 jal 0x00401000 jr $ra
0x00001004 …
jr $ra
?
PC = $ra = 0x00401024
Memoria
Principal
Sistema Disco
Operativo
instrucciones
datos
Programa
en ejecucion
Fichero
pila
ejecutable
memoria
El programa de usuario se divide
pc en segmentos
Segmento de Texto 01011001 Segmento de pila
Variables locales
Segmento de Datos Contexto de funciones
Segmento de datos
Datos estáticos, variables
$sp globales
01011001 Segmento de código (texto)
Código, instrucciones máquina
Segmento de Pila
dato $sp
cima $sp cima
push $a0
push $t1
push $t2
push $s2
...
pop $s2
pop $t2
pop $t1
pop $a0
...
lw $s2 ($sp)
pop $s2
add $sp $sp 4
pop $t2
lw $s2 ($sp)
pop $t1
add $sp $sp 4
pop $a0
lw $s2 ($sp)
add $sp $sp 4
lw $s2 ($sp)
add $sp $sp 4
... ...
lw $s2 ($sp)
pop $s2
lw $t2 4($sp)
pop $t2
pop $t1 lw $t1 8($sp)
pop $a0 lw $a0 12($sp)
add $sp $sp 16
int main() {
int factorial(int x) {
int z;
int i;
z=factorial(5);
int r=1;
print_int(z);
for (i=1;i<=x;i++) {
.
r*=i;
.
}
.
return r;
}
}
En la llamada z=factorial(5);
Un parámetro de entrada: en $a0
Un resultado en $v0
s = c * c * c;
return s;
}
int f2(int c)
{
int s;
s = c * c * c;
return s;
}
s = c * c * c;
return s;
}
r = a + a + f2(b);
return r; f2: mul $t0, $a0, $a0
} mul $t0, $t0, $a0
jr $ra
int f2(int c)
{
int s;
La función f2 no modifica el registro $ra porque no
llama a ninguna otra función
s = c * c * c; El registro $t0 no es necesario guardarlo porque no se ha
return s; de preservar su valor
}
Subrutina terminal.
No invoca a ninguna otra subrutina.
Subrutina no terminal.
Invoca a alguna otra subrutina.
Si la rutina es terminal
se pueden ahorrar pasos
Banco de registros
Registros $t
pila
Banco de registros
Registros $t
pila
Parámetros
$t
pila
ARCOS Estructura de Computadores 244
Salvaguarda de registros
245
Sección de parámetros.
Sección de registro de retorno.
Sección de registros preservados.
Sección de relleno.
Sección de almacenamiento local.
int func(int x1, int x2, int x3, int x4, char c) {/*..*/}
int main(int argc, char** argv) {
int x,y=1,z=2,k=3,j=4;
char c=‘a’;
x=func(y,z,k,j,c); Sección parámetros: 5 palabras
return 0;
}
Protocolo:
Al entrar en la subrutina se guarda el registro $ra.
Al salir de la subrutina se restaura el registro $ra.
Se usa para:
Variables locales que necesiten almacenarse en memoria
Reglas:
El tamaño de la sección debe ser múltiplo de 8 bytes.
Organización de la sección es responsabilidad de la subrutina.
La sección solamente se usa por la subrutina.
El acceso a las variables locales almacenadas en la pila se hace
utilizando el registro $sp como registro base
Marco de pila:
4 huecos para parámetros $a.
Registro de retorno.
¿Qué salvar?
Al menos $ra y $a0
Relleno $sp
$ra
Cuerpo Hueco $a3
Hueco $a2
Hueco $a1
$a0
lw $ra, 4($sp)
lw $a0, 20($sp) pila
add $sp, $sp, 24
El puntero de pila apunta al
último elemento de la pila