¿Qué partes de este código ensamblador de HelloWorld son esenciales si tuviera que escribir el programa en ensamblador?

2 minutos de lectura

avatar de usuario
Connor

Tengo este breve programa hola mundo:

#include <stdio.h>

static const char* msg = "Hello world";

int main(){
    printf("%s\n", msg);
    return 0;
}

Lo compilé en el siguiente código ensamblador con gcc:

    .file   "hello_world.c"
    .section    .rodata
.LC0:
    .string "Hello world"
    .data
    .align 4
    .type   msg, @object
    .size   msg, 4
msg:
    .long   .LC0
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $16, %esp
    movl    msg, %eax
    movl    %eax, (%esp)
    call    puts
    movl    $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4"
    .section    .note.GNU-stack,"",@progbits

Mi pregunta es: ¿todas las partes de este código son esenciales si tuviera que escribir este programa en ensamblador (en lugar de escribirlo en C y luego compilarlo en ensamblador)? Entiendo las instrucciones de montaje pero hay ciertas piezas que no entiendo. Por ejemplo, no sé qué es .cfi* y me pregunto si necesitaría incluir esto para escribir este programa en ensamblador.

  • .cfi son directivas para el ensamblador, no instrucciones de ensamblado.

    – Jabberwocky

    17/09/2016 a las 18:44

  • Puede eliminar todas las líneas que comienzan con .cfi y todos los que empiezan por .typey el que empieza por .file. todo lo de abajo .LFE0 se puede quitar.

    -Michael Petch

    17/09/2016 a las 18:48


  • Si tuviera que compilar usando la opción GCC -fno-asynchronous-unwind-tables probablemente verías esas líneas comenzando con .cfi remoto.

    -Michael Petch

    17/09/2016 a las 18:56

  • Relacionado: ¿Cómo eliminar el “ruido” de la salida del ensamblaje GCC/clang?

    – Peter Cordes

    17/09/2016 a las 20:55

  • Específicamente, la ABI para el código de 32 bits (que se aplica a Ubuntu 14.04) sería la ABI System V i386 que se puede encontrar aquí: 01.org/sites/default/files/file_attach/intel386-psabi-1.0.pdf

    -Michael Petch

    17/09/2016 a las 19:14


  • Gran respuesta. ¡Muchas gracias!

    – Connor

    17/09/2016 a las 19:22

  • Si no le importa devolver 0, puede ir más pequeño con una llamada de cola, ya que main() tiene argumentos que puede reemplazar en la pila.

    – Peter Cordes

    17/09/2016 a las 20:37

  • @PeterCordes A main que deja basura en el registro de valor de retorno no se puede decir que “funciona”.

    – zwol

    17/09/2016 a las 20:40


  • main(){return puts("Hello World");} es un programa válido. Su estado de salida no está definido, pero definitivamente se imprime. (Esperaba que puts arrojara algo específico en caso de éxito, pero los documentos solo dicen “un número no negativo”, que podría estar fuera del rango de 0 a 255 y, por lo tanto, no podemos decir nada sobre el estado de salida del programa en el x86 System V ABI.) Supongo que será mejor que agregue una advertencia a mi respuesta:/

    – Peter Cordes

    17/09/2016 a las 20:45


¿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