2012-11-12 12 views
7

मैं नीचे के रूप में स्टैक पर 64 बिट पता पुश करने के लिए चाहते हैं,धक्का

__asm("pushq $0x1122334455667788"); 

लेकिन मैं संकलन त्रुटि मिलती है और मैं केवल निम्नलिखित तरीके से धक्का कर सकते हैं,

__asm("pushq $0x11223344"); 
सकते हैं

कोई मेरी गलती को समझने में मेरी मदद करें?

मैं विधानसभा के लिए नया हूँ, इसलिए मुझे क्षमा करें कृपया मेरे सवाल बेवकूफ लग रहा है।

उत्तर

16

x86-64 कुछ रोचक quirks है, जो स्पष्ट भले ही आप 32-बिट 86 से परिचित हैं नहीं कर रहे हैं है ...

  1. अधिकांश निर्देश केवल एक 32-बिट तत्काल मूल्य ले सकते हैं, 64-बिट संदर्भ में उपयोग किए जाने पर 64 बिट्स पर साइन-विस्तार किया गया है। (। अनुदेश एन्कोडिंग भंडार केवल 32 बिट)

    इसका मतलब यह है कि आप रेंज 0x0 में immedate मूल्यों के लिए pushq उपयोग कर सकते हैं - 0x7fffffff (यानी सकारात्मक हस्ताक्षर किए 32-बिट मान जो साइन-बढ़ाया 0 बिट्स के साथ कर रहे हैं) या 0xffffffff80000000 - 0xffffffffffffffff) (यानी नकारात्मक 32-बिट मानों पर हस्ताक्षर किए गए हैं जो 1 बिट्स के साथ साइन-विस्तारित हैं)। लेकिन आप इस सीमा के बाहर मूल्यों का उपयोग नहीं कर सकते हैं (क्योंकि उन्हें निर्देश एन्कोडिंग में प्रतिनिधित्व नहीं किया जा सकता है)।

  2. mov एक विशेष मामला है: एक एन्कोडिंग है जो पूर्ण 64-बिट तत्काल ऑपरेंड लेती है। इसलिए डैनियल का जवाब (जो शायद आपकी सबसे अच्छी शर्त है)।

  3. यदि आप वास्तव में एक रजिस्टर को दूषित नहीं करना चाहते हैं, तो आप छोटे मानों के एकाधिक धक्का का उपयोग कर सकते हैं। हालांकि, दो 32-बिट मानों को धक्का देने की स्पष्ट बात काम नहीं करेगी। 64-बिट दुनिया में, push एक 64 बिट संकार्य के साथ (विषय, ऊपर 1 बात करने के लिए अगर यह एक तत्काल निरंतर है) काम करेंगे, या एक 16 बिट संकार्य, लेकिन नहीं एक 32 बिट संकार्य (यहां तक ​​कि pushl %eax मान्य नहीं है)। तो सबसे अच्छा तुम कर सकते हो 4 16-बिट धक्का है:

    pushw $0x1122; pushw $0x3344; pushw $0x5566; pushw $0x7788

+7

टिप्पणी # 3 बात करने के लिए: '$ 8 subq,% आरएसपी; movl $ 0x55667788, (% आरएसपी); movl $ 11223344, 4 (% आरएसपी) 'भी काम करेगा। – Jester

+3

@ जेस्टर: पुशल $ 0x55667788; movl $ 11223344, 4 (% आरएसपी)? –

5

कोई एक 64-बिट तत्काल मूल्य लेने और ढेर पर जोर दे रहा है कि करने में सक्षम अनुदेश है।

9

आपका सबसे अच्छा शर्त इस तरह कुछ करने के लिए किया जाएगा।

movq $0x1122334455667788, %rax 
pushq %rax 

बदलें %rax किसी अन्य 64-बिट के साथ आप उचित लगता है रजिस्टर।

संबंधित मुद्दे