g++ как получить ассемблерный код?

 Как с помощью g++ получить ассемблерный код?

ЛЕГКО!
исходный код - 

int sum_a(int &a, int &b)
{
  return a + b;
}
int main()
{
  int a{2};
  int b{3};
  int res{0};
  res = sum_a(a, b);
  return 0;
}

после выполнения команды - "g++ -S main.cpp" будет создан файл main.s  cодержание которого ниже.
  .file "main.cpp"
  .text
  .globl _Z5sum_aRiS_
  .type _Z5sum_aRiS_, @function
_Z5sum_aRiS_:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movq %rdi, -8(%rbp)
movq %rsi, -16(%rbp)
movq -8(%rbp), %rax
movl (%rax), %edx
movq -16(%rbp), %rax
movl (%rax), %eax
addl %edx, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size _Z5sum_aRiS_, .-_Z5sum_aRiS_
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $32, %rsp
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
movl $2, -20(%rbp)
movl $3, -16(%rbp)
movl $0, -12(%rbp)
leaq -16(%rbp), %rdx
leaq -20(%rbp), %rax
movq %rdx, %rsi
movq %rax, %rdi
call _Z5sum_aRiS_
movl %eax, -12(%rbp)
movl $0, %eax
movq -8(%rbp), %rcx
xorq %fs:40, %rcx
je .L5
call __stack_chk_fail@PLT
.L5:
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0"
.section .note.GNU-stack,"",@progbits


после выполнения команды - "g++ -S main.cpp -O2"
.file "main.cpp"
.text
.p2align 4,,15
.globl _Z5sum_aRiS_
.type _Z5sum_aRiS_, @function
_Z5sum_aRiS_:
.LFB0:
.cfi_startproc
movl (%rsi), %eax
addl (%rdi), %eax
ret
.cfi_endproc
.LFE0:
.size _Z5sum_aRiS_, .-_Z5sum_aRiS_
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
xorl %eax, %eax
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0"
.section .note.GNU-stack,"",@progbits

Кроме того можно дизасемблировать исполняемый файл, и лучше всего если он будет собран с помощью аргумента -g
g++ -g main.cpp -o main
objdump -S --disassemble main > main.dump
в результате в файле main.dump получим все что нужно в виде ассемблера.

А с помощью этих команд можно сгенерировать ассемблерный код с номерами линий кода С++
c++ -S -fverbose-asm -g -O2 main.cpp -o main.s
as -alhnd main.s > main.lst


Список всех комманд использованных в этом сообщении:
1)  g++ -S main.cpp
2)  g++ -S main.cpp -O2

3)  g++ -g main.cpp -o main
      objdump -S --disassemble main > main.dump

4)  c++ -S -fverbose-asm -g -O2 main.cpp -o main.s
      as -alhnd main.s > main.lst

Комментарии

  1. mens titanium braclets - TITIAN ART - TITIAN ART - TITIAN ART
    Mens titanium braclets. These are 2020 ford ecosport titanium the very best of all the best at TITE ART. If titanium earrings hoops you are interested apple watch titanium vs aluminum in working titanium white wheels at TITE ART, you may be titanium post earrings interested in

    ОтветитьУдалить

Отправить комментарий