2012-04-15 12 views
12

पर एक्सएमएम रजिस्टर से पैक किए गए डबलवर्ड पूर्णांक को धक्का देने का कोई तरीका है? और फिर बाद में जरूरत पड़ने पर इसे वापस पॉप पर?
पुश एक्सएमएम स्टैक

आदर्श रूप में मैं PUSH या सामान्य प्रयोजन रजिस्टरों के लिए पॉप की तरह कुछ के लिए देख रहा हूँ, मैं इंटेल मैनुअल जाँच कर ली है, लेकिन मैं या तो आदेश चूक या वहाँ एक नहीं है ...

या मैं करना होगा सामान्य रजिस्टरों को मान अनपैक करें और फिर उन्हें धक्का दें?

उत्तर

20

नहीं, 86 के तहत कोई इस तरह के एक एएसएम अनुदेश है, लेकिन आप की तरह कुछ कर सकते हैं:

//Push xmm0 
sub  esp, 16 
movdqu dqword [esp], xmm0 

//Pop xmm0 
movdqu xmm0, dqword [esp] 
add  esp, 16 

संपादित करें:

ऊपरी कोड नमूना प्रत्यक्ष धक्का/पॉप अनुकरण है।

मामले कि आप ढेर भी अन्य स्थानीय चर पर प्रयोग कर रहे हैं, ebp रजिस्टर से होना चाहिए में पहली बार में ठीक से की तरह सेट,:

push ebp 
mov ebp, esp 
sub esp, LocaStackVariablesSize 
//... your code 
mov esp, ebp 
pop ebp 
ret 

उस मामले तुम भी डेनियल समाधान का उपयोग कर सकते हैं!

+0

आपके उत्तर के लिए धन्यवाद। उस पर आधारित (आपका समाधान बिल्कुल काम नहीं करता) मैं एक कामकाजी व्यक्ति के साथ आया (मेरा प्रश्न देखें)। अभी भी उत्तर के रूप में चिह्नित ... –

+0

@Daniel Gruszczyk: हाँ आप भी ebp का उपयोग कर सकते हैं, लेकिन सुनिश्चित करें कि ebp रजिस्टर ठीक से सेट है। याद रखें कि अन्य पुश या कॉल निर्देश स्टैक पर आपके डेटा को ओवरराइट कर सकते हैं यदि ईबीपी सही तरीके से सेट नहीं है। –

+2

इस प्रश्न को देखने वाले भविष्य के उपयोगकर्ताओं की सहायता के लिए, जो आपको अंततः काम करने के लिए मिला है, के जवाब को संपादित करने के लायक हो सकता है। –