2012-11-13 101 views
5

मैं एएसएम अवधारणाओं में शामिल होने की कोशिश कर रहा हूं और एमएसवीसी द्वारा उत्पन्न किए गए डिस्सेप्टर्स को देखते हुए वहां कुछ ऐसा है जो मैं पूरी तरह से समझ नहीं सकता।सभी रजिस्टरों के बाद एमएसवीसी कंपाइलर व्यवहार का उपयोग किया जाता है

#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 का उपयोग करता है, लेकिन यह "वैश्विक चर" जैसा कुछ है, या यह वर्तमान में एक चर है केवल दायरा (फ्रेम)?

अग्रिम धन्यवाद।

+2

आपको * पंजीकरण स्पिलिंग * में देखना चाहिए, इस प्रकार अधिकांश कंपेलरों को मुफ्त रजिस्टरों से बाहर चलने में मदद मिलती है (इस पर कई मामले हैं, ऑप्टिमाइज़ेशन स्तरों के आधार पर, उत्पन्न होने वाले कोड, यदि एसएसए का उपयोग किया जाता है आदि)। – Necrolis

+0

ऐसा लगता है कि "पंजीकरण स्पिलिंग" शब्द की आवश्यकता थी। धन्यवाद। – benji

उत्तर

4

एमएसवीसी रजिस्टरों को उचित मेमोरी में फैलाएगा: स्टैक पर जब यह एक रजिस्टर को फैलता है जिसमें ब्लॉक स्कोप के साथ एक चर होता है, या एक निश्चित ऑफ़सेट पर जब रजिस्टर वैश्विक होता है। किसी भी समय, कंपाइलर जानता है कि कौन से चर पंजीकृत हैं।

आप स्थानीय चर को वैश्विक स्मृति में नहीं फैला सकते हैं क्योंकि धागे और पुनर्वितरण के कारण उनमें से एक अप्रत्याशित संख्या हो सकती है। एक कंपाइलर एक वैश्विक चर को अस्थायी रूप से एक स्टैक स्लॉट में फैलाने में सक्षम हो सकता है, लेकिन यह थ्रेड की उपस्थिति में काफी जटिल है।

+0

आह, अब समझ में आता है। बहुत बहुत धन्यवाद। – benji