2010-05-18 23 views
10

मैं अपने असेंबलर को फिर से लिखने के बीच में हूं। इसके दौरान मैं भी disassembly को लागू करने के बारे में उत्सुक हूँ। मैं इसे सरल और कॉम्पैक्ट बनाना चाहता हूं, और ऐसा करने के दौरान मैं अवधारणाओं का फायदा उठा सकता हूं।x86 निर्देश एन्कोडिंग टेबल

ओपोड से शेष x86 निर्देश एन्कोडिंग निर्धारित करना संभव है (शायद उपसर्ग बाइट्स भी आवश्यक हैं)। मुझे पता है कि कई लोगों ने इसे करने के लिए टेबल लिखे हैं।

मुझे निमोनिक्स के बारे में कोई दिलचस्पी नहीं है लेकिन निर्देश एन्कोडिंग है, क्योंकि यह वास्तव में एक वास्तविक समस्या है। प्रत्येक ऑपोड नंबर के लिए मुझे पता होना चाहिए:

  • क्या इस निर्देश में modrm है?
  • इस निर्देश में कितने तत्काल फ़ील्ड हैं?
  • क्या एन्कोडिंग तत्काल उपयोग करता है?
  • तत्काल क्षेत्र में एक निर्देशक सूचक-संबंधित पता है?
  • किस प्रकार के रजिस्ट्रार ऑपरेंड के लिए मॉडरम उपयोग करते हैं और फ़ील्ड पंजीकृत करते हैं?

sandpile.org कुछ हद तक मुझे चाहिए जो मुझे चाहिए, लेकिन यह प्रारूप में है जो पार्स करना आसान नहीं है।

इससे पहले कि मैं उन तालिकाओं को लिखना और मान्य करना शुरू कर दूं, मैंने इस सवाल को लिखने का फैसला किया। क्या आप कहीं इस तरह के टेबल के बारे में जानते हैं? एक ऐसे रूप में जिसे पार्स करने के लिए बहुत अधिक प्रयास की आवश्यकता नहीं है।

b byte 
w word 
v word or dword (or qword), depends on operand size attribute (0x66) 
z word or dword (or dword), depends on operand size attribute 
J instruction-relative address (next character describes type) 
G instruction group, has modrm-field (next character describes operand type) 
R has modrm-field (next two characters describe register and operand type) 
M modrm, but operand field must point to memory 
O direct offset (next character describes type) 
F FPU 
T separate table 
_ defined, but no arguments 

x 0 1 2 3 4 5 6 7 8 9 A B C D E F 
0 Rbb Rvv Rbb Rvv b z   Rbb Rvv Rbb Rvv b z   T 
1 Rbb Rvv Rbb Rvv b z   Rbb Rvv Rbb Rvv b z 
2 Rbb Rvv Rbb Rvv b z   Rbb Rvv Rbb Rvv b z 
3 Rbb Rvv Rbb Rvv b z   Rbb Rvv Rbb Rvv b z 
4 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
5 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
6 _ _ Mvv        z Rvvz b Rvvb 
7 Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb Jb 
8 Gbb Gvz Gbb Gvb Rbb Rvv Rbb Rvv Rbb Rvv Rbb Rvv  Mvv 
9 _ _ _ _ _ _ _ _      _ _ _ _ 
A Ob Ov Ob Ov _ _ _ _ b z _ _ _ _ _ _ 
B b b b b b b b b v v v v v v v v 
C Gbb Gvb w _           _ b _ _ 
D Gb Gv Gb Gv      F F F F F F F F 
E           Jz Jz  Jb 
F      _ _ Gb Gv _ _ _ _ _ _ Gb Gv 

यहां मुझे पहले ऑपरेंड के लिए टेबल मिल गई है। प्रारूप ऐसा है कि तालिका को को उस पाठ फ़ाइल से सीधे पार्स किया जा सकता है जिसमें यह शामिल है। मैंने कुछ सीआईएससी और विभाजन से संबंधित निर्देशों को छोड़ दिया।

दो बाइट निर्देशों के लिए मुझे चार ऐसी सारणी की आवश्यकता है। तीन बाइट निर्देशों के लिए मुझे दो तालिकाओं की आवश्यकता होगी। एफपीयू निर्देशों के लिए 8 टेबल की आवश्यकता होती है, जो सौभाग्य से बहुत सरल हैं। उसके बाद मुझे x86 निर्देशों का बहुत बड़ा हिस्सा शामिल होगा। हालांकि मैं सिर्फ एक या दो टेबल के साथ ठीक हूं।

आगे, कुछ निर्देश समूहों को निर्देश प्रकार को पहचानने के लिए कुछ छोटे सरणी की आवश्यकता हो सकती है।

उत्तर

8

मेरा मानना ​​है कि ref.x86asm.net जो हो सकता है वह हो सकता है। यह एक एक्सएमएल प्रारूप में सभी x86-64 निर्देशों की एक सूची है जो पार्स करना आसान होना चाहिए।

+0

जिसमें पूर्ण असेंबलर के लिए पर्याप्त जानकारी है। मुझे लगता है कि यह पर्याप्त अच्छी मेज है। चलिए देखते हैं कि मैं इसके आधार पर कोड जेनरेटर बना सकता हूं या नहीं। – Cheery

5

आईआईआरसी फ्री पास्कल कंपाइलर के आंतरिक असेंबलर के लिए, हमने शुरुआत में NASM स्रोतों से निकाली गई सारणी का उपयोग किया था।

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