সমস্ত উত্তর চমৎকার। তবে তার শীর্ষে, আমি একটি উদাহরণ ভাগ করতে চাই।
নীচে একটি সামান্য সিপিপি প্রোগ্রাম:
#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
হয় ।x
movl $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
লুপটি এখন ব্যস্ততার জন্য ব্যবহৃত হতে পারে।