Practica 7 Vectores PDF
Practica 7 Vectores PDF
Practica 7 Vectores PDF
Práctica 7
Vectores
Objetivos
• Conocer cómo se representan las cadenas de caracteres en el lenguaje
ensamblador.
• Conocer cómo se representan los vectores de números enteros en lenguaje
ensamblador
• Conocer las maneras de acceder a cada uno de los elementos de un vector.
Materiales
Simulador MARS y un código fuente de partida.
Desarrollo de la práctica
Introducción
Un vector (array o string) es un elemento que contiene un conjunto de valores del
mismo tipo. En el ensamblador del MIPS un vector se implementa almacenando un
conjunto de valores en posiciones contiguas de la memoria y accediendo a cada valor
mediante un desplazamiento desde la dirección de comienzo del vector.
Un vector se podría almacenar en cualquier segmento de datos (estáticas, dinámicas o
pila) de la memoria del MIPS, la diferencia está en que en las estáticas o en la pila el
tamaño del vector se fija cuando se compila el programa y en las dinámicas puede variar
durante la ejecución del programa. De momento estudiaremos los vectores en el
segmento de datos estáticos.
Vectores de caracteres
Las cadenas de caracteres son también vectores con datos de tamaño un byte. El MIPS
nos permite definir cadenas de caracteres en memoria con las directivas .asciiz y .ascii.
Con la directiva .asciiz se define una cadena de caracteres acabada con el carácter null,
útil cuando se la quiere recorrer, puesto que nos permite reconocer su final. Se utiliza la
directiva .ascii cuando se quiere definir una cadena que no acaba con null. Por ejemplo,
.ascii “Universitat d'Alacant” reserva 21 bytes consecutivos en la memoria de datos
iniciados con esos caracteres. Si quisiésemos utilizar la instrucción syscall para
imprimir una cadena en la pantalla, necesariamente tendría que acabar con el carácter
null. Podemos utilizar .ascii con una cadena muy larga en la que dividimos su
definición varías líneas del programa como muestra el ejemplo siguiente:
1
ESTRUCTURA DE LOS COMPUTADORES
.text
la $s0, str
add $s1, $zero, $zero # Iniciamos contador a 0
loop:
add $t0, $s0, $s1 # dirección del byte a examinar
lb $t1, 0( $t0 )
beq $t1, $zero, exit # salimos si carácter leído='\0'
addi $s1, $s1, 1 # incrementamos el contador
j loop
exit: li $v0, 10
syscall
Vectores de enteros
Imaginemos que queremos definir y operar con un vector A de enteros de n elementos,
para acceder al elemento i-ésimo del vector lo expresamos como A[i]. ¿Cómo lo
podemos hacer en MIPS? Suponemos que la dirección del primer elemento del vector la
guardamos en un registro, por ejemplo $t0. Esta será la dirección base del vector. Para
acceder a cualquier elemento del vector lo haremos mediante un desplazamiento
respecto de la dirección base. Lo que hay que tener con cuenta es que un entero ocupa
una palabra en memoria (4 bytes) y el acceso a la memoria del MIPS es por byte, por lo
tanto el desplazamiento siempre será un múltiplo de 4. Podemos acceder a un elemento
del vector en la memoria para leerlo o escribirlo, por ejemplo: lw $s0, 4($t0) leerá el
segundo elemento del vector.
.data
A: .word 2, 4, 6, 8, 10 # vector A iniciado con valores
B: .word 0:4 # Vector B vacío
C: .space 50 # Otra definición de vector
vacio
.text
la $s0, A # Dirección base del vector A
la $s1, B # Dirección base del vector B
li $s5, 5 # Tamaño del vector
2
ESTRUCTURA DE LOS COMPUTADORES
li $v0, 10
syscall
Direccionamiento en memoria
En MIPS el acceso a una posición de la memoria para leer o escribir se hace, como ya
hemos visto previamente, obteniendo la dirección mediante la suma del contenido de un
registro base y un desplazamiento de 16 bits. Por ejemplo, lw $s1, 4($s2) lee el
contenido de la posición de memoria obtenida con la suma $s2+4 y lo guarda en $s1. A
esta forma de acceder a la memoria se la conoce con el nombre de direccionamiento
relativo a uno registre base. Es el utilizado, por ejemplo, para acceder a variables
estructuradas en las que un registro contiene la dirección de la variable y el
desplazamiento es el correspondiente a los campos a los que se accede.
Otro tipo de direccionamiento que podemos simular en MIPS es el direccionamiento
indirecto. En este caso la dirección del dato en memoria se encuentra en un registro.
Para tener este direccionamiento en MIPS el desplazamiento de los operadores de
acceso a la memoria tiene que ser cero. Por ejemplo, lw $s1, 0($s2) lee el contenido de
la posición de memoria que se encuentra en $s2. Un ejemplo de utilización es cuando el
programador quiere acceder a una dirección calculada por programa o para seguir un
puntero (del que hablamos en la práctica 6) o recorre variables estructuradas.
3
ESTRUCTURA DE LOS COMPUTADORES
# Ejemplo de direccionamiento
.data
A:.word 6
B:.word 8
C:.space 4
.text
la $t0,A # En $t0 la dirección de A
lw $t1,0($t0) # Direccionamiento indirecto
(dirección en $t0)
lw $t2,4($t0) # Direccionamiento relativo (dirección
=$t0+4)
add $t3,$t1,$t2
sw $t3,C # Direccionamiento absoluto
(dirección =C)
.data
matriz: .byte 1, 4, 7,
2, 5, 8
3, 6, 9
columes: .word 3 # Numero de columnas
.text
la $t0, matriz
lw $t3, columnas
li $t2, 0 #iniciamos índice para recorrer matriz
bucle:
lb $t1, 0($t0) #Fila 0
move $a0, $t1
jal imprim
lb $t1, 3($t0) #Fila 1 (1*3elementos)
move $a0, $t1
jal imprim
4
ESTRUCTURA DE LOS COMPUTADORES
li, $v0, 10
syscall
Ejercicios a entregar
➢ Dado el siguiente código:
.data
.text
Principal:
5
ESTRUCTURA DE LOS COMPUTADORES
syscall
li $v0, 1
move $a0, $v1 # Resultado 2 de la función
syscall # imprimir suma negativos
Haz el código de la función sum que calcula la suma de los valores positivos
y negativos del vector, dirección del cual se pasa como parámetro en $a0 y la
longitud en $a1. La función devuelve en $v0 la suma de los valores positivos
y en $v1 la suma de los negativos. Recuerda que en la función tienes que
utilizar los registros $tj.
➢ Haz el código que calcula la suma de los elementos de la diagonal principal
de una matriz 4x4 de valores enteros introducida por teclado. Muestra la
suma por pantalla.
Resumen
• Los elementos de las cadenas de caracteres son del tipo byte.
• Podemos acceder a la memoria utilizando diferentes modos de
direccionamiento.
• El MIPS solo implementa el modo de direccionamiento relativo a registro base,
pero se pueden simular los otros.