x86-64

2016-10-29 5 views
6

में movq और movabsq के बीच अंतर मैं यहां एक नवागत हूं और असेंबली भाषा का अध्ययन करना शुरू कर रहा हूं। तो कृपया मुझे सही करें अगर मैं गलत हूं, या यदि यह पोस्ट कोई समझ नहीं लेता है तो मैं हटा दूंगा।x86-64

मैं x86-64 इंटेल आर्किटेक्चर में डेटा आंदोलन निर्देशों के बारे में बात कर रहा हूं। मैंने पढ़ा है कि नियमित movq निर्देश में केवल तत्काल स्रोत ऑपरेंड हो सकते हैं जिन्हें 32-बिट दो की पूरक संख्या के रूप में प्रदर्शित किया जा सकता है, जबकि movabsq निर्देश में स्रोत स्रोत के रूप में मनमाने ढंग से 64-बिट तत्काल मूल्य हो सकता है और केवल एक रजिस्टर हो सकता है एक मंजिल।

क्या आप इस पर विस्तृत जानकारी दे सकते हैं? क्या इसका मतलब है कि मैं केवल movabsq निर्देश का उपयोग कर 64-बिट तत्काल मूल्य को स्थानांतरित कर सकता हूं? और केवल तत्काल मूल्य से रजिस्टर तक? मैं नहीं देखता कि मैं स्मृति के लिए 64-बिट तत्काल मान कैसे स्थानांतरित कर सकता हूं। या शायद मैं यहाँ कुछ महत्वपूर्ण गलत था।

+2

आपको इसे एक रजिस्टर में ले जाना है और फिर स्मृति में जाना है। यही सब है इसके लिए। –

उत्तर

11

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 + A3MOV 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 है।

+0

[रैक्स की तुलना में 64-बिट पते से दूसरे रजिस्टर में लोड करें] (http://stackoverflow.com/q/19415184/995714) –

+0

क्यों 'movq $ 0xFFFFFFFF,% rax' एन्कोडेबल नहीं है? 5-बाइट संस्करण क्यों काम नहीं करता है? –

+0

@ LưuVĩnhPhúc: क्योंकि आपने 'movq' का उपयोग किया था। 5-बाइट नो-आरईएक्स-उपसर्ग एन्कोडिंग का उपयोग करने के लिए गैस प्राप्त करने के लिए, आपको अपने आप को अनुकूलन करना होगा और 'movl $ 0xFFFFFFFF,% eax' लिखना होगा। तो यह वाईएएसएम की तरह है, और यह आपके लिए अनुकूलित नहीं करेगा। –

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

  • कोई संबंधित समस्या नहीं^_^