Está en la página 1de 14

Departamento de Sistemas Telemticos y Computacin

(GSyC)

Convenio de llamada a
subrutina
Katia Leal Algara
Septiembre 2012
katia@gsyc.es
http://gsyc.escet.urjc.es/~katia/
GSyC 2012 - Convenio llamada a
procedimiento

Subrutinas

Concepto de procedimiento o funcin


!
q Las subrutinas son el equivalente que ofrecen las
instrucciones mquina a los procedimientos y
funciones de los lenguajes de alto nivel!
q En C, una funcin proporciona varias
abstracciones:!
q Mapeo de parmetros actuales a parmetros
formales!
q Alojamiento e inicializacin del almacenamiento
local temporal. Esto es importante en lenguajes
que permiten recursin: cada llamada a la
misma funcin debe obtener su propia copia de
cualquier variable local para evitar que los datos
se sobrescriban entre las distintas llamadas!
GSyC 2012 - Convenio llamada a procedimiento

Subrutinas

Contexto de una funcin


!
q El contexto de una funcin es toda aquella
informacin que describe el estado de una funcin
durante su ejecucin:!
q parmetros actuales!
q valor de las variables locales!
q instruccin que est siendo ejecutada!
q Para un programa en lenguaje ensamblador MIPS,
el contexto de una funcin consiste en los valores
de todos los registros a los que se hace referencia
desde la funcin!
q La mayora de las arquitecturas, incluida la de
MIPS, utiliza la pila como medio para salvar y
restaurar el contexto de una subrutina!
GSyC 2012 - Convenio llamada a procedimiento

Subrutinas

Invocacin

fact:

jal fact

jr $ra

jal fact

GSyC 2012 - Convenio llamada a procedimiento

Subrutinas

Instrucciones para la llamada y el retorno de subrutina

!
qjal target!

qSalto incondicional a la instruccin objetivo!


qAlmacenamiento de la direccin de la siguiente
instruccin en el registro $ra

qjr rs !
qSalto incondicional a la instruccin cuya
direccin est en el registro rs!
qEn caso de retorno de subrutina debemos
indicar el registro $ra!

GSyC 2012 - Convenio llamada a procedimiento

Convenio

Pasos llamada a subrutina (1)

!
1. El caller debe:!
a) Poner los argumentos en los registros
$a0-$a3. Si hay ms de 4 parmetros,
se deben pasar por la pila!
b) Salvar los registros caller-saved ($a0$a3 y $t0-$t9) que sean utilizados por
el caller!
c) Ejecutar la instruccin jal, la cual salta
a la primera instruccin de la subrutina y
almacena la direccin de retorno en el
registro $ra

GSyC 2012 - Convenio llamada a procedimiento

Convenio

Pasos llamada a subrutina (2)

!
2. El callee debe:!
a) Crear un marco de pila, restando el
tamao del marco del puntero de pila
($sp). El tamao mnimo del marco de
pila es de 32 bytes!
b) Salvar los registros callee-saved ($s0$s7, $fp, $ra) que sean utilizados
por el callee!
c) Establecer el valor del puntero de marco
de pila sumando al puntero de pila el
tamao del marco de pila menos 4

GSyC 2012 - Convenio llamada a procedimiento

Convenio

Pasos llamada a subrutina (3)

!
3. El callee ejecuta el cuerpo de la funcin.
Para retornar de la funcin, el calle debe:!
a) Meter el valor de retorno en el registro
$v0!
b) Restaurar los registros callee-saved
($s0-$s7, $fp, $ra) !
c) Eliminar el marco de pila aadiendo el
tamao del marco al puntero de pila!
d) Retornar saltando con jr a la direccin
indicada en el registro $ra

GSyC 2012 - Convenio llamada a procedimiento

Convenio

Pasos llamada a subrutina (4)

!
4. Para restablecer el estado anterior a la
llamada a la subrutina, el caller debe:!
a) Restaurar los registros caller-saved !
b) Si se pas algn argumento por la pila,
sacarlo!
c) Extraer el valor de retorno del registro
$v0

