Informatica
Estructura de Computadores
Prá ctica 2.- Programació n mixta C-asm x86 Linux
1 Resumen de objetivos
Al finalizar esta práctica, se debería ser capaz de: Usar las herramientas gcc, as y ld para compilar código C, ensamblar código ASM, enlazar ambos tipos de código objeto, estudiar el código ensamblador generado por gcc con y sin optimizaciones, localizar el código ASM en‐línea introducido por el programador, y estudiar el correcto interfaz del mismo con el resto del programa C. Reconocer la estructura del código generado por gcc según la convención de llamada cdecl. Reproducir dicha estructura llamando a funciones C desde programa ASM, y recibiendo llamadas desde programa C a subrutinas ASM. Escribir fragmentos sencillos de ensamblador en‐línea. Usar la instrucción CALL (con convención cdecl) desde programas ASM para hacer llamadas al sistema operativo (kernel Linux, sección 2) y a la librería C (sección 3 del manual). Enumerar los registros y algunas instrucciones de los repertorios MMX/SSE de la línea x86. Usar con efectividad un depurador como gdb/ddd. Argumentar la utilidad de los depuradores para ahorrar tiempo de depuración. Explicar la convención de llamada cdecl para procesadores x86. Recordar y practicar en una plataforma de 32bits las operaciones de cálculo de paridad, cálculo de peso Hamming (population count), suma lateral (de bits o de componentes SIMD enteros) y producto de matrices.
2 Convención de llamada cdecl
En la práctica anterior ya vimos la conveniencia de dividir el código de un programa entre varias funciones, para facilitar su legibilidad y comprensión, además de su reutilización. En la Figura 1 se vuelve a mostrar la suma de lista de enteros de 32bits, destacando estos tres aspectos que ahora nos interesan: La dirección de inicio de la lista y su tamaño se le pasa a la función a través de registros. El resultado se devuelve al programa principal a través del registro EAX. La subrutina preserva el valor de EDX.
Probablemente el autor de esta función considere que quien reutilice sus funciones debe aprender qué registros se deben usar para pasar los argumentos, teniendo garantizado que a la vuelta de la subrutina sólo se habrá modificado el valor del registro EAX, que contiene el valor de retorno de la función. Se pueden usar varias alternativas para pasar parámetros a funciones y para retornar los resultados de la función al código que la ha llamado. Se llama convención de llamada (calling convention) al conjunto de alternativas escogidas (para pasar parámetros y devolver resultados). Corresponde a la convención determinar, por ejemplo: Dónde se ponen los parámetros (en registros, en la pila o en ambos). El orden en que se pasan los parámetros a la función. o Si es en registros, en cuál se pasa el parámetro 1º, 2º, etc. o Si es en pila, los parámetros pueden introducirse en el orden en que aparecen en la declaración de la función (como en Pascal) o al contrario (como se hace en C). La primera opción exige que el lenguaje sea fuertemente tipificado, y así una función sólo podrá tener un número fijo de argumentos de tipo conocido. La segunda opción permite un nº variable de argumentos de tipos variables. Qué registros preserva el código de llamada (invocante) y cuáles la función (código invocado). o Los primeros (caller‐save, salva‐invocante) pueden usarse directamente en la función. o Los segundos (callee‐save, salva‐invocado) deberían salvarse a pila antes de que la función los modifique, para poder restaurar su valor antes de retornar al invocante.
Estructura de Computadores 1
Quién libera el espacio reservado en la pila para el paso de parámetros: el código de llamada (invocante, como en C) o la función (código invocado, como en Pascal). o...
Regístrate para leer el documento completo.