Escribiendo un envoltorio de llamada al sistema Linux int 80h en un ensamblado en línea GNU C [duplicate]

3 minutos de lectura

avatar de usuario
Rodrigo CR

Estoy tratando de usar el ensamblaje en línea … Leí esta página http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx pero no puedo entender los parámetros que pasan a mi función.

Estoy escribiendo un ejemplo de escritura en C… este es el encabezado de mi función:

write2(char *str, int len){
}

Y este es mi código ensamblador:

global write2
write2:
    push ebp
    mov ebp, esp
    mov eax, 4      ;sys_write
    mov ebx, 1      ;stdout
    mov ecx, [ebp+8]    ;string pointer
    mov edx, [ebp+12]   ;string size
    int 0x80        ;syscall
    leave
    ret

¿Qué tengo que hacer para pasar ese código a la función C? Estoy haciendo algo como esto:

write2(char *str, int len){
    asm ( "movl 4, %%eax;"
          "movl 1, %%ebx;"
          "mov %1, %%ecx;"
          //"mov %2, %%edx;"
          "int 0x80;"
           :
           : "a" (str), "b" (len)
    );
}

Eso es porque no tengo una variable de salida, entonces, ¿cómo manejo eso? Además, con este código:

global main
main:
    mov ebx, 5866       ;PID
    mov ecx, 9      ;SIGKILL
    mov eax, 37     ;sys_kill
    int 0x80        ;interruption
    ret 

¿Cómo puedo poner ese código en línea en mi código… para poder pedirle el pid al usuario… así… Este es mi precódigo

void killp(int pid){
    asm ( "mov %1, %%ebx;"
          "mov 9, %%ecx;"
          "mov 37, %%eax;"
           :
           : "a" (pid)         /* optional */
    );
}

  • ¿Desea pasar un parámetro, junto con str,len?, o quiere decir que desea enviar un descriptor de archivo en el que desea escribir el str?

    – Zimbabue

    27 de febrero de 2011 a las 5:55

  • Solo quiero pasar mi puntero de cadena y la longitud de mi cadena… exactamente como se ve en el código ensamblador… Para que, usando solo la llamada al sistema, pueda imprimir mi cadena en la salida estándar.

    – RodrigoCR

    27 de febrero de 2011 a las 6:07

  • Te perdiste una cosa al convertirte a AT&T: las constantes necesitan un $ delante de ellas. De lo contrario, son referencias a la memoria, y estoy bastante seguro de que no desea realizar cualquier interrupción que se encuentre en la dirección 0x80.

    – ughoavgfhw

    27 de febrero de 2011 a las 6:44

  • Puede usar la sintaxis de Intel con la directiva “.intel_syntax”.

    – Alejandro

    15 de marzo de 2012 a las 15:12

  • El tercer ejemplo en esta respuesta es incorrecto ya que el compilador no está informado de que eax ha cambiado y, por lo tanto, asumirá que no lo está.

    – Timoteo Baldwin

    15 de junio de 2015 a las 15:05

  • @Zboson: sí, pero debes decirle al compilador de alguna manera que int 0x80 modifica EAX. Entonces, si quería evitar las salidas, está atascado con un golpe y un "mov $" __NR_write ", %%eax" en lugar de una restricción de entrada. Y para llamadas al sistema que copian para memoria de espacio de usuario (como read(2)no write(2)) necesitas una memoria ficticia producción operando para decirle al compilador al respecto. Esto necesita una entrada ficticia, o una "memory" clobber, de lo contrario, las tiendas en el búfer antes de la llamada son tiendas muertas que pueden optimizarse.

    – Peter Cordes

    26 mayo 2019 a las 15:34

  • @Alexander: no usar .intel_syntax noprefix / .att_syntax en la parte superior/inferior de una plantilla asm; en su lugar compilar con -masm=intel. Aunque en este caso, donde no tienes operandos como %0 sustituyendo en la plantilla (donde desea que el compilador use eax o 4no %eax o $4), puede que no importe. ¿Cómo configurar gcc para usar la sintaxis de Intel de forma permanente?

    – Peter Cordes

    23 de marzo de 2021 a las 21:18

¿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