কম্পিউটার টিউটোরিয়াল

সি/সি++ কোডকে অ্যাসেম্বলি ল্যাঙ্গুয়েজে কনভার্ট করা

এখানে দেখব gcc ব্যবহার করে সি বা সি++ সোর্স কোড থেকে অ্যাসেম্বলি ল্যাঙ্গুয়েজ আউটপুট কীভাবে পাওয়া যায়।

gcc একটি চমৎকার ফিচার দেয় সোর্স কোড থেকে এক্সিকিউশন সময় সব ইন্টারমিডিয়েট আউটপুট পাওয়ার। অ্যাসেম্বলার আউটপুট পেতে '-S' অপশন ব্যবহার করতে হয়। এই অপশন কম্পাইলেশনের পর কিন্তু অ্যাসেম্বলার-এ পাঠানোর আগের আউটপুট দেখায়। কমান্ড সিনট্যাক্স:

gcc -S program.cpp

এখন দেখব আউটপুট কেমন দেখাবে। এখানে একটি সিম্পল প্রোগ্রাম ব্যবহার করা হয়েছে। দুটি সংখ্যা x ও y-তে স্টোর করা হয়, যোগফল অন্য ভেরিয়েবলে স্টোর করে প্রিন্ট করা হয়।

উদাহরণ কোড

#include <iostream>
using namespace std;
int 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. C/C++-তে putwchar() ফাংশন

  2. C/C++-তে memcpy() ফাংশন

  3. C/C++-তে স্ট্রিংকে ইন্টিজার অ্যারেতে কনভার্ট করা

  4. AA ট্রি: C/C++-তে ব্যালেন্সড ট্রি ডেটা স্ট্রাকচার