Llamar a funciones C desde el lenguaje ensamblador x86

3 minutos de lectura

avatar de usuario
anderson verde

¿Es posible generar funciones en lenguaje ensamblador a partir de funciones C usando GCC, para que puedan ser invocadas desde un programa en lenguaje ensamblador? Sé que gcc compila C en código de máquina (que se puede desmontar fácilmente en lenguaje ensamblador), y ya sé que es posible incorporar funciones de lenguaje ensamblador en C, pero aún no he encontrado una manera de invocar funciones C desde ensamblador programas de idiomas, que es básicamente lo contrario de esto.

Aquí, intento incorporar una función C en un programa ensamblador x86. Si la inserción no es posible, ¿hay alguna otra forma de invocar una función C desde un programa en lenguaje ensamblador?

.686p
.model flat,stdcall
.stack 2048

.data

.code
start:

invoke  ExitProcess, 0

printSomething PROC ;now I'm attempting to inline a C function here
    void printSomething(thingToPrint){
        printf("This is a C function that I want to invoke from an assembly language program.");
        printf("There must be some way to do this - is it possible somehow?");
    }
printSomething ENDP

end start

  • No recuerdo todos los detalles, pero solo necesita compilar en archivos de objetos y vincularlos. Solo necesita saber qué convenciones de llamada se utilizan al invocar la función.

    –Jeff Mercado

    27 de abril de 2013 a las 18:44

  • Puede agregar el código ensamblador que muestra lo que ha intentado y decir cómo falla al compilar o cómo se comporta mal. Sería mucho más fácil para una respuesta señalar cuál es el problema.

    – hyde

    27 de abril de 2013 a las 18:47

  • Puede aprender cómo hacer esto escribiendo una función C que llame a la función que desea llamar, compilándola en lenguaje ensamblador (-S), y estudiando los resultados. También te señalaría el “psABI”, pero ya no puedo encontrar una copia.

    – zwol

    27 de abril de 2013 a las 18:59

  • Por supuesto que puedes hacer esto. Simplemente siga las reglas de la ABI de su compilador.

    –David Heffernan

    27/04/2013 a las 19:10

  • Ahora me pregunto si es posible generar procedimientos de ensamblaje x86 a partir de funciones C usando GCC. ¿Sería posible convertir cada función en un programa C a la función de lenguaje ensamblador equivalente, usando GCC o algún otro compilador de C?

    –Anderson Green

    9 de mayo de 2013 a las 23:24


  • @AndersonGreen: siempre puede intentar usar la opción -S. “gcc -S archivo.c” convertirá “archivo.c” en ensamblaje (nombrándolo archivo.s). Alternativamente, si ya tiene su ejecutable, puede usar “objdump -d exe_file > exe_file.asm” para desensamblar “exe_file” y volcar el resultado en “exe_file.asm”.

    – chispeante

    10 de mayo de 2013 a las 2:06

  • @Sparky En la convención de procedimientos x86, cada función tiene leave o instrucciones equivalentes antes de que regrese a la persona que llama. Pienso que el addl $0x10, %esp en tu ejemplo es redundante.

    – StrikeW

    22 de agosto de 2015 a las 6:35


  • @StrikeW: el “addl $ 0x10,% esp” en los ejemplos se usa para limpiar los parámetros que se insertaron en la pila. En C, la persona que llama normalmente es responsable de limpiar los parámetros en la pila. La instrucción “dejar” (o equivalente) en la función C llamada es para limpiar cualquier espacio de pila utilizado por la función llamada. Si la función llamada es responsable de limpiar los parámetros que se le pasan en la pila, estaría usando la instrucción “RET n” (donde n es la cantidad de bytes que se extraerán de la pila).

    – chispeante

    24 de agosto de 2015 a las 15:07

  • no C compilar métodos externos precedidos por _? Entonces la llamada debe ser call _printSomething … ???

    – Resumen

    22 de agosto de 2016 a las 18:39

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad