तो, मैं इस बारे में उलझन में हूं कि एक ऑपरेटिंग सिस्टम में कूद निर्देश कैसे काम करते हैं। मैंने सोचा कि कूद निर्देश प्रोसेसर के कार्यक्रम काउंटर में मूल्य निर्धारित करता है। लेकिन कार्यक्रम स्मृति में विभिन्न स्थानों में चलाया जा सकता है। मैं देखता हूं कि x86 में, JMP EAX
निर्देश है, लेकिन मेरा C++ कोड इसका उपयोग नहीं करता है।असेंबली में कूद निर्देश कई प्रक्रियाओं के साथ कैसे काम करता है?
int main()
{
int i = 0;
while (i < 10)
{
++i;
if (i == 7)
{
i += 1;
continue;
}
}
}
यह करने के लिए अनुवाद:: मैं कुलपति में ++ और कुछ सी ++ कोड संकलित
int main()
{
00411370 push ebp
00411371 mov ebp,esp
00411373 sub esp,0CCh
00411379 push ebx
0041137A push esi
0041137B push edi
0041137C lea edi,[ebp-0CCh]
00411382 mov ecx,33h
00411387 mov eax,0CCCCCCCCh
0041138C rep stos dword ptr es:[edi]
int i = 0;
0041138E mov dword ptr [i],0
while (i < 10)
00411395 cmp dword ptr [i],0Ah
00411399 jge main+47h (4113B7h)
{
++i;
0041139B mov eax,dword ptr [i]
0041139E add eax,1
004113A1 mov dword ptr [i],eax
if (i == 7)
004113A4 cmp dword ptr [i],7
004113A8 jne main+45h (4113B5h)
{
i += 1;
004113AA mov eax,dword ptr [i]
004113AD add eax,1
004113B0 mov dword ptr [i],eax
continue;
004113B3 jmp main+25h (411395h)
}
}
004113B5 jmp main+25h (411395h)
}
004113B7 xor eax,eax
004113B9 pop edi
004113BA pop esi
004113BB pop ebx
004113BC mov esp,ebp
004113BE pop ebp
004113BF ret
तो मैं उलझन में हूँ, आदेश jmp 411395h
के लिए, इस कार्यक्रम संकेत करता है हमेशा में एक ही स्थान में लोड किया जाता है याद? क्योंकि यह अजीब लगता है।
ध्यान रखें कि आधुनिक CPUs वर्चुअल मेमोरी का समर्थन करते हैं, जिसका अर्थ है कि प्रत्येक प्रोग्राम का अपना पता स्थान होता है। यही है, एक प्रक्रिया में 0x12345678 पर बाइट एक और प्रक्रिया में 0x12345678 पर बाइट की तुलना में वास्तविक स्मृति में एक अलग बिंदु हो सकता है। –