Convertir código C/C++ a lenguaje ensamblador

Usamos el compilador g ++ para convertir el código C proporcionado en lenguaje ensamblador. Para ver el código ensamblador generado por el compilador de C, podemos usar la opción “-S” en la línea de comando: 
 

Sintaxis:  

$ gcc -S filename.c

Esto hará que gcc ejecute el compilador, generando un archivo de ensamblaje. Supongamos que escribimos un código C y lo almacenamos en un archivo con el nombre «geeks.c».  

C

// C code stored in geeks.c file
#include <stdio.h>
 
// global string
char s[] = "GeeksforGeeks";
 
// Driver Code
int main()
{
    // Declaring variables
    int a = 2000, b =17;
     
    // Printing statement
    printf("%s %d \n", s, a+b);
}

Ejecutando el comando: 

$ gcc -S geeks.c

Esto hará que gcc ejecute el compilador, generando un archivo ensamblado geeks.s y no avance más. (Normalmente, invocaría al ensamblador para generar un archivo de código objeto).
El archivo de código ensamblador contiene varias declaraciones, incluido el conjunto de líneas: 

CPP

    .section    __TEXT, __text, regular, pure_instructions
    .macosx_version_min 10, 12
    .global    _main
    .align    4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq    %rbp
Ltmp0:
    .cfi_def_cfa_offset 16
Ltmp1:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp2:
    .cfi_def_cfa_register %rbp
    subq    $16, %rsp
    leaq    L_.str(%rip), %rdi
    leaq    _s(%rip), %rsi
    movl    $2000, -4(%rbp)         ## imm = 0x7D0
    movl    $17, -8(%rbp)
    movl    -4(%rbp), %eax
    addl    -8(%rbp), %eax
    movl    %eax, %edx
    movb    $0, %al
    callq    _printf
    xorl    %edx, %edx
    movl    %eax, -12(%rbp)         ## 4-byte Spill
    movl    %edx, %eax
    addq    $16, %rsp
    popq    %rbp
    retq
    .cfi_endproc
 
    .section    __DATA, __data
    .global    _s                      ## @s
_s:
    .asciz    "GeeksforGeeks"
 
    .section    __TEXT, __cstring, cstring_literals
L_.str:                                 ## @.str
    .asciz    "%s %d \n"
 
 
.subsections_via_symbols

Cada línea sangrada en el código anterior corresponde a una sola instrucción de máquina. Por ejemplo, la instrucción pushq indica que el contenido del registro %rbp debe insertarse en la pila del programa. Se ha eliminado toda la información sobre nombres de variables locales o tipos de datos. Todavía vemos una referencia a la 
variable global s[]= “GeeksforGeeks” , ya que el compilador aún no ha determinado en qué lugar de la memoria se almacenará esta variable.
Este artículo es una contribución de Sahil Rajput . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.orgo envíe su artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *