Pregunta

¿Cómo se puede pasar un argumento de una función principal C a una función de montaje? Yo sé que mi función personalizada tiene que ser algo como:

void function(char *somedata) __attribute__((cdecl));

Ahora ¿cómo iba a utilizar somedata en un archivo de ensamblaje. Mi sistema operativo es Linux Ubuntu y mi procesador es x86.

¿Fue útil?

Solución

yo soy un poco de un novato en esto, pero espero que este ejemplo le permitirá estar en su camino. Lo he probado y funciona, el único problema que puede tener es un software que no están disponibles. Estoy usando nasm para el montaje.

main.c

extern void myFunc(char * somedata);

void main(){
    myFunc("Hello World");
}

myFunc.asm

section .text
    global myFunc
    extern printf

    myFunc:
        push ebp
        mov  ebp, esp

        push dword [ebp+8]
        call printf 

        mov esp, ebp
        pop ebp
        ret

COMPILE

nasm -f elf myFunc.asm
gcc main.c myFunc.o -o main

Notas:

Es necesario instalar nasm (ensamblador) (ubuntu es: sudo apt-get install nasm)

¿Qué ocurre básicamente en el código C llama al myFunc con un mensaje. En myFunc.asm obtenemos la dirección del primer carácter de la cadena (que se encuentra en [ebp + 8] Véase aquí para obtener información (http://www.nasm.us/xdoc/2.09.04/html/nasmdoc9.html 9.1.2 ver que describe c convenciones de llamada un tanto.) y se pasa a la función printf (empujándola en la pila). printf está en la biblioteca estándar de C, que gcc automáticamente enlazará en nuestro código por defecto a menos que no decimos a.

Tenemos que exportar myFunc en el archivo de ensamblaje y declarar myFunc como una función extrnal en el archivo main.c. En myFunc.asm también estamos importando la función printf de stdlib de manera que podemos hacer salir el mensaje de forma más sencilla posible.

Espero que esto ayude un poco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top