Convert C/C++ code to assembly language - GeeksforGeeks

30 Aug, 2021
We use g++ compiler to turn provided C code into assembly language. To see the assembly code generated by the C compiler, we can use the “-S” option on the command line:  
Syntax:  
$ gcc -S filename.c
This will cause gcc to run the compiler, generating an assembly file. Suppose we write a C code and store it in a file name “geeks.c” .  
C
// C code stored in geeks.c file#include <stdio.h> // global stringchar s[] = "GeeksforGeeks"; // Driver Codeint main(){    // Declaring variables    int a = 2000, b =17;         // Printing statement    printf("%s %d \n", s, a+b);}
Running the command: 
$ gcc -S geeks.c
This will cause gcc to run the compiler, generating an assembly file geeks.s, and go no further. (Normally it would then invoke the assembler to generate an object- code file.)The assembly-code file contains various declarations including the set of lines: 
CPP
    .section    __TEXT, __text, regular, pure_instructions    .macosx_version_min 10, 12    .global    _main    .align    4, 0x90_main:                                  ## @main    .cfi_startproc## BB#0:    pushq    %rbpLtmp0:    .cfi_def_cfa_offset 16Ltmp1:    .cfi_offset %rbp, -16    movq    %rsp, %rbpLtmp2:    .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_literalsL_.str:                                 ## @.str    .asciz    "%s %d \n"  .subsections_via_symbols
Each indented line in the above code corresponds to a single machine instruction. For example, the pushq instruction indicates that the contents of register %rbp should be pushed onto the program stack. All information about local variable names or data types has been stripped away. We still see a reference to the global variable s[]= “GeeksforGeeks”, since the compiler has not yet determined where in memory this variable will be stored.This article is contributed by Sahil Rajput. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
sagar0719kumar
system-programming
C Language
C++
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
fork() in C
Command line arguments in C/C++
Function Pointer in C
Substring in C++
Structures in C
Vector in C++ STL
Initialize a vector in C++ (6 different ways)
Inheritance in C++
Map in C++ Standard Template Library (STL)
C++ Classes and Objects