C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

gccのC/C ++ソースからアセンブラ出力を取得するにはどうすればよいですか?


ここでは、gccを使用してCまたはC++コードからアセンブラー出力を生成する方法を説明します。

gccは、実行中にソースコードからすべての中間出力を取得するための優れた機能を提供します。アセンブラ出力を取得するには、gccにオプション「-S」を使用できます。このオプションは、コンパイル後、アセンブラーに送信する前の出力を表示します。このコマンドの構文は次のとおりです。

gcc –S program.cpp

では、出力方法を見てみましょう。ここでは、簡単なプログラムを使用しています。このプログラムでは、2つの数値が変数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

  1. LinuxにC++コンパイラをインストールする方法は?

    LinuxでC++をコンパイルする方法はいくつかあります。それらのうちの2つを見てみましょう- GCC ほとんどすべてのLinuxディストリビューションにはGCCがインストールされています。コマンドラインから次のコマンドを入力して、GCCがシステムにインストールされているかどうかを確認します- $ g++ -v GCCをインストールしている場合は、次のようなメッセージが出力されます- Using built-in specs. Target: i386-redhat-linux Configured with: ../configure --prefix=/usr ....... Thr

  2. PHPのパスからファイル名を取得するにはどうすればよいですか?

    パスからファイル名を取得するには、コードは次のとおりです- 例 <?php    $file = pathinfo('/home/cg/root/6985034/main.php');    echo $file['basename'], "\n"; ?> 出力 これにより、次の出力が生成されます- main.php 例 別の例を見てみましょう- <?php    $path = "/home/cg/root/6985034/main.php"