NASM/Intel वाक्यविन्यास में, mov r64, 0x...
स्थिरता के आधार पर a MOV encoding चुनता है। तत्काल ऑपरेटरों के साथ चयन करने के लिए चार हैं:
- 5 बाइट
mov r32, imm32
। (zero-extended to fill the 64-bit register like always)। एटी & टी: mov
/movl
- 6 बाइट
mov r/m32, imm32
। केवल स्मृति स्थलों के लिए उपयोगी है। एटी & टी: mov
/movl
- 7 बाइट
mov r/m64, sign-extended-imm32
। मेमोरी पर 8 बाइट्स स्टोर कर सकते हैं, या 64-बिट रजिस्टर को ऋणात्मक मान पर सेट कर सकते हैं। एटी & टी: mov
/movq
- 10 बाइट
mov r64, imm64
। एटी & टी (यह mov r32, imm32
रूप में एक ही opcode के REX.W = 1 संस्करण है): movabs
(बाइट मायने रखता है केवल रजिस्टर गंतव्यों के लिए कर रहे हैं, या मोड है कि एक एसआईबी बाइट या disp8 की जरूरत नहीं है को संबोधित/disp32:। बस opcode + ModR/एम + imm32)
गैस में कम से & टी वाक्य रचना
movabsq
साथ का मतलब मशीन है कि -कोड एन्कोडिंग में 64-बिट मान होगा: या तो तत्काल निरंतर, या एक पूर्ण स्मृति पता।movabsq
के बिना, यह नहीं कर सकता।
इनमें से कुछ what's new in x86-64 guide में AT & टी सिंटैक्स का उपयोग करके उल्लेख किया गया है।
movq
हमेशा 7-बाइट फॉर्म है, इसलिए mov $1, %rax
का उपयोग न करें जब तक कि आप संरेखण उद्देश्यों के लिए लंबे निर्देश नहीं चाहते (बाद में एनओपी के साथ पैडिंग के बजाय)। 5-बाइट फॉर्म प्राप्त करने के लिए mov $1, %eax
का उपयोग करें।
दिलचस्प प्रयोग: movq $0xFFFFFFFF, %rax
क्योंकि यह एक साइन-विस्तारित 32-बिट तत्काल के साथ प्रदर्शनीय नहीं है, encodeable नहीं शायद है, और या तो imm64 एन्कोडिंग या %eax
गंतव्य एन्कोडिंग की जरूरत है।
movabs
तत्काल स्रोत के साथ हमेशा imm64 रूप है। (movabs
64-बिट पूर्ण पते और आरएक्स के साथ स्रोत या dest के रूप में एमओवी एन्कोडिंग भी हो सकता है: REX.W + A3
MOV moffs64, RAX
)।
कुछ इंटेल-वाक्य रचना अस्सेम्ब्लेर्स (लेकिन गैस), 5-बाइट mov r32, imm32
(एनएएसएम इस करता है) के लिए 32-बिट स्थिरांक का अनुकूलन, जबकि दूसरों (YASM की तरह) 7-बाइट mov r/m64, sign-extended-imm32
का उपयोग करेगा। वे दोनों एक विशेष निमोनिक का उपयोग किए बिना, केवल बड़े स्थिरांक के लिए imm64 एन्कोडिंग का चयन करते हैं।
मैं नहीं दिख रहा है कि कैसे मैं याद करने के लिए एक 64-बिट तत्काल मूल्य जा सकते हैं।
यह एक अलग सवाल है, और जवाब है: आप नहीं कर सकते। insn ref manual entry for MOV यह स्पष्ट करता है: एकमात्र रूप जिसमें एक imm64 तत्काल ऑपरेंड है केवल एक रजिस्टर गंतव्य है, आर/एम 64 नहीं।
अपने मूल्य एक साइन-बढ़ाया तत्काल 32-बिट में फिट बैठता है, तो movq $0x123456, 32(%rdi)
स्मृति के लिए एक 8 बाइट की दुकान करते हैं। सीमा यह है कि यह केवल एक imm32 है।
आपको इसे एक रजिस्टर में ले जाना है और फिर स्मृति में जाना है। यही सब है इसके लिए। –