05 - Procedimientos
05 - Procedimientos
Índice
1. Definición y fundamentos
2. Uso en entorno x86-16bits
3. X86 calling conventions
4. Programación multimódulo
5. Librerías
© Rafael Rico López
1/66
Procedimientos
1. Definición y fundamentos
1. Definición y fundamentos
Índice
1. Concepto
2. Argumentos
3. Valor devuelto
4. Variables locales
5. Soporte hardware
6. ABI
© Rafael Rico López
2/66
1
Procedimientos
1.1. Concepto
• Términos sinónimos:
Subrutina
Subprograma
Función
Rutina
3/66
Procedimientos
1.1. Concepto
• Funcionalmente, un procedimiento es un
subalgoritmo de un algoritmo principal que resuelve
una tarea específica
4/66
2
Procedimientos
1.1. Concepto
Procedimientos
1.1. Concepto
• Desde el punto de vista de la ingeniería del software
Facilita:
La vista del código
3
Procedimientos
1.1. Concepto
• Elementos de una subrutina
Declaración
Nombre
Código argumentos
subrutina
Tipo de valor devuelto (si lo hay)
© Rafael Rico López
salida
7/66
Procedimientos
1.1. Concepto
• Nomenclatura
El flujo de código que
invoca el procedimiento se
conoce como código
llamador (caller)
flujo principal
8/66
4
Procedimientos
1.2. Argumentos
9/66
Procedimientos
1.2. Argumentos
• Ejemplos1:
valor
referencia
5
Procedimientos
1.3. Valor devuelto
11/66
Procedimientos
1.3. Valor devuelto
• Modos de uso:
el valor devuelto puede indicar
si ha ocurrido un error
error = funcion(argumentos)
if (error = valor) then …
O mejor:
A veces:
© Rafael Rico López
funcion(argumentos) …
12/66
6
Procedimientos
1.3. Valor devuelto
13/66
Procedimientos
1.4. Variables locales
14/66
7
Procedimientos
1.4. Variables locales
• Ejemplos:
int mifuncion(argumentos)
{ variable local
int i=10;
while(i)
i--;
…
… valor devuelto
return i;
}
© Rafael Rico López
15/66
Procedimientos
1.5. Soporte hardware
• Control de flujo
Instrucciones específicas
Llamada salvaguarda de contexto y salto
incondicional a subrutina
Retorno recuperación de contexto y salto
incondicional a código ppal.
• En la pila
16/66
8
Procedimientos
1.5. Soporte hardware
• Paso de argumentos
• Valor devuelto
• Variables locales
En registros
Organizados como banco de registros o
como ventanas de registros1
En la pila
Organización LIFO de memoria
© Rafael Rico López
Procedimientos
1.5. Soporte hardware
• Ventajas e inconvenientes:
En registros
Pocos registros hay que garantizar que no se sobreescriben1
No dan lugar a subrutinas reentrantes ni anidables
Los registros son rápidos
criterio si se usan registros
Generan pocas dependencias
En la pila
Acceso lento a memoria
Sobrecarga de dependencias y cálculo de direcciones
Las subrutinas son reentrantes y anidables
© Rafael Rico López
9
Procedimientos
1.5. Soporte hardware
19/66
Procedimientos
1.5. Soporte hardware
20/66
10
Procedimientos
1.5. Soporte hardware
21/66
Procedimientos
1.6. ABI
llamadas al sistema)
El ABI debe cumplirlo el compilador
22/66
11
Procedimientos
1.6. ABI
Procedimientos
2. Uso en entorno x86-16bits
1. Declaración
2. Invocación y retorno
3. Paso de argumentos por pila
4. Variables locales
5. Uso de estructuras
© Rafael Rico López
24/66
12
Procedimientos
2.1. Declaración
• Utilizamos las directivas PROC y ENDP
Marcan el principio y el final de los procedimientos
1
etiqueta PROC [NEAR|FAR]
: : : ;código
RET [constante]
etiqueta ENDP
2
etiqueta:
: : : ;código
RETN [constante]
© Rafael Rico López
3
etiqueta: LABEL FAR
: : : ;código
25/66
RETF [constante]
Procedimientos
2.2. Invocación y retorno
• Instrucciones
26/66
13
Procedimientos
2.2. Invocación y retorno
SP = SP - 2
IP pila
© Rafael Rico López
IP = nuevo IP
Procedimientos
2.2. Invocación y retorno
Ejemplo:
CALL far ptr TAREA salto far
© Rafael Rico López
14
Procedimientos
2.2. Invocación y retorno
RET [constante]
• Devuelve el contexto original de la secuencia de código
principal sacando de la pila CS:IP o IP (dependiendo de si
el salto es far o near)
• Como operando opcional tenemos una constante cuyo
significado es el número de bytes a sumar a SP después
de retornar (clean-up de la pila)
29/66
Procedimientos
2.2. Invocación y retorno
• Juntando todo:
RET 1 RETN 2
© Rafael Rico López
tarea ENDP
1 Asume el tipo de salto del CALL 2 Supone CALL near; si es far emite error
30/66
15
Procedimientos
2.3. Paso de argumentos por pila
• Si usamos la pila para pasar argumentos…
argumentos
En secuencia principal ADD SP,n (caller clean-up), o
Con RET n (callee clean-up)
31/66
Procedimientos
2.3. Paso de argumentos por pila
32/66
16
Procedimientos
2.3. Paso de argumentos por pila
• Tareas del callee
Procedimientos
2.3. Paso de argumentos por pila
• Clean-up
Después de ejecutar el procedimiento, el estado de la
pila debe ser el que tendría de no haberse ejecutado
17
Procedimientos
2.3. Paso de argumentos por pila
• Ejemplo:
Sea el procedimiento
int madd (int a, int b, int m)
que devuelve el valor del cálculo a x b + m
AX es caller-saved
© Rafael Rico López
Procedimientos
2.3. Paso de argumentos por pila
36/66
18
Procedimientos
2.3. Paso de argumentos por pila
Procedimientos
2.3. Paso de argumentos por pila
PUSH AX AX AX
PUSH m argumento 3 argumento 3
PUSH b argumento 2 argumento 2
MOV AX,[BP+4]
AX AX SP
MUL [BP+6] argumento 3
ADD AX,[BP+8]
© Rafael Rico López
argumento 2
argumento 1 SP
POP BP
RET
madd ENDP 38/66
19
Procedimientos
2.4. Variables locales
39/66
Procedimientos
2.4. Variables locales
• Ejemplo:
Sea el procedimiento
int cuenta_char (char *str, char c)
que devuelve cuántas veces aparece el carácter c en la
cadena str
La cadena se pasa por referencia como puntero far
El procedimiento se declara como far
En el procedimiento, la cuenta se lleva en una variable local
AX es caller-saved
¡OJO! Asumimos callee clean-up
40/66
20
Procedimientos
2.4. Variables locales
POP AX ;recupero AX
© Rafael Rico López
Procedimientos
2.4. Variables locales
• Código del callee:
21
Procedimientos
2.4. Variables locales
• Código del cuerpo de la función:
JMP seguir
salir: POP SI, ES, BX ;recupero registros
MOV AX,[BP-2] ;devuelvo el resultado en AX
43/66
AX no se puede preservar en callee
Procedimientos
(ejemplo de uso de EQU)
arg1offset EQU <[BP+6]> ;posición del arg1 (offset)
arg1base EQU <[BP+8]> ;posición del arg1 (base)
arg2 EQU <[BP+10]> ;posición del argumento2
loc EQU <[BP-2]> ;posición de la var. local
22
Procedimientos
2.4. Variables locales
AX AX
PUSH AX
argumento 2 argumento 2
PUSH c BASE arg1 BASE arg1
PUSH DS OFFSET arg1 SP OFFSET arg1
LEA BX,str CS
PUSH BX IP SP
CALL cuenta_char
MOV r, AX
AX AX
POP AX argumento 2 BP+10 argumento 2
BASE arg1 BP+8 BASE arg1
cuenta_char PROC FAR OFFSET arg1 BP+6 OFFSET arg1
PUSH BP CS CS
IP IP
MOV BP,SP
BP old BP old BP SP
SUB SP,2 var. local SP
BP–2
(código) AX AX SP
argumento 2
MOV SP,BP
© Rafael Rico López
BASE arg1
POP BP OFFSET arg1
RET 6 CS
cuenta_char ENDP IP SP
45/66
Procedimientos
2.4. Variables locales
• Juntando todo:
Pasamos argumentos mediante PUSH
Antes de comenzar las tareas del procedimiento se salva el
antiguo marco (PUSH BP) y se actualiza el marco en curso
(BP SP; MOV BP,SP)
el nuevo marco siempre apunta a la posición de la pila que
almacena el antiguo (precedente )
46/66
23
Procedimientos
Juntando todo
CALLER CALLEE
salvar reg. valor devuelto PUSH AX
salvar resto de registros PUSH reg
pasar argumentos según ABI PUSH arg
invocar procedimiento CALL
salvar marco de pila PUSH BP
ajustar marco de pila nuevo MOV BP,SP
CÓDIGO DE COLORES declarar variables locales SUB SP,n
preservar registros salvar regs. (excepto v. dev.) PUSH reg
clean-up CÓDIGO PROCEDIMIENTO
manejo de variables locales recuperar registros POP reg
soslayar variables locales MOV SP,BP
recuperar marco de pila POP BP
retorno RET
soslayar argumentos RET s
© Rafael Rico López
Procedimientos
Juntando todo
PILA
crece
registros
registro del valor devuelto
salvados por el caller
argumentos
BP + m
contexto
variables locales
salvados por el callee BP - p
© Rafael Rico López
registros
48/66
24
Procedimientos
2.5. Uso de estructuras
49/66
Procedimientos
2.5. Uso de estructuras
50/66
25
Procedimientos
2.5. Uso de estructuras
• Ejemplo:
parametros STRUC
DW ? ;marco de pila BP OFFSET 0
retorno DD ? ;puntero far OFFSET 2
param1 DD ? ;puntero far a cadena OFFSET 6
param2 DW ? ;valor del carácter OFFSET 10
parametros ENDS
51/66
Procedimientos
2.5. Uso de estructuras
• Ejemplo:
: : :
MOV SP, BP
POP BP
RET size_params ;retorno y soslayo argumentos
© Rafael Rico López
52/66
26
Procedimientos
3. X86 calling conventions
53/66
Procedimientos
3.1. Convenciones caller clean-up
cdecl (C declaration)
Todos los argumentos se pasan por la pila
El orden de paso es RTL (right to left)
Los valores devueltos se pasan en EAX
Los registros EAX, ECX y EDX son caller-saved
El resto de registros son callee-saved
syscall
© Rafael Rico López
optlink
54/66
27
Procedimientos
3.2. Convenciones callee clean-up
pascal
Todos los argumentos se pasan por la pila
El orden de paso es LTR (left to right)
fastcall
Los 2 primeros argumentos por la izquierda se pasan en
ECX y EDX
El resto de argumentos se pasan por la pila en orden RTL
Borland fastcall
Los 3 primeros argumentos por la izquierda se pasan en
EAX, EDX y ECX
El resto de argumentos se pasan por la pila en orden LTR
stdcall
safecall
© Rafael Rico López
55/66
Procedimientos
4. Programación multimódulo
4. Programación multimódulo
Índice
1. Directivas
2. Ensamblado
© Rafael Rico López
56/66
28
Procedimientos
4. Programación multimódulo
• Programación multimódulo es aquella en la que el
ejecutable es el resultado de enlazar varios módulos
OBJ diferentes
Procedimientos
4.1. Directivas
• Para que un nombre simbólico esté disponible a otros
módulos se utiliza la directiva PUBLIC
• Ejemplo:
PUBLIC nombre_proc
PUBLIC nombre_variable
: : :
DOSSEG
.MODEL SMALL
.DATA
nombre_variable DB 17
: : :
© Rafael Rico López
.CODE
nombre_proc PROC NEAR
: : :
nombre_proc ENDP 58/66
29
Procedimientos
4.1. Directivas
• Ejemplo:
: : :
59/66
Procedimientos
4.2. Ensamblado
programa.exe
modulo_2.obj
LINK ...
© Rafael Rico López
60/66
30
Procedimientos
5. Librerías
5. Librerías
Índice
1. Fundamentos
2. Manejando librerías con LIB
© Rafael Rico López
61/66
Procedimientos
5.1. Fundamentos
62/66
31
Procedimientos
5.1. Fundamentos
… etc.
63/66
Procedimientos
5.2. Manejando librerías con LIB
64/66
32
Procedimientos
5.2. Manejando librerías con LIB
• Programa lib
Procedimientos
5.2. Manejando librerías con LIB
• Ejemplo:
link nuevo_objeto,,,mi_lib;
66/66
33