如何在 gcc 中從 C/C++ 原始碼中獲得彙編器輸出?


這裡我們將透過 gcc 瞭解如何從 C 或 C++ 程式碼生成彙編器輸出。

gcc 提供了從原始碼執行時獲取所有中間輸出的強大功能。我們可以使用 gcc 的“ -S”選項來獲取彙編器輸出。此選項會在編譯後但傳送到彙編器之前顯示輸出。此命令的語法如下。

gcc –S program.cpp

現在,讓我們看看輸出將是什麼樣子。這裡我們使用一個簡單的程式。在此程式中,將兩個數字儲存到變數 x 和 y 中,然後將總和儲存到另一個變數中,之後列印結果。

示例

#include <iostream>
using namespace std;
main() {
   int x, y, sum;
   x = 50;
   y = 60;
   sum = x + y;
   cout << "Sum is: " << sum << endl;
}

輸出

   .file "test_cpp.cpp"
   .text
   .section .rodata
   .type _ZStL19piecewise_construct, @object
   .size _ZStL19piecewise_construct, 1
_ZStL19piecewise_construct:
   .zero 1
   .local _ZStL8__ioinit
   .comm _ZStL8__ioinit,1,1
.LC0:
   .string "Sum is: "
   .text
   .globl main
   .type main, @function
main:
.LFB1493:
.cfi_startproc
pushq %rbp
   .cfi_def_cfa_offset 16
   .cfi_offset 6, -16
   movq %rsp, %rbp
   .cfi_def_cfa_register 6
   subq $16, %rsp
   movl $50, -12(%rbp)
   movl $60, -8(%rbp)
   movl -12(%rbp), %edx
   movl -8(%rbp), %eax
   addl %edx, %eax
   movl %eax, -4(%rbp)
   leaq .LC0(%rip), %rsi
   leaq _ZSt4cout(%rip), %rdi
   call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@PLT
   movq %rax, %rdx
   movl -4(%rbp), %eax
   movl %eax, %esi
   movq %rdx, %rdi
   call _ZNSolsEi@PLT
   movq %rax, %rdx
   movq
_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GOTPCREL(%rip),
   %rax
   movq %rax, %rsi
   movq %rdx, %rdi
   call _ZNSolsEPFRSoS_E@PLT
   movl $0, %eax
   leave
   .cfi_def_cfa 7, 8
   ret
   .cfi_endproc
.LFE1493:
   .size main, .-main
   .type _Z41__static_initialization_and_destruction_0ii, @function
_Z41__static_initialization_and_destruction_0ii:
.LFB1982:
   .cfi_startproc
   pushq %rbp
   .cfi_def_cfa_offset 16
   .cfi_offset 6, -16
   movq %rsp, %rbp
   .cfi_def_cfa_register 6
   subq $16, %rsp
   movl %edi, -4(%rbp)
   movl %esi, -8(%rbp)
   cmpl $1, -4(%rbp)
   jne .L5
   cmpl $65535, -8(%rbp)
   jne .L5
   leaq _ZStL8__ioinit(%rip), %rdi
   call _ZNSt8ios_base4InitC1Ev@PLT
   leaq __dso_handle(%rip), %rdx
   leaq _ZStL8__ioinit(%rip), %rsi
   movq _ZNSt8ios_base4InitD1Ev@GOTPCREL(%rip), %rax
   movq %rax, %rdi
   call __cxa_atexit@PLT
.L5:
   nop
leave
   .cfi_def_cfa 7, 8
   ret
   .cfi_endproc
.LFE1982:
   .size _Z41__static_initialization_and_destruction_0ii,
.-_Z41__static_initialization_and_destruction_0ii
.type _GLOBAL__sub_I_main, @function
_GLOBAL__sub_I_main:
.LFB1983:
   .cfi_startproc
   pushq %rbp
   .cfi_def_cfa_offset 16
   .cfi_offset 6, -16
   movq %rsp, %rbp
   .cfi_def_cfa_register 6
   movl $65535, %esi
   movl $1, %edi
   call _Z41__static_initialization_and_destruction_0ii
   popq %rbp
   .cfi_def_cfa 7, 8
   ret
   .cfi_endproc
.LFE1983:
   .size _GLOBAL__sub_I_main, .-_GLOBAL__sub_I_main
   .section .init_array,"aw"
   .align 8
   .quad _GLOBAL__sub_I_main
   .hidden __dso_handle
   .ident "GCC: (Ubuntu 7.3.0-16ubuntu3) 7.3.0"
   .section .note.GNU-stack,"",@progbits

更新於:30-Jul-2019

2 千 + 瀏覽量

開啟你的 職業生涯

完成課程即可獲得認證

立即開始
廣告
© . All rights reserved.