. - Arcos

Anuncio
Universidad Carlos III de Madrid
Ingeniería Informática
Estructura de Computadores
Práctica 1:
Programación en ensamblador
Contenidos
• Prácticas con SPIM:
– Programa, documentación y enunciados.
• Linux/Windows:
– Entrar, salir, password y correo.
• MIPS:
– Bloques, registros, memoria, ensamblador.
• SPIM:
– Uso del simulador.
• Ideas de diseño de programas:
– Tipos datos básicos, estructuras de control, funciones.
http://arcos.inf.uc3m.es/~ii_ec
2
Prácticas con SPIM (1)
– Asignatura:
• http://www.arcos.inf.uc3m.es/~ii_ec/
– Programa y documentación.
• http://www.arcos.inf.uc3m.es/~ii_ec/descripcion.html
#materiales
– Enunciado de las prácticas.
• http://www.arcos.inf.uc3m.es/~ii_ec/descripcion.html
#practicas
http://arcos.inf.uc3m.es/~ii_ec
3
Prácticas con SPIM (y 2)
– Para mandar correo:
• Dudas generales (normas, etc.):
– mail [email protected]
• Dudas sobre organización clases prácticas:
– {fjblas,lmsan,acaldero,moises}@arcos.inf.uc3m.es
• Dudas de la práctica
– FORO ->
http://apps.lab.inf.uc3m.es/foro/viewforum.php?f=8&sid=0
150272723b6719bbedcaf2b769b1a26
http://arcos.inf.uc3m.es/~ii_ec
4
Linux
• Consultar el procedimiento de apertura de
cuentas en:
– http://www.lab.inf.uc3m.es/
• Estar atentos a los avisos del laboratorio los
cuales se publican en los tablones de las
aulas y en la Web:
– http://www.lab.inf.uc3m.es/
http://arcos.inf.uc3m.es/~ii_ec
5
MIPS: introducción
• Características del MIPS R2000 / R3000:
– Procesadores de 32 bits.
– Arquitectura RISC.
– Hay 32 registros de 32 bits.
• Se utilizará un simulador basado en MIPS
R2000 / R3000:
– SPIM.
– Versiones para Windows, DOS y Linux.
http://arcos.inf.uc3m.es/~ii_ec
6
MIPS: Diagrama de bloques
http://arcos.inf.uc3m.es/~ii_ec
7
MIPS: Registros
• Hay 32 registros de 32 bits.
NOMBRE
REGISTRO
zero
at
v0, v1
a0, ..., a3
t0, ..., t7
s0, ..., s7
t8, t9
k0, k1
gp
sp
fp
ra
NÚMERO USO
0
1
2, 3
4, ...,7
8, ..., 15
16, ..., 23
24, 25
26, 27
28
29
30
31
Constante 0
Reservado para el ensamblador
Evaluación de expresión y resultado de una rutina
Argumento de entrada para rutinas
Temporal (NO se conserva contenido entre llamadas)
Temporal (se conserva contenido entre llamadas)
Temporal (NO se conserva contenido entre llamadas)
Reservado por el nucleo del sistema operativo.
Puntero al area global
Puntero a pila
Puntero a marco de pila
Direcciòn de retorno (usado en llamada de rutina)
http://arcos.inf.uc3m.es/~ii_ec
8
MIPS: memoria
• Datos estáticos, dinámicos y pila.
Segmento de pila
0x7FFFFFFF
Segmento de datos
0x10000000
Segmento de código
0x00400000
Reservado
0x00000000
http://arcos.inf.uc3m.es/~ii_ec
9
MIPS: Ensamblador
Etiqueta:
código instrucción,
pseudo instr. ó directiva
operandos
# esto es un comentario hasta fin de línea
.data
item: .word 1
.text
.globl main
main: lw st0, item
http://arcos.inf.uc3m.es/~ii_ec
10
MIPS: Ensamblador
• Directivas de preproceso:
DIRECTIVAS
.data
.text
.ascii “tira de caracteres”
.asciiz “tira de caracteres”
.byte
1, 2, 3
.half
300, 301, 302
.word 80000, 80001
.float
1.23, 2.13
.double 3.0e21
.space 10
.extern etiqueta n
.globl etiqueta
.align n
USO
Los elementos siguientes se almacenan en segmento de
datos.
Los elementos siguientes se almacenan en segmento de
código (texto).
Almacena cadena caracteres NO terminada en carácter nulo.
Almacena cadena caracteres terminada en carácter nulo.
Almacena bytes en memoria, consecutivamente.
Almacena medias palabras en memoria, consecutivamente.
Almacena palabras en memoria, consecutivamente.
Almacena float en memoria, consecutivamente.
Almacena double en memoria, consecutivamente.
Reserva un espacio de 10 bytes en el segmento actual.
Declara que etiqueta es global de tamaño n.
Declara etiqueta como global.
Alinea el siguiente dato en un límite de 2^n.
http://arcos.inf.uc3m.es/~ii_ec
11
MIPS: Ensamblador
• Tipos de instrucciones:
– Aritméticas y lógicas
• add Rd, R1, R2 # add, addi, addu, addiu
– Comparación
• seq Rd, R1, R2 # seq, sge, sgt, sle, slt, slti, ...
– Carga y almacenamiento
• la Rd label # la, lb, lbu, lh, lw, sb, sh, sw
– Salto condicional e incondicional
• beq R1, R2, label # beqz, bge, bgt, ble, ...
– Manejo excepciones / interrupciones
• rfe, nop, break n, syscall.
– etc.
http://arcos.inf.uc3m.es/~ii_ec
12
MIPS: Ensamblador
• Llamadas al sistema:
http://arcos.inf.uc3m.es/~ii_ec
13
MIPS: Ensamblador
• Modos de direccionamiento:
FORMATO
(registro)
Valor
Valor (registro)
Identificador
Identificador +/- valor
Identificador (registro)
Identificador +/- valor(registro)
CÁLCULO DE LA DIRECCIÓN
Contenido del registro (cr)
Valor inmediato (vin)
Vin + cr
Dirección del identificador (did)
Did +/- vin
Did + vin
Did +/- vin + cr
http://arcos.inf.uc3m.es/~ii_ec
EJEMPLO
Lw $t0, ($t2)
Lw $t0, 0x10010008
Lw $t0, 0x10010000($t1)
Lw $t0, array
Lw $t0, array+8
Lw $t0, array($t1)
Lw $t0, array+4($t1)
14
SPIM
Editor
SPIM
hola.s
Emulador
memoria
USUARIO
Ensamblador
hola
Llamadas al sistema
Depurador
http://arcos.inf.uc3m.es/~ii_ec
CPU MIPS 2000
15
SPIM
• Ejecutar simulador: xspim o spim.
–
–
–
–
–
–
–
–
–
–
–
help -- ayuda
load "FILE" -- leer programa en memoria.
print $N -- muestra el contenido del registro N.
print ADDR -- muestra el contenido de la memoria en la dirección ADDR.
breakpoint <ADDR> -- indica un punto de parada de ejecución.
delete <ADDR> -- borra todos los puntos de parada.
list -- lista los puntos de parada.
run -- comenzar a ejecutar el programa.
continue -- continuar la ejecución del programa.
step <N> -- ejecutar N instrucciones
exit -- salir del simulador.
http://arcos.inf.uc3m.es/~ii_ec
16
SPIM
http://arcos.inf.uc3m.es/~ii_ec
17
PC Spim
http://arcos.inf.uc3m.es/~ii_ec
18
SPIM
hola.s
.data
msg_hola: .asciiz "hola mundo\n"
.text
.globl main
main:
# printf("hola mundo\n") ;
li $2 4
la $4 msg_hola
syscall
http://arcos.inf.uc3m.es/~ii_ec
19
SPIM
• spim / xspim
hola.s con instrucciones
–
–
–
–
load ”hola.s"
breakpoint main
continue
step 1
[0x0040002c]
[0x00400030]
[0x00400034]
[0x00400038]
hola mundo
hola.s con pseudo-instrucciones
0x34020004
0x3c011001
0x3424000c
0x0000000c
ori $2, $0, 4
lui $1, 4097 [msg_hola]
ori $4, $1, 12 [msg_hola]
syscall
; 8: li $2 4
; 9: la $4 msg_hola
; 10: syscall
– exit
salir del simulador.
http://arcos.inf.uc3m.es/~ii_ec
20
Ideas de diseño para SPIM :
Tipos datos básicos (enteros)
.data
resultado: .space 4 # 4 bytes
op1:
.word 100
op2:
.word -10
...
var
integer resultado ;
integer op1 = 100 ;
integer op2 = -10 ;
...
.text
begin
resultado := op1 + op2 ;
...
End.
.globl main
main: lw $t1 op1
lw $t2 op2
add $t3 $t1 $t2
la $t4 resultado
sw $t3 ($t4)
...
http://arcos.inf.uc3m.es/~ii_ec
21
Ideas de diseño para SPIM :
Tipos datos básicos (vectores)
var
vec: array [1..5] of
integer;
mat: array [1..2,1..3] of
integer := [[11, 12, 13],
[21, 22, 23]];
...
begin
m[1][2] := m[1][1] +
m[1][2] ;
...
End.
.data
vec: .space 20
#5 elem.*4 bytes
mat: .word 11, 12, 13
.word 21, 22, 23
...
.text
.globl main
main:
lw $t1 mat+0
lw $t2 mat+12
add $t3 $t1 $t2
sw $t3 mat+4
...
http://arcos.inf.uc3m.es/~ii_ec
22
Ideas de diseño para SPIM :
Tipos datos básicos (string)
var
c1: char ;
c2: char := ‘h’ ;
ac1: string := “hola” ;
...
begin
write(ac1) ;
...
End.
.data
c1: .space 1
# 1 byte
c2: .byte ‘h’
ac1: .asciiz “hola”
...
.text
.globl main
main: li $v0 4
la $a0 ac1
syscall
...
http://arcos.inf.uc3m.es/~ii_ec
23
Ideas de diseño para SPIM :
Tipos datos básicos (boolean)
var
b1: boolean;
b2: boolean := false ;
...
.data
b1: .space 4
b2: .word 0
...
# 4 bytes
.text
begin
if (b1 = true) then
begin
b1 := true ;
end;
...
End.
.globl main
main:
if_1: la $t0 b2
beq $t0 $0 fi_1
la $t0 b1
li $t1 1
sb $t1 ($t0)
fi_1: ...
http://arcos.inf.uc3m.es/~ii_ec
24
Ideas de diseño para SPIM :
Estructuras de control (if)
if (a < b) then
begin
{ acción 1 }
End;
else
begin
{ acción 2 }
if_2: lw
lw
slt
beq
$t1
$t2
$t0
$t0
a
b
$t1 $t2
$0 else_2
then_2: ...
# acción 1
b fi_2
End;
else_2: ...
# acción 2
fi_2: ...
http://arcos.inf.uc3m.es/~ii_ec
25
Ideas de diseño para SPIM :
Estructuras de control (switch)
case (i) of
begin
10:
begin
{acción 1}
end;
...
case_1:
else:
begin
{acción por defecto}
end;
End;
lw $t1 i
li $t2 10
beq $t1 $t2 case_1_1
...
b default_1
case_1_1: ...
# acción 1
b esac_1
default_1: ...
# acción por defecto
esac_1: ...
http://arcos.inf.uc3m.es/~ii_ec
26
Ideas de diseño para SPIM :
Estructuras de control (repeat until)
var
vec: array[0..3] of
integer := [1,2,3,0] ;
i: integer;
Begin
i:=0;
repeat
{ acción }
...
i := i + 1 ;
until (vec[i] = 0) ;
End.
.data
vec: .word 1,2,3,0
...
.text
.globl main
main: move $t0 $0
do_1: # acción
addu $t0 $t0 4
lw
$t1 vec($t0)
beq $t1 $0 od_1
b do_1
od_1: ...
http://arcos.inf.uc3m.es/~ii_ec
27
Ideas de diseño para SPIM :
Estructuras de control (while)
var
vec: array[0..3] of integer
:= [1,2,3,0] ;
i: integer;
begin
i:=0;
while (vec[i] <> 0) do
begin
/* acción */
...
i := i + 1 ;
end;
End.
.data
vec: .word 1,2,3,0
...
.text
.globl main
main:
move $t0 $0
while_1: lw $t1 vec($t0)
beq $t1 $0 done_1
# acción
addu $t0 $t0 4
b while_1
done_1: ...
http://arcos.inf.uc3m.es/~ii_ec
28
Ideas de diseño para SPIM :
Funciones (Marco de pila)
• El marco de pila es una zona de memoria
reservada dentro de la pila, para almacenar datos
temporales de una función, como son:
– Los registros que no quiera o deba modificar.
– Las variables locales de la función.
• El marco de pila es imprescindible si se quiere
realizar funciones recursivas.
• La creación y el uso del marco de pila debe seguir
un estricto convenio.
http://arcos.inf.uc3m.es/~ii_ec
29
Ideas de diseño para SPIM :
Funciones (paso parámetros)
• La función llamante antes de llamar debe:
– Guardar los registros $a0..$a3 y $t0..$t9 que no quiera
ver modificados en su marco de pila.
– Pasar los argumentos en los registros $a0..$a3
Si hay mas deben colocarse en la pila justo al principio
para que queden justo antes del marco de pila de la
función llamada.
– Ejecutar la instrucción jal para realizar la llamada, la
cual guarda la dirección de retorno en el registro $ra
http://arcos.inf.uc3m.es/~ii_ec
30
Ideas de diseño para SPIM :
Funciones (paso parámetros)
• La función llamada al empezar debe:
– Reservar espacio para su marco de pila restando el
tamaño correspondiente al registro $sp.
– Guardar los registros $s0..$s7, $fp y $ra que necesite
modificar en su marco de pila. ($fp se guarda al crear
un marco de pila, o sea siempre, y $ra se guarda si se
va a llamar a alguna función.)
– Se termina el marco de pila guardando en $fp su
posición inicial, ( que es igual a $sp + tamaño del
marco de pila - 4)
http://arcos.inf.uc3m.es/~ii_ec
31
Ideas de diseño para SPIM :
Funciones (paso parámetros)
• La función llamada al terminar debe:
– Devolver en $v0 y $v1 el valor de retorno de la
función, (si hay).
– Restaurar los registros $s0..$s7, $fp y $ra que haya
guardado anteriormente.
– Eliminar el marco de pila sumando al registro $sp el
tamaño del marco de pila.
– Volver a la función llamante saltando a la dirección
almacenada en el registro $ra.
http://arcos.inf.uc3m.es/~ii_ec
32
Ideas de diseño para SPIM :
Funciones (Esquema de un marco de pila)
....
$fp
Argumento 6
Argumento 5
+
Registros
guardados
Dirección de
crecimiento de
la pila
Variables
locales
$sp
http://arcos.inf.uc3m.es/~ii_ec
33
Ideas de diseño para SPIM :
Ejemplo funciones (intro)
Function factorial
( a: integer ) : integer
begin
if (a < 2) then
return 1 ;
return a * factorial(a-1) ;
End.
begin
...
resultado := factorial(4) ;
End.
factorial(a=4)
(a < 2) ?
6 * 4
factorial(a=3)
(a < 2) ?
2 * 3
factorial(a=2)
(a < 2) ?
1 * 2
factorial(a=1)
(a < 2) ?
http://arcos.inf.uc3m.es/~ii_ec
34
Ideas de diseño para SPIM :
Ejemplo funciones (paso parámetros 1/3)
factorial:
+
# frame stack
subu $sp $sp 12
sw
$ra 12($sp)
sw
$fp 8($sp)
addu $fp $sp 12
...
FP
ra
fp
...
SP
...
...
http://arcos.inf.uc3m.es/~ii_ec
35
Ideas de diseño para SPIM :
Ejemplo funciones (paso parámetros 2/3)
+
# if ($a0 <
bge
li
b
2) then return 1;
$a0 2 b_else
$v0 1
b_efs
# return a * factorial(a-1);
b_else: sw $a0 -8($fp)
addi $a0 $a0 -1
jal factorial
lw $v1 -8($fp)
mul $v0 $v0 $v1
...
FP
ra
fp
a
a0 (a)
SP
http://arcos.inf.uc3m.es/~ii_ec
...
a-1
...
...
...
36
Ideas de diseño para SPIM :
Ejemplo funciones (paso parámetros 3/3)
+
b_efs:
# end frame stack
lw $ra 12($sp)
lw $fp 8($sp)
addu $sp $sp 12
jr $ra
FP
...
...
SP
ra
fp
a0 (a)
...
http://arcos.inf.uc3m.es/~ii_ec
37
Descargar