Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วิธีดู Assembler Output จาก C/C++ Source ใน GCC

บทนำ

นี่คือวิธีสร้าง assembler output จากโค้ด C หรือ C++ โดยใช้ GCC

GCC มีฟีเจอร์ที่ดีสำหรับดู intermediate outputs ทั้งหมดจากซอร์สโค้ดระหว่างการคอมไพล์ เพื่อดู assembler output ใช้ตัวเลือก '-S' กับ GCC ตัวเลือกนี้แสดงผลลัพธ์หลังคอมไพล์แต่ก่อนส่งให้ assembler รูปแบบคำสั่งคือ:

gcc –S program.cpp

มาดูว่าผลลัพธ์จะเป็นอย่างไร เราใช้โปรแกรมง่ายๆ ที่เก็บตัวเลขสองตัวใน x และ y แล้วบวกเก็บใน sum และพิมพ์ผลลัพธ์

ตัวอย่างโค้ด

#include <iostream>
using namespace std;

int main() {
    int x, y, sum;
    x = 50;
    y = 60;
    sum = x + y;
    cout << "Sum is: " << sum << endl;
    return 0;
}

ผลลัพธ์ (Assembler Output)

    .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