मैं एएसएम अवधारणाओं में शामिल होने की कोशिश कर रहा हूं और एमएसवीसी द्वारा उत्पन्न किए गए डिस्सेप्टर्स को देखते हुए वहां कुछ ऐसा है जो मैं पूरी तरह से समझ नहीं सकता।सभी रजिस्टरों के बाद एमएसवीसी कंपाइलर व्यवहार का उपयोग किया जाता है
#include <tchar.h>
#include <conio.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int v1 = 1;
int v2 = 2;
int v3 = 3;
int v4 = 4;
int v5 = 5;
int v6 = 6;
int v7 = 7;
int v8 = 8;
int v9 = 9;
int v10 = 10;
int v11 = 11;
int v12 = 12;
int v13 = 13;
int v14 = 14;
int v15 = 15;
int v16 = 16;
int sum = v1+v2 * (v3+v4 * (v5+v6 * (v7+v8 * (v9+v10 * (v11+v12 * (v13+v14 * (v15+v16)))))));
_getch();
return 0;
}
जो की तरह कुछ उत्पन्न करता है:
mov eax, v1
mov edx, v3
mov ecx, v5
mov ebx, v7
mov esi, v9
mov edi, v11 // all 6 available registers are filled
mov dword ptr [ebp-60h), eax // free eax <<<<<<
mov eax, v15 // fill it again
add eax, v16
imul eax, v12
(...)
तो, मेरे सवाल है: यहाँ अपने परीक्षण मामला है क्या संकलक करता है लाइन "< < < < < <" के साथ चिह्नित पर कर ? मेरा अनुमान है कि उसने रजिस्टर मान में स्टोर करने के लिए एक चर बनाया है। ऐसा लगता है कि यह स्टैक पर है क्योंकि यह ebp
का उपयोग करता है, लेकिन यह "वैश्विक चर" जैसा कुछ है, या यह वर्तमान में एक चर है केवल दायरा (फ्रेम)?
अग्रिम धन्यवाद।
आपको * पंजीकरण स्पिलिंग * में देखना चाहिए, इस प्रकार अधिकांश कंपेलरों को मुफ्त रजिस्टरों से बाहर चलने में मदद मिलती है (इस पर कई मामले हैं, ऑप्टिमाइज़ेशन स्तरों के आधार पर, उत्पन्न होने वाले कोड, यदि एसएसए का उपयोग किया जाता है आदि)। – Necrolis
ऐसा लगता है कि "पंजीकरण स्पिलिंग" शब्द की आवश्यकता थी। धन्यवाद। – benji