GCC का -S फ्लैग सोर्स कोड से असेंबली आउटपुट (.s फाइल) जनरेट करता है।
कमांड
gcc -S program.c # C के लिए g++ -S program.cpp # C++ के लिए gcc -S -masm=intel program.c # इंटेल सिंटैक्स (डिफॉल्ट AT&T)
उदाहरण सोर्स
#include <iostream>
using namespace std;
int main() {
int x = 50, y = 60, sum;
sum = x + y;
cout << "Sum is: " << sum << endl;
return 0;
}
असेंबली आउटपुट (x86-64, AT&T सिंटैक्स, सरलीकृत)
.file "test.cpp"
.text
.globl main
.type main, @function
main:
.LFB0:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl $50, -12(%rbp) # x = 50
movl $60, -8(%rbp) # y = 60
movl -12(%rbp), %edx
movl -8(%rbp), %eax
addl %edx, %eax # sum = x + y
movl %eax, -4(%rbp)
leaq .LC0(%rip), %rsi # "Sum is: "
leaq _ZSt4cout(%rip), %rdi
call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@PLT
movl -4(%rbp), %esi
movq %rax, %rdi
call _ZNSolsEi@PLT # operator<<(int)
movq _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GOTPCREL(%rip), %rax
movq %rax, %rsi
movq %rax, %rdi
call _ZNSolsEPFRSoS_E@PLT
movl $0, %eax
leave
ret
मुख्य निर्देश समझाए गए
| निर्देश | अर्थ |
|---|---|
pushq %rbp | बेस पॉइंटर सेव करें |
movq %rsp, %rbp | नया स्टैक फ्रेम सेटअप |
subq $16, %rsp | लोकल वेरिएबल्स के लिए स्पेस |
movl $50, -12(%rbp) | x = 50 स्टोर करें |
addl %edx, %eax | x + y जोड़ें |
call ... | फंक्शन कॉल (cout ऑपरेटर्स) |
leave / ret | स्टैक फ्रेम रिस्टोर, रिटर्न |