Intel x86 Assembly Language & Microarchitecture
अस्सेम्ब्लेर्स
खोज…
माइक्रोसॉफ्ट असेंबलर - MASM
यह देखते हुए कि आईबीएम पीसी में 8086/8088 का उपयोग किया गया था, और उस पर ऑपरेटिंग सिस्टम सबसे अधिक बार Microsoft से था, माइक्रोसॉफ्ट के असेंबलर MASM कई वर्षों के लिए वास्तविक मानक था। इसने इंटेल के सिंटैक्स का बारीकी से पालन किया, लेकिन कुछ सुविधाजनक लेकिन "ढीले" सिंटैक्स की अनुमति दी (जो कि हिंडाइट में) केवल कोड में भ्रम और त्रुटियों का कारण बना।
एक आदर्श उदाहरण इस प्रकार है:
MaxSize EQU 16 ; Define a constant
Symbol DW 0x1234 ; Define a 16-bit WORD called Symbol to hold 0x1234
MOV AX, 10 ; AX now holds 10
MOV BX, MaxSize ; BX now holds 16
MOV CX, Symbol ; ????
क्या अंतिम MOV निर्देश में Symbol की सामग्री को CX में रखा गया है, या Symbol के पते को CX ? क्या CX 0x1234 या 0x0102 (या जो भी) के साथ समाप्त होता है? ऐसा लगता है कि CX साथ समाप्त होता है 0x1234 - अगर आप पता चाहते हैं, आप उपयोग करने की आवश्यकता OFFSET विनिर्देशक
MOV AX, [Symbol] ; Contents of Symbol
MOV CX, OFFSET Symbol ; Address of Symbol
इंटेल असेंबलर
इंटेल ने 8086 असेंबली लैंग्वेज के स्पेसिफिकेशन को लिखा, जो पहले 8080, 8008 और 4004 प्रोसेसर्स का व्युत्पन्न था। इस प्रकार, उन्होंने जो कोडांतरक लिखा था, उन्होंने अपने स्वयं के वाक्यविन्यास का ठीक-ठीक पालन किया। हालाँकि, इस कोडांतरक का व्यापक रूप से उपयोग नहीं किया गया था।
इंटेल ने अपने ऑपकोड को शून्य, एक या दो ऑपरेंड के रूप में परिभाषित किया। दो-ऑपरेंड निर्देशों को dest , source क्रम में परिभाषित किया गया था, जो उस समय अन्य कोडांतरकों से अलग था। लेकिन कुछ निर्देशों में निहित रजिस्टरों को ऑपरेंड के रूप में इस्तेमाल किया गया था - आपको बस यह जानना था कि वे क्या थे। इंटेल ने "उपसर्ग" opcodes की अवधारणा का भी उपयोग किया - एक ओपकोड अगले निर्देश को प्रभावित करेगा।
; Zero operand examples
NOP ; No parameters
CBW ; Convert byte in AL into word in AX
MOVSB ; Move byte pointed to by DS:SI to byte pointed to by ES:DI
; SI and DI are incremented or decremented according to D bit
; Prefix examples
REP MOVSB ; Move number of bytes in CX from DS:SI to ES:DI
; SI and DI are incremented or decremented according to D bit
; One operand examples
NOT AX ; Replace AX with its one's complement
MUL CX ; Multiply AX by CX and put 32-bit result in DX:AX
; Two operand examples
MOV AL, [0x1234] ; Copy the contents of memory location DS:0x1234 into AL register
इंटेल ने अन्य असेंबलरों द्वारा उपयोग किए गए एक सम्मेलन को भी तोड़ दिया: प्रत्येक ओपकोड के लिए, एक अलग मेनेमोनिक का आविष्कार किया गया था। उदाहरण के लिए: यह समान कार्यों के लिए subtly- या साफ़-अलग नामों आवश्यक LDM "मेमोरी से लोड करें" और के लिए LDI "तत्काल लोड" के लिए। इंटेल ने एक mnemonic MOV उपयोग किया - और असेंबलर से यह उम्मीद की कि वह संदर्भ से उपयोग करने के लिए कौन सा opcode उपयोग करे। कि भविष्य में प्रोग्रामर के लिए कई नुकसान और त्रुटियां पैदा हुईं, जब कोडांतरक यह नहीं बता सका कि प्रोग्रामर वास्तव में क्या चाहता है ...
एटी एंड टी असेंबलर - के रूप में
हालाँकि 8086 में Microsoft के साथ आईबीएम पीसी में सबसे अधिक उपयोग किया गया था, लेकिन कई अन्य कंप्यूटर और ऑपरेटिंग सिस्टम थे जो इसे भी उपयोग करते थे: सबसे विशेष रूप से यूनिक्स। यह एटी एंड टी का एक उत्पाद था, और इसमें पहले से ही कई अन्य आर्किटेक्चर पर यूनिक्स चल रहा था। उन आर्किटेक्चर ने अधिक पारंपरिक असेंबली सिंटैक्स का उपयोग किया - विशेष रूप से यह कि दो-ऑपरेंड निर्देशों ने उन्हें source , dest क्रम में निर्दिष्ट किया।
इसलिए एटी एंड टी असेंबलर कन्वेंशन इंटेल द्वारा निर्धारित सम्मेलनों को ओवररोड करता है, और x86 रेंज के लिए एक पूरी नई बोली पेश की गई:
- रजिस्टर नाम
%पहले उपसर्ग थे:
%al,%bxआदि। - तत्काल मान
$द्वारा पूर्वनिर्धारित थे:
$4 - संचालन
sourceमें थे,destक्रम - ओपकोड में उनके ऑपरेंड आकार शामिल थे:
movw $4, %ax ; Move word 4 into AX
बोरलैंड का टर्बो असेंबलर - टीएएसएम
बोरलैंड ने पास्कल संकलक के साथ शुरुआत की जिसे उन्होंने "टर्बो पास्कल" कहा। इसके बाद अन्य भाषाओं के लिए संकलक थे: C / C ++, Prolog और Fortran। उन्होंने "टर्बो असेंबलर" नामक एक असेंबलर का भी निर्माण किया, जो कि माइक्रोसॉफ्ट के नामकरण सम्मेलन के बाद, उन्होंने "टीएएसएम" कहा।
TASM ने एक निर्दिष्ट IDEAL मोड के तहत स्रोत कोड की अधिक सख्त व्याख्या प्रदान करके, MASM (ऊपर देखें) का उपयोग करके कोड लिखने की कुछ समस्याओं को ठीक करने का प्रयास किया। डिफ़ॉल्ट रूप से इसने MASM मोड को ग्रहण किया, इसलिए यह सीधे MASM स्रोत को इकट्ठा कर सकता है - लेकिन फिर बोरलैंड ने पाया कि उन्हें MASM के अधिक "quirky" आइडिओसिंक्रेसिस के साथ बग-फॉर-बग संगत होना था - इसलिए उन्होंने एक QUIRKS मोड भी जोड़ा।
चूंकि TASM, MASM की तुलना में बहुत सस्ता था, इसलिए इसका एक बड़ा उपयोगकर्ता आधार था - लेकिन बहुत से लोग आईडीईएएल मोड का उपयोग नहीं करते थे, बावजूद इसके टुटे हुए फायदे।
GNU असेंबलर - गैस
जब GNU प्रोजेक्ट को x86 परिवार के लिए एक असेंबलर की आवश्यकता होती है, तो वे AT & T वर्जन (और इसके सिंटैक्स) के साथ जाते हैं जो इंटेल / माइक्रोसॉफ्ट वर्जन के बजाय यूनिक्स से जुड़ा था।
नेटवाइड असेंबलर - एनएएसएम
NASM अब तक x86 आर्किटेक्चर के लिए सबसे अधिक पोर्टेड असेंबलर है - यह x86 के आधार पर व्यावहारिक रूप से हर ऑपरेटिंग सिस्टम के लिए उपलब्ध है (यहां तक कि MacOS के साथ शामिल किया गया है), और अन्य प्लेटफॉर्म पर क्रॉस-प्लेटफॉर्म असेंबलर के रूप में उपलब्ध है।
यह कोडर इंटेल सिंटैक्स का उपयोग करता है, लेकिन यह दूसरों से अलग है क्योंकि यह अपनी "मैक्रो" भाषा पर बहुत अधिक ध्यान केंद्रित करता है - यह प्रोग्रामर को सरल परिभाषाओं का उपयोग करके अधिक जटिल अभिव्यक्तियों का निर्माण करने की अनुमति देता है, जिससे नए "निर्देश" बनाए जा सकते हैं।
दुर्भाग्य से यह शक्तिशाली सुविधा लागत पर आती है: डेटा का प्रकार सामान्यीकृत निर्देशों के अनुसार प्राप्त होता है, इसलिए डेटा टाइपिंग को लागू नहीं किया जाता है।
response: db 'Y' ; Character that user typed
cmp response, 'N' ; *** Error! Unknown size!
cmp byte response, 'N' ; That's better!
cmp response, ax ; No error!
हालांकि, एनएएसएम ने एक विशेषता पेश की जिसमें दूसरों की कमी थी: स्कोप्ड प्रतीक नाम। जब आप अन्य असेंबलरों में किसी प्रतीक को परिभाषित करते हैं, तो वह नाम बाकी कोड में उपलब्ध होता है - लेकिन वह "नाम" का उपयोग करता है, प्रतीकों के साथ वैश्विक नाम स्थान को "प्रदूषण" करता है।
उदाहरण के लिए (NASM सिंटैक्स का उपयोग करके):
STRUC Point
X resw 1
Y resw 1
ENDSTRUC
इस परिभाषा के बाद, X और Y हमेशा के लिए परिभाषित हैं। X और Y नामों का "उपयोग" करने से बचने के लिए, आपको अधिक निश्चित नामों का उपयोग करने की आवश्यकता है:
STRUC Point
Pt_X resw 1
Pt_Y resw 1
ENDSTRUC
लेकिन NASM एक विकल्प प्रदान करता है। इसकी "स्थानीय चर" अवधारणा का लाभ उठाकर, आप संरचना क्षेत्रों को परिभाषित कर सकते हैं, जिसमें आपको भविष्य के संदर्भों में युक्त संरचना को नामांकित करने की आवश्यकता है:
STRUC Point
.X resw 1
.Y resw 1
ENDSTRUC
Cursor ISTRUC Point
ENDISTRUC
mov ax,[Cursor+Point.X]
mov dx,[Cursor+Point.Y]
दुर्भाग्य से, क्योंकि NASM प्रकारों का ट्रैक नहीं रखता है, आप अधिक प्राकृतिक वाक्यविन्यास का उपयोग नहीं कर सकते हैं:
mov ax,[Cursor.X]
mov dx,[Cursor.Y]
फिर भी एक और असेंबलर - YASM
YASM NASM का पूर्ण पुनर्लेखन है, लेकिन Intel और AT & T दोनों सिंटैक्स के साथ संगत है।