কম্পিউটার

আপনি কিভাবে জিসিসিতে C/C++ উৎস থেকে অ্যাসেম্বলার আউটপুট পাবেন?


এখানে আমরা দেখব কিভাবে Gcc ব্যবহার করে C বা C++ কোড থেকে অ্যাসেম্বলার আউটপুট তৈরি করা যায়।

কার্যকর করার সময় একটি সোর্স কোড থেকে সমস্ত মধ্যবর্তী আউটপুট পেতে জিসিসি একটি দুর্দান্ত বৈশিষ্ট্য সরবরাহ করে। অ্যাসেম্বলার আউটপুট পেতে আমরা 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

  1. POSIX ব্যবহার করে কিভাবে একটি কমান্ড নির্বাহ করবেন এবং C++ এর মধ্যে কমান্ডের আউটপুট পাবেন?

  2. আপনি কিভাবে C/C++ এ কিছুটা সেট, পরিষ্কার এবং টগল করবেন?

  3. কিভাবে লিনাক্সে C++ কম্পাইলার ইনস্টল করবেন?

  4. পিএইচপি-তে একটি পথ থেকে ফাইলের নাম কিভাবে পেতে হয়?