GSyC 2012 - Convenio llamada a procedimiento

Parmetros por valor Vs parmetros por referencia

Paso de parmetros
!
qTipo de parmetros:!
q Por valor: se pasa el valor del parmetro!
q Por referencia: se pasa la direccin de memoria
donde est almacenado el parmetro!

qLugar donde se van a pasar los parmetros:!


q Registros ($a0-$a3)!
q Pila!

qEl ensamblador del MIPS establece el siguiente


convenio para realizar el paso de parmetros:!
q Los 4 primeros parmetros de entrada se pasarn a
travs de los registros ($a0-$a3). A partir del quinto
parmetro se pasar a travs de la pila!
q Los valores de retorno se devuelve en los registros
$v0 y $v1, el resto a travs de la pila!
GSyC 2012 - Convenio llamada a procedimiento

Convenio almacenamiento en pila

Convenio para salvar registros en la pila

!
qPrimero almacenaremos el registro $fp,
seguido del registro $ra(si es que es
neceasrio) despus, cualquiera de los
registros callee-saved ($s0-$s7) y
finalmente, cualesquiera registros callersaved ($t0-$t9) !
qEl puntero de pila debe almacenar una
direccin doubleword aligned. Es decir, la
direccin de memoria tiene que ser divisible
por 8 (64 bits, 8 bytes) y, por lo tanto, dicha
direccin debe terminar en 000!

GSyC 2012 - Convenio llamada a procedimiento

10

Ejemplo: clculo del factorial del nmero 10

Factorial en C
main ()
{
printf ("The factorial of 10 is %d\n", fact (10));
}
int fact (int n)
{
if (n < 1)
return (1);
else
return (n * fact (n - 1));
}

GSyC 2012 - Convenio llamada a procedimiento

11

Ejemplo: clculo del factorial del nmero 10

Factorial en ensamblador (main)


##
##
##
##
##
##

Arquitectura de Computadores curso 2012-2013


fact.asm -- A program to compute the factorial of 10
main-Registers used:
$a0
- syscall parameter -- the number to print
$v0
- syscall parameter and return value

msg:

.data
.asciiz "The factorial of 10 is: "
.text

main:
subu $sp, $sp, 32
sw $ra, 20($sp)
sw $fp, 16($sp)
addiu $fp, $sp, 28

#
#
#
#

la $a0, msg
li $v0, 4
syscall

# Load syscall print-string into $v0


# Make the syscall

li $a0,10
jal fact

Stack frame is 32 bytes long


Save return address
Save old frame pointer
Set up frame pointer

# Put argument (10) in $a0


# Call factorial function

move $a0, $v0


li $v0, 1
syscall

# Move fact result in $a0


# Load syscall print-int into $v0
# Make the syscall

li $v0, 10
syscall

# Load syscall exit into $v0


# Make the syscall

GSyC 2012 - Convenio llamada a procedimiento

12

Ejemplo: clculo del factorial del nmero 10

Factorial en ensamblador (fact)


## fact
## Registers used:
##
$a0 - initially 10
.text
fact:
subu $sp, $sp, 32
sw $ra, 20($sp)
sw $fp, 16($sp)
addiu $fp, $sp, 28
sw $a0, 0($fp)

#
#
#
#
#

Stack frame is 32 bytes long


Save return address
Save frame pointer
Set up frame pointer
Save argument (n)

lw $v0, 0($fp)
bgtz $v0, fact_recurse # fact(n-1)
li
$v0, 1
b return
fact_recurse:
lw $v1, 0($fp)
subu $v0, $v1, 1
move $a0, $v0
jal fact
lw $v1, 0($fp)
mul $v0, $v0, $v1

# Load n
# Compute n - 1
# Move value to $a0
# Load n
# Compute fact(n-1) * n

return:
lw $ra, 20($sp)
lw $fp, 16($sp)
addiu $sp, $sp, 32
jr $ra

GSyC 2012 - Convenio llamada a procedimiento

13

También podría gustarte