C/C++

 

 

 

 

generate asm

 

You can generate assembly code from the source code or object file. However the way to do it would be different depending on what kind of compiler you use. In this page, I will describe the assembly code generation with gcc.

 

 

Method 1 :

 

The first method is to generate assembly code from C  source code. The command in gcc compiler is as follows

    Command Format : 'gcc -S sourcefile.c'.

Let's see one example.

 

HelloWorld.c  // Soure code file and contents

 

#include <stdio.h>

 

int main()

{

    

    printf("Hello World !");

    

    return 0;

}

 

 

Check the source code file in the folder

 

c:\Samples>dir

 Volume in drive C is Windows

 Volume Serial Number is F8D3-F022

 

 Directory of c:\RyuCloud\C\Samples

 

01/12/2017  05:40 PM    <DIR>          .

01/12/2017  05:40 PM    <DIR>          ..

09/19/2016  03:37 PM                85 HelloWorld.c

 

 

Generate the assembly code as shown below

 

c:\Samples> gcc.exe -S HelloWorld.c

 

 

Confirm that the assembly file (*.s) is generated

 

c:\Samples>dir

 Volume in drive C is Windows

 Volume Serial Number is F8D3-F022

 

 Directory of c:\RyuCloud\C\Samples

 

01/12/2017  05:40 PM    <DIR>          .

01/12/2017  05:40 PM    <DIR>          ..

09/19/2016  03:37 PM                85 HelloWorld.c

01/12/2017  06:01 PM               526 HelloWorld.s   

 

 

If you open HelloWorld.s, you would get the assembly code as shown below

 

    .file   "HelloWorld.c"

    .def    __main; .scl    2;  .type   32; .endef

    .section .rdata,"dr"

.LC0:

    .ascii "Hello World !\0"

    .text

    .globl  main

    .def    main;   .scl    2;  .type   32; .endef

    .seh_proc   main

main:

    pushq   %rbp

    .seh_pushreg    %rbp

    movq    %rsp, %rbp

    .seh_setframe   %rbp, 0

    subq    $32, %rsp

    .seh_stackalloc 32

    .seh_endprologue

    call    __main

    leaq    .LC0(%rip), %rcx

    call    printf

    movl    $0, %eax

    addq    $32, %rsp

    popq    %rbp

    ret

    .seh_endproc

    .ident  "GCC: (tdm64-1) 4.9.2"

    .def    printf; .scl    2;  .type   32; .endef

 

 

Method 2 :

 

The second method is to extract assembly code from a object file and the command is as follows.

    Command Format : objdump -d -M CPU_name -S objectfile.o

 

HelloWorld.c  // Soure code file and contents

 

#include <stdio.h>

 

int main()

{

    

    printf("Hello World !");

    

    return 0;

}

 

 

Check the source code file in the folder

 

c:\Samples>dir

 Volume in drive C is Windows

 Volume Serial Number is F8D3-F022

 

 Directory of c:\RyuCloud\C\Samples

 

01/12/2017  05:40 PM    <DIR>          .

01/12/2017  05:40 PM    <DIR>          ..

09/19/2016  03:37 PM                85 HelloWorld.c

 

 

Generate the object file

 

c:\Samples> gcc.exe -g -c HelloWorld.c

 

 

Check the object file in the folder

 

c:\Samples>dir

 Volume in drive C is Windows

 Volume Serial Number is F8D3-F022

 

 Directory of c:\RyuCloud\C\Samples

 

01/12/2017  05:40 PM    <DIR>          .

01/12/2017  05:40 PM    <DIR>          ..

09/19/2016  03:37 PM                85 HelloWorld.c

01/12/2017  06:53 PM             2,055 HelloWorld.o  

 

 

Generate the asm code

 

c:\Samples> objdump -d -M intel -S HelloWorld.o

 

 

HelloWorld.o:     file format pe-x86-64

 

 

Disassembly of section .text:

 

0000000000000000 <main>:

#include <stdio.h>

 

int main()

{

   0:   55                      push   rbp

   1:   48 89 e5                mov    rbp,rsp

   4:   48 83 ec 20             sub    rsp,0x20

   8:   e8 00 00 00 00          call   d <main+0xd>

 

        printf("Hello World !");

   d:   48 8d 0d 00 00 00 00    lea    rcx,[rip+0x0]        # 14 <main+0x14>

  14:   e8 00 00 00 00          call   19 <main+0x19>

 

        return 0;

  19:   b8 00 00 00 00          mov    eax,0x0

}

  1e:   48 83 c4 20             add    rsp,0x20

  22:   5d                      pop    rbp

  23:   c3                      ret

  24:   90                      nop

  25:   90                      nop

  26:   90                      nop

  27:   90                      nop

  28:   90                      nop

  29:   90                      nop

  2a:   90                      nop

  2b:   90                      nop

  2c:   90                      nop

  2d:   90                      nop

  2e:   90                      nop

  2f:   90                      nop