इसलिए मैंने कुछ समय पहले खुद को x86 असेंबली पढ़ाया और सी ++ में इनलाइन असेंबली के साथ खेल रहा था।फंक्शन में ऐरे वैल्यू बदलना - इनलाइन असेंबली
तो मैं जो करना चाहता हूं वह एक फ़ंक्शन पैरामीटर में है, एक सरणी में गुजरता है, एक अनुक्रमणिका (हस्ताक्षरित int) और एक संख्या। असेंबली के साथ यह मूल्य में पारित होने के लिए सरणी के उस स्मृति स्थान में मान को बदल देगा। तो कोड इस तरह दिखता है।
inline void Set(int pArray[], unsigned int pIndex, int pNum) {
__asm {
mov ebx, pIndex
mov eax, 4
mul ebx
mov ebx, pNum
lea edi, pArray
mov [ edi + eax ], ebx
}
}
int main() {
int myArray[ 5 ] = { 1, 2, 3, 4, 5 };
Set(myArray, 2, 7);
std::cout << myArray[ 2 ] << std::endl;
}
तो कोड, सरणी पते के शुरू होने से लोड करना चाहिए सूचकांक हो और 4 इसलिए स्मृति स्थान है कि कई बाइट्स द्वारा ले जाया जाता है से गुणा करें, और उस में भेजे गए मान के लिए बदल जाता है। हालांकि, जब मैं ऐसा करता हूं, मान वही रहता है। ऐसा क्यों है? क्या गलत हो रहा है?
आप शायद 'mov edi, pArray' चाहते हैं अन्यथा आप अपने तर्क चर के पते को लोड कर रहे हैं, जहां यह इंगित कर रहा है। आप खुद को डीबगर का उपयोग करके खुद को पढ़ाना चाहेंगे :) – Jester
यूप। वह समस्या थी। मैंने इसे मूल रूप से एक समारोह से लिखा था जहां सरणी को इसके दायरे में पहुंचा जा सकता था, इसलिए यह काम करता था, लेकिन जब समारोह में encapsulated यह काम करना बंद कर दिया तो यह बहुत समझ में आता है कि मुझे "mov" का उपयोग क्यों करना चाहिए था और नहीं "ली"। धन्यवाद :-) – CMilby