সমস্ত উত্তর চমৎকার। তবে তার শীর্ষে, আমি একটি উদাহরণ ভাগ করতে চাই।
নীচে একটি সামান্য সিপিপি প্রোগ্রাম:
#include <iostream>
int x;
int main(){
char buf[50];
x = 8;
if(x == 8)
printf("x is 8\n");
else
sprintf(buf, "x is not 8\n");
x=1000;
while(x > 5)
x--;
return 0;
}
এখন, উপরের কোডটির সমাবেশটি তৈরি করতে দিন (এবং আমি এখানে কেবল প্রাসঙ্গিকতার সেই অংশগুলিই প্রম্পট করব):
সমাবেশ উত্পন্ন করার আদেশ:
g++ -S -O3 -c -fverbose-asm -Wa,-adhln assembly.cpp
এবং সমাবেশ:
main:
.LFB1594:
subq $40, %rsp #,
.seh_stackalloc 40
.seh_endprologue
# assembly.cpp:5: int main(){
call __main #
# assembly.cpp:10: printf("x is 8\n");
leaq .LC0(%rip), %rcx #,
# assembly.cpp:7: x = 8;
movl $8, x(%rip) #, x
# assembly.cpp:10: printf("x is 8\n");
call _ZL6printfPKcz.constprop.0 #
# assembly.cpp:18: }
xorl %eax, %eax #
movl $5, x(%rip) #, x
addq $40, %rsp #,
ret
.seh_endproc
.p2align 4,,15
.def _GLOBAL__sub_I_x; .scl 3; .type 32; .endef
.seh_proc _GLOBAL__sub_I_x
আপনি সমাবেশে দেখতে পারেন যে সমাবেশ কোডটি তৈরি করা হয়নি sprintfকারণ সংকলকটি ধরে নিয়েছিল যে xপ্রোগ্রামের বাইরে পরিবর্তন হবে না। whileলুপের ক্ষেত্রেও একই অবস্থা । whileঅপ্টিমাইজেশনের কারণে লুপটি সম্পূর্ণরূপে অপসারণ করা হয়েছিল কারণ সংকলক এটি একটি অকেজো কোড হিসাবে দেখেছিল এবং এভাবে সরাসরি ( দেখায় ) নির্ধারিত 5হয় ।xmovl $5, x(%rip)
সমস্যা দেখা দেয় যখন যদি একটি বহিস্থিত প্রক্রিয়া / হার্ডওয়্যার মান পরিবর্তন হবে কি xমধ্যে কোথাও x = 8;এবং if(x == 8)। আমরা elseব্লকটি কাজ করার আশা করব তবে দুর্ভাগ্যক্রমে সংকলকটি সেই অংশটি ছাঁটাই করেছে।
এখন, এই সমাধানের জন্য, যাতে assembly.cpp, আমাদের পরিবর্তন করা যাক int x;করতে volatile int x;এবং দ্রুত উত্পন্ন সমাবেশ কোড দেখুন:
main:
.LFB1594:
subq $104, %rsp #,
.seh_stackalloc 104
.seh_endprologue
# assembly.cpp:5: int main(){
call __main #
# assembly.cpp:7: x = 8;
movl $8, x(%rip) #, x
# assembly.cpp:9: if(x == 8)
movl x(%rip), %eax # x, x.1_1
# assembly.cpp:9: if(x == 8)
cmpl $8, %eax #, x.1_1
je .L11 #,
# assembly.cpp:12: sprintf(buf, "x is not 8\n");
leaq 32(%rsp), %rcx #, tmp93
leaq .LC0(%rip), %rdx #,
call _ZL7sprintfPcPKcz.constprop.0 #
.L7:
# assembly.cpp:14: x=1000;
movl $1000, x(%rip) #, x
# assembly.cpp:15: while(x > 5)
movl x(%rip), %eax # x, x.3_15
cmpl $5, %eax #, x.3_15
jle .L8 #,
.p2align 4,,10
.L9:
# assembly.cpp:16: x--;
movl x(%rip), %eax # x, x.4_3
subl $1, %eax #, _4
movl %eax, x(%rip) # _4, x
# assembly.cpp:15: while(x > 5)
movl x(%rip), %eax # x, x.3_2
cmpl $5, %eax #, x.3_2
jg .L9 #,
.L8:
# assembly.cpp:18: }
xorl %eax, %eax #
addq $104, %rsp #,
ret
.L11:
# assembly.cpp:10: printf("x is 8\n");
leaq .LC1(%rip), %rcx #,
call _ZL6printfPKcz.constprop.1 #
jmp .L7 #
.seh_endproc
.p2align 4,,15
.def _GLOBAL__sub_I_x; .scl 3; .type 32; .endef
.seh_proc _GLOBAL__sub_I_x
এখানে আপনি দেখতে পারেন জন্য সমাবেশ কোড sprintf, printfএবং whileলুপ উত্পন্ন হয়। সুবিধাটি হ'ল xভেরিয়েবলটি যদি কোনও বাহ্যিক প্রোগ্রাম বা হার্ডওয়্যার দ্বারা পরিবর্তন করা হয় sprintfতবে কোডের কিছু অংশ কার্যকর করা হবে। এবং অনুরূপভাবে whileলুপটি এখন ব্যস্ততার জন্য ব্যবহৃত হতে পারে।