Error de segmentación al abrir la pila x86 para acceder a la función arg

2 minutos de lectura

avatar de usuario
Susmit Agrawal

Estoy tratando de vincular el ensamblado x86 y C.

Mi programa en C:

extern int plus_10(int);

# include <stdio.h>

int main() {
    int x = plus_10(40);
    printf("%d\n", x);
    return 0;
}

Mi programa de montaje:

[bits 32]

section .text

global plus_10
plus_10:
    pop edx
    mov eax, 10
    add eax, edx
    ret

Compilo y vinculo los dos de la siguiente manera:

gcc -c prog.c -o prog_c.o -m32
nasm -f elf32 prog.asm -o prog_asm.o
gcc prog_c.o prog_asm.o -m32

Sin embargo, cuando ejecuto el archivo resultante, aparece un error de segmentación.

Pero cuando reemplazo

pop-edx

con

mover edx, [esp+4]

el programa funciona bien. ¿Puede alguien explicar por qué sucede esto?

  • pop edx mueve el puntero de la pila, mov edx, [esp+4] no. Normalmente, en C, depende de la persona que llama limpiar la pila.

    – Jabberwocky

    13 mayo 2019 a las 13:52


  • Pregunta bien hecha. +1

    – fuz

    13 mayo 2019 a las 13:52

  • @Jabberwocky Pero, ¿por qué eso causaría una falla de segmentación? La pila es común para ambas funciones, ¿verdad?

    – Susmit Agrawal

    13 mayo 2019 a las 13:53


  • Porque abriste la dirección de retorno, no el argumento. No puedes usar pop como este.

    – R.. GitHub DEJA DE AYUDAR A ICE

    13 mayo 2019 a las 13:55

  • @SusmitAgrawal porque la dirección de retorno está en la pila. Su pop edx en realidad saca la dirección de retorno de la pila y cuando el ret se ejecuta, el procesador salta a cualquier dirección que esté en la pila

    – Jabberwocky

    13 mayo 2019 a las 13:55


  • Sin embargo, la convención de llamada cdecl esperará que el valor se devuelva a través de eax. Por lo tanto, no puede simplemente escribir la función asm de la manera que desee, tiene que ser compatible con el código C generado por el compilador.

    – Lundin

    13 de mayo de 2019 a las 14:12

  • @Lundin aparentemente su plataforma usa la convención cdecl. yo tambien escribi es posible código ensamblador, por lo que dependiendo de la plataforma puede ser algo diferente. Editado y aclarado. Gracias.

    – Jabberwocky

    13 mayo 2019 a las 14:14


¿Ha sido útil esta solución?