Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PRÁCTICA 3
Programación en ensamblador MIPS. Procedimientos I
Objetivos:
Desarrollo / Comentario:
Paso de parámetros por valor. Para el paso de parámetros por valor, antes de realizar la llamada a la
subrutina, el programa principal carga el valor de los parámetros de entrada en los registros elegidos
para ello.
Paso de parámetros por referencia. Para el paso de parámetros por referencia, antes de realizar la
llamada a la subrutina, el programa principal carga en los registros elegidos para ello las direcciones de
memoria en las que está almacenada la información.
int main()
{ int a[8]={0x50,0x60,0x70,0,0,0,0,0x90};
int b[8]={1,3,5,7,9,11,13,15};
int c[8]={2,4,6,8,0x10,0x12,0x14,0x16};
int v1[8];
int v2[8];
int sumando;
sumando=Suma_vectores (a,b,v1,8);
printf(“%d”,sumando);
sumando=Suma_vectores (b,c,v2,4);
printf(“%d”,sumando);
return 0;
}
Prácticas de Estructura de Computadores –Grado en Ingeniería Informática Curso 2015/16
Nota: Los registros $a0 - $a3 se usarán para pasar los argumentos. Los registros $v0 - $v1 se usarán para el retorno de
valores. Si hay que usar más registros (como argumentos o como retorno) se pasarán por la pila.
Los registros $t0 - $t9 se usarán como registros temporales y no será necesario que el procedimiento preserve su valor. Los
registros $s0 - $s7 deberán preservar su valor, es decir el procedimiento los apilará al comienzo de su ejecución y los
desapilará justo antes de retornar.
El simulador usado en las prácticas, Simula3MS, ofrece un pequeño conjunto de servicios de llamada al sistema
operativo a través de la instrucción de llamada al sistema (syscall).
Para realizar una llamada al sistema (Tabla 1) se cargará en el registro $v0 el código de la llamada y en los registros
$a0 y $a1 (o $f12 para valores de punto flotante) los argumentos.
Las llamadas al sistema que devuelven valores ponen sus resultados en el registro $v0 (o $f0 para resultados de punto
flotante).
print_double hace lo mismo que print_float pero permite un rango más amplio de números en punto flotante.
print_string muestra en el diálogo la cadena almacenada a partir de la dirección que indica $a0 hasta que
encuentra el carácter de finalización de cadena.
También hay llamadas al sistema para entrada de datos, estos datos se solicitan al usuario a través de diálogos:
Otra llamada al sistema muy utilizada es exit, que indica al procesador que se ha terminado la ejecución del programa.
2
Prácticas de Estructura de Computadores –Grado en Ingeniería Informática Curso 2015/16
Ejemplo sencillo:
.text
.globl main
main:
li $v0, 4
la $a0, str
syscall # print string
li $v0, 10
syscall # exit
.data
str: .asciiz "Hola Mundo!!!"
3
Prácticas de Estructura de Computadores –Grado en Ingeniería Informática Curso 2015/16
.data
#declaramos la variables
a: .word 0x50, 0x60, 0x70, 0, 0, 0, 0, 0x090 #array a, cuidado con 0x090
b: .word 1, 3, 5, 7, 9, 11, 13, 15 #array b
c: .word 2, 4, 6, 8, 0x10, 0x12, 0x14, 0x16 #array c
v1: .space 32 # 8 posiciones x4 bytes
v2: .space 32 # 8 posiciones x4 bytes
# creamos el programa
.text
.globl main
main:
#primera muestra por pantalla
#recogemos lo que necesitamos para la primera salida a pila:
li $a3, 8 # tamaño numérico del vector
la $a0, a # valor de la variable a
la $a1, b # valor de la variable b
la $a2, v1 # valor de la variable v1
li $v0, 10 #exit
syscall
acumulador:
li $v0, 0 #ponemos $v0 a 0
4
Prácticas de Estructura de Computadores –Grado en Ingeniería Informática Curso 2015/16
bucle:
beq $a3, $0, termina #el bucle termina cuando el tamaño numérico del vector sea 0
lw $t0, 0($a0) #cargamos en el temporal 0 la palabra contenida en la dirección de memoria $a0 +
0"desplazamiento"
lw $t1, 0($a1) #cargamos en el temporal 1 la palabra contenida en la dirección de memoria $a1 +
0"desplazamiento"
lw $t2, 0($a2) #cargamos en el temporal 2 la palabra contenida en la dirección de memoria $a2 +
0"desplazamiento"
add $t2, $t1, $t0 #sumamos en el temporal 2, el temporal 1 mas el temporal 0
add $v0, $v0, $t2 #sumamos en $v0, $v0 + el contenido del temporal 2
addi $a0, $a0, 4 #se abanza de posición en el array de $a0
addi $a1, $a1, 4 #se abanza de posición en el array de $a1
addi $a2, $a2, 4 #se abanza de posición en el array de $a2
addi $a3, $a3, -1 #va reduciendo el tamaño numérico del array
j bucle #se repite el bucle
termina:
jr $ra # volvemos antes del bucle, al jal señalado por ra