2013-02-05 67 views
25

x64 asm कोड में एक पूर्ण निर्देश की आवश्यकता होगी बाइट्स की अधिकतम संख्या क्या है?x86_64 एएसएम - एक निर्देश के लिए अधिकतम बाइट्स?

कुछ पता करने के लिए एक कूद की तरह 9 बाइट तक पर कब्जा कर सकते हैं मुझे लगता है: एफएफ 00 00 00 00 11 12 3F 1F लेकिन है कि अगर एक x64 अनुदेश

उपयोग कर सकते हैं बाइट्स की अधिकतम संख्या है मैं नहीं जानता
+8

(http://en.wikipedia.org/wiki/Instruction_set) –

+1

नोट [86 पर सबसे लंबे समय तक संभव अनुदेश 15 बाइट्स] कि, यह संभव है, जबकि एक ही निर्देश का निर्माण करें जो 15 बाइट्स (उपसर्गों का एक समूह उपयोग करके) से अधिक होना चाहिए, x86 निर्देश डिकोडर फ्रंटएंड इस पर चकित होगा। 15 बाइट एक कठिन सीमा है। – duskwuff

उत्तर

30

x86 निर्देश सेट (16, 32 या 64 बिट, सभी प्रकार/मोड) गारंटी/आवश्यकता है कि निर्देश अधिकतम 15 बाइट्स हैं। इससे परे कुछ भी "अमान्य ऑपोड" देगा। आप अनावश्यक उपसर्गों का उपयोग किए बिना इसे प्राप्त नहीं कर सकते हैं (उदाहरण के लिए एकाधिक 0x66 या 0x67 उपसर्ग, उदाहरण के लिए)। इसलिए यदि आप एक से अधिक 31 बिट्स आगे कूद करना चाहता था/पिछड़े - (movabs $12345678ABCDEF00, %reg: टी वाक्य रचना & पर, mov reg, 12345678ABCDEF00h इंटेल सिंटेक्स)

केवल अनुदेश है कि वास्तव में एक डेटा आइटम के रूप में 64-बिट लेता है रजिस्टर करने के लिए लोड स्थिर है , यह एक रजिस्टर में लक्षित स्थान का एक कदम होगा, और फिर रजिस्टर/कॉल पर कूदें। 32-बिट तत्काल और विस्थापन का उपयोग करना (सापेक्ष कूद और संबोधित मोड में) 64-बिट मोड में कई निर्देशों पर चार बाइट बचाता है।

+3

'mov' के रूप भी हैं जो एक पूर्ण 64-बिट पता ले सकते हैं, जो 'moffs' को ऑपरेंड के रूप में लेते हैं। लेकिन वे केवल संचयक से/स्थानांतरित कर सकते हैं, इसलिए उनके लिए अधिकतम उपयोगी लंबाई अभी भी केवल 11 बाइट्स है (पता के लिए 8, ओपोड के लिए 1, 64- या 16-बिट ऑपरेंड आकार के लिए 1, और 1 के लिए एफएस या जीएस सेगमेंट ओवरराइड)। – ughoavgfhw

15

इंटेल 64 और IA-32 आर्किटेक्चर सॉफ्टवेयर डेवलपर की मैनुअल से:

2.3.11 AVX निर्देश लंबाई

एक इंटेल 64 और IA-32 अनुदेश आर की अधिकतम लंबाई 15 बाइट्स emains।

आप 15 से अधिक बाइट्स को एन्कोड करने वाले निर्देशों का निर्माण कर सकते हैं, लेकिन ऐसे निर्देश अवैध होंगे और शायद निष्पादित नहीं होंगे।

18

प्रश्न है, x86 निर्देश सेट में सबसे लंबा संभव निर्देश क्या है?

उत्तर: आप असीमित बाइट्स के साथ एक वैध x86 निर्देश बना सकते हैं!

यह सही है, आप एक संपूर्ण 64K रॉम छवि को एक वैध निर्देश से भर सकते हैं। अधिक विशिष्ट होने के लिए, 8086 निर्देशों की लंबाई की कोई सीमा नहीं है। ठंडा! दुर्भाग्यवश, 15 दिन से अधिक लंबे समय तक निर्देशों को डीकोड करने का प्रयास करते समय आधुनिक दिन i386 प्रकार सामान्य सुरक्षा गलती फेंक देते हैं।

तो असीमित-लंबे-लेकिन-मान्य 8086 निर्देश कैसा दिखता है? वास्तव में किंडा उबाऊ। आप opcodes के सामने अनावश्यक उपसर्ग का उपयोग करके केवल असीमित लंबे निर्देश बना सकते हैं। निर्देश उपसर्ग एक निर्देश की शुरुआत में प्री-पेंड बाइट्स हैं जो किसी निर्देश द्वारा उपयोग किए गए डिफ़ॉल्ट पता आकार, डेटा आकार या सेगमेंट रजिस्टरों को संशोधित कर सकते हैं।

उदाहरण के लिए, आप अहानिकर देख अनुदेश ले जा सकते हैं:

89 E5    mov %sp,%bp 

और यह एक बहुत लंबा अनुदेश में बदल जाते हैं:

66 66 66 66 … 66 66 89 E5    mov %sp,%bp 

अब जब कि सिर्फ बुराई है।

https://web.archive.org/web/20131109063453/https://www.onlinedisassembler.com/blog/?p=23


एक और लंबे अनुदेश दोहरा उपसर्गों

कुछ मामलों में यह वैध निर्देश है कि पारंपरिक 15-बाइट लंबाई सीमा से अधिक सांकेतिक शब्दों में बदलना संभव है में बिना। उदाहरण के लिए:

; 16-bit mode 
    F2 F0 36 66 67 81 84 24 disp32 imm32 = xaquire lock add [ss:esp*1+disp32],imm32 
    F3 F0 36 66 67 81 84 24 disp32 imm32 = xrelease lock add [ss:esp*1+disp32],imm32 

    ; 16-bit mode 
    36 67 8F EA 78 12 84 24 disp32 imm32 = lwpins eax,[ss:esp*1+disp32],imm32 
    36 67 8F EA 78 12 8C 24 disp32 imm32 = lwpval eax,[ss:esp*1+disp32],imm32 
    36 67 8F EA 78 10 84 24 disp32 imm32 = bextr eax,[ss:esp*1+disp32],imm32 

    ; 64-bit mode 
    64 67 8F EA F8 12 84 18 disp32 imm32 = lwpins rax,[fs:eax+ebx+disp32],imm32 
    64 67 8F EA F8 12 8C 18 disp32 imm32 = lwpval rax,[fs:eax+ebx+disp32],imm32 
    64 67 8F EA F8 10 84 18 disp32 imm32 = bextr rax,[fs:eax+ebx+disp32],imm32 

http://www.sandpile.org/x86/opc_enc.htm

+0

इस उत्तर में समस्या क्या है? डाउन वोट –

+0

क्यों निर्देश सेट ने निर्देश की लंबाई पर कोई सीमा नहीं लगाई है। सीमा निर्देशक डीकोडर –

+4

द्वारा परिभाषित किया गया है 386 के लिए आईएसए और बाद में 15-बाइट सीमा लगाता है। 286 ने 10-बाइट सीमा लगाई। "अनंत" इंसिन लम्बाई चीज केवल 8086 पर काम करती है, न कि x86 (या x86-64), वास्तविक मोड में एक आधुनिक x86 CPU भी नहीं। आपके उत्तर के दूसरे भाग में "अन्यथा मान्य" होना चाहिए। आपने उस फुटनोट के नीचे छोड़ा, जो कहता है ** ** इन मामलों से बचने के लिए उपयोगकर्ता पर निर्भर है (और परिणामी # जीपी अपवाद)। ** –