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.type
y 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