एटी एंड टी के मुकाबले इंटेल असेंबली सिंटैक्स की सीमाएं [बंद]


88

मेरे लिए, इंटेल सिंटैक्स पढ़ना बहुत आसान है। अगर मैं असेंबली फ़ॉरेस्ट के माध्यम से केवल इंटेल सिंटैक्स पर ध्यान केंद्रित करने में फंस जाता हूं, तो क्या मुझे कुछ याद होगा? क्या कोई कारण है जो मैं एटी एंड टी (अन्य एटी एंड टी विधानसभा को पढ़ने में सक्षम होने के बाहर) पर स्विच करना चाहूंगा? मेरा पहला सुराग यह है कि gdb डिफ़ॉल्ट रूप से AT & T का उपयोग करता है।

यदि यह मायने रखता है, तो मेरा ध्यान केवल किसी भी रिलेशन असेंबली और सिंटैक्स पर है, जिसमें लिनक्स / बीएसडी और सी भाषा हो सकती है।


11
मुझे 50 से अधिक वोट प्राप्त करने वाले गैर रचनात्मक प्रश्न पसंद हैं।
ceving

जवाबों:


80

वहाँ वास्तव में एक दूसरे के लिए कोई फायदा नहीं है। मैं सहमत हूँ कि इंटेल सिंटैक्स पढ़ना बहुत आसान है। ध्यान रखें कि, AFAIK, सभी GNU टूल्स में इंटेल सिंटैक्स का भी उपयोग करने का विकल्प है।

ऐसा लगता है कि आप इसके साथ GDB Intel सिंटैक्स का उपयोग कर सकते हैं:

disassembly- स्वाद इंटेल सेट करें

जीसीसी इंटेल सिंटैक्स के साथ कर सकता है -masm=intel


18
साथ ही, गूंज सेट डिस इंटेल >> ~ / .gdbinit
oevna

9
AT & T सिंटैक्स कम पठनीय कैसे है? मुझे लगता है कि "डॉर्ड" होने की तुलना में ऑपरेशन्स पर साइज़ प्रत्यय अधिक हैं। क्या मुझे कुछ और याद आ रहा है?
हॉकेन

54
lea -0x30(%rcx,%rax,8),%eaxके लिए सजायाफ्ता ATT है lea eax,[rcx+rax*8-0x30]। + और * का उपयोग वास्तव में इंटेल शैली में मदद करता है।
jørgensen

9
मैं उनके "कनविक्शन" को समान लेकिन अज्ञात के रूप में देखता हूं: यदि एटीटी अपारदर्शी है, तो इंटेल अस्पष्ट है। हालाँकि, infix अंकगणित बीजगणित छात्रों के लिए अधिक परिचित है, लेकिन यह वाक्य रचना से स्पष्ट नहीं है कि ऑपरेशन के लिए 4 तर्क हैं, या यह कि उनमें से केवल एक को गुणा किया जा सकता है, और न ही मामले में यह स्पष्ट है कि गुणक एक होना चाहिए की शक्ति 2.
बग

10
@ जब तक मैं इंटेल के "ptr" की तुलना में एटी एंड टी के प्रत्ययों को बेहतर पाता हूं क्योंकि आप हमेशा इसे निर्दिष्ट करते हैं और यह वास्तव में गलतियों की मात्रा को कम कर देता है (कम से कम मेरे लिए)। बाकी के बारे में (उदाहरण के लिए $ और% प्रतीक) .. हाँ .. वे सुखद नहीं हैं, और यह बात है, लेकिन उनके पास एक फायदा है: यह स्पष्ट है और एक बार फिर गलतियों को कम करता है। मैं कहूंगा कि एक पढ़ने (इंटेल) के लिए और दूसरा लेखन (एटी एंड टी) के लिए आरामदायक है।
मास्टरमैक्स

43

GNU असेंबलर (GAS) के लिए प्राथमिक सिंटैक्स AT & T है। इंटेल सिंटैक्स इसके अतिरिक्त अपेक्षाकृत नया है। लिनक्स कर्नेल में x86 असेंबली AT & T सिंटैक्स में है। लिनक्स की दुनिया में, यह सामान्य वाक्यविन्यास है। एमएस दुनिया में, इंटेल सिंटैक्स अधिक सामान्य है।

व्यक्तिगत रूप से, मुझे एटी एंड टी सिंटैक्स से नफरत है । GAS के साथ बहुत सारे मुफ्त असेंबलर्स (NASM, YASM) हैं जो Intel सिंटैक्स का भी समर्थन करते हैं, इसलिए लिनक्स में Intel सिंटैक्स करने में कोई समस्या नहीं होगी।

इसके अलावा, यह सिर्फ एक सिंटैक्टिक अंतर है। दोनों का परिणाम समान x86 मशीन कोड होगा।


25
सहमत और सहमत हुए। एटी एंड टी सिंटैक्स का उपयोग करना एक अपराध होना चाहिए, यह काउंटर-सहज और बदसूरत है, आप हर एक नंबर को उपसर्ग और $ और% के साथ रजिस्टर क्यों करना चाहेंगे, और रिवर्स एसआईबी नोटेशन में रिश्तेदार को संबोधित करना निर्दिष्ट करें, मैं इंटेल सिंटैक्स का उपयोग कर रहा हूं दो साल और अभी भी नहीं देख सकते हैं कि एटी एंड टी भी क्यों मौजूद है।
L̲̳̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e

11
यदि आप इसे बोल्ड में बताने जा रहे हैं तो कम से कम कुछ सबूत दें कि क्यों इंटेल इतना बेहतर है।
हॉकेन

8
@ हवन हेटर्स नफरत करने वाले हैं
गुंथर पाईज़

8
@Hawken क्या आप यह सुझाव दे रहे हैं कि वह बोल्ड प्रकार का इस्तेमाल करता है, वह किसी तरह से अपनी राय बता रहा है जैसे कि वह नहीं होता अगर वह बस बोल्ड छोड़ देता? सवाल व्यावहारिक रूप से इस तरह की राय-नेतृत्व वाली "बहस" को आमंत्रित कर रहा था, शायद यह अब बंद क्यों है!
इलियट

1
एआरएम के लिए इंटेल सिंटैक्स के बारे में कैसे?
ceving

33

वहाँ वास्तव में एक दूसरे के लिए कोई फायदा नहीं है। मैं इससे सहमत नहीं हूं कि इंटेल सिंटैक्स को पढ़ना बहुत आसान है, क्योंकि व्यक्तिगत रूप से मुझे आईआईटी सिंटैक्स से नफरत है । ध्यान रखें कि, AFAIK, सभी GNU टूल्स में इंटेल सिंटैक्स का भी उपयोग करने का विकल्प है।

at&t noprefix                   intel
mov eax, -4(ebp,edx,4)          mov DWORD PTR[-4 +ebp +edx *4], eax
mov eax, -4(ebp)                mov DWORD PTR[-4 +ebp], eax
mov edx, (ecx)                  mov DWORD PTR[ecx], edx
lea (   ,eax,4), eax            lea eax, DWORD PTR[8 + eax*4]
lea (eax,eax,2), eax            lea eax, DWORD PTR[eax*2+eax]

... और अधिक जटिल निर्देशों के साथ यह अधिक जटिल हो जाता है

'निफ ने कहा।

पुनश्च: यह उत्तर मुख्य रूप से कुछ अन्य उत्तरों में हाइलाइटिंग (आईएमएचओ) की कमजोरियों के कारण के लिए मौजूद है, जो वास्तव में उत्तर नहीं हैं, लेकिन राय हैं। और निश्चित रूप से वास्तविकता में यह जवाब केवल मेरी विनम्र राय है।

पीपीएस: मैं इंटेल सिंटैक्स से नफरत नहीं करता, मुझे बस परवाह नहीं है।


19
मैं बहुत उलझन में हूँ। क्या आप यह अनुमान लगा रहे हैं कि शब्द के आकार को स्पष्ट करने के लिए कभी भी & सिंटैक्स की आवश्यकता नहीं होती है? आपने मेरे उदाहरण की प्रतिलिपि क्यों बनाई और शब्द आकार और बेकार PTR चीज़ को जोड़ा? इसके अलावा आपने नकारात्मक वाम ऑपरेंड के साथ मेरे अंतर को क्यों बदल दिया? क्या इसलिए कि निर्देश वास्तव में एन्कोडेड है? उपयोगकर्ता को शायद ही कभी इस बारे में परवाह करनी होगी। मेरे द्वारा उपयोग किए जाने वाले प्रत्येक असेंबलर में, आप DWORD PTR को छोड़ सकते हैं क्योंकि बायाँ ऑपरेंड 32-बिट का है और दाहिने ऑपेरेंड के चारों ओर वर्गाकार कोष्ठक हैं।
L̲̳̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e

12
इसके अलावा, IDA / ollydbg जैसा कि आपने लिखा है, वैसा कुछ भी उत्पन्न नहीं करता है, इसलिए, मुझे पूरा यकीन है कि मशीन कोड से "अच्छा" इंटेल सिंटैक्स में जाने में कोई समस्या नहीं है। तो आपका उदाहरण बहुत अच्छा लगता है और ऐसा कुछ जो मैंने कभी नहीं देखा था सिवाय एक असेंबलर या असहमति के सबसे तुच्छ क्रियान्वयन के। दूसरी ओर, मैं जो टी एंड टी निर्देश देता हूं, वह सीधे & टी सिंटैक्स पर पढ़ाने वाले ट्यूटोरियल के पहले पैराग्राफ में से एक है।
L̲̳̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e

8
मैं इस निष्कर्ष पर पहुंचा हूं कि आप एक मशीन हैं इसलिए आप एक सिंटैक्स पसंद करते हैं जो सीधे निर्देश के बिट-एन्कोडिंग को प्रतिबिंबित करता है। (जो & t सिंटैक्स पर होता है)। मुझे यह भी संदेह है कि लोग 1337 को तब महसूस करते हैं जब वे अधिक अस्पष्ट होने के बाद से & t सिंटैक्स का उपयोग करते हैं, हालांकि यह वास्तव में एक फायदा नहीं है ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳̳o̲̳̳k̲̳̳e̲̳̳

7
@Longpoke नहीं, AT & T सिंटैक्स को संदर्भ से स्पष्ट होने पर शब्द का आकार स्पष्ट करने की आवश्यकता नहीं है। बस इंटेल के साथ के रूप में ही: आप की जरूरत नहीं है SOMEWORD PTR[]अगर ऑपरेंड आकार संदर्भ से स्पष्ट है। लेकिन आपको मेमोरी स्थान पर तत्काल ( lएटी एंड टी से दोनों इंटेल के DWORD PTR के रूप में) स्थानांतरित करने के मामले में इसकी आवश्यकता है । और हां मेरा उदाहरण बहुत ही विवादित है - लेकिन ऐसा आपका था। मामले में आप अभी भी क्यों नहीं देखते हैं: आपने इंटेल पर अनावश्यक शब्दों को छोड़ दिया है, लेकिन उन्हें एटी एंड टी में रखा है। आप ऑपरेंड को इस तरह से चुनते हैं ताकि वे इंटेल में अच्छी तरह से संरेखित हों, लेकिन एटी एंड टी में ऐसा न करें।
गनथर पाईज़

7
तो क्या आप कह रहे हैं कि -4(ebp,edx,4)बात इससे बेहतर है [4*edx+ebp-4]? मुझे बाद वाली बातें ज्यादा सहज लगती हैं।
कैलेमरियस

24

यह "समान भाषा" है, जिसमें यह एक ही मशीन कोड के लिए संकलित है, इसमें एक ही ओपकोड है, आदि। दूसरी तरफ, यदि आप जीसीसी का उपयोग कर रहे हैं, तो आप शायद एटीएंडटी सिंटैक्स सीखना चाहते हैं, सिर्फ इसलिए। डिफ़ॉल्ट - इसे प्राप्त करने के लिए कोई बदलते संकलक विकल्प, आदि।

मैंने अपने दांतों को इंटेल-सिंटैक्स x86 ASM (DOS पर भी) काट दिया और शुरू में C / UNIX में स्विच करते समय इसे अधिक सहज पाया। लेकिन एक बार जब आप एटी एंड टी सीख लेते हैं तो यह उतना ही आसान होगा।

मैं इसे इतना नहीं दे सकता था --- इंटेल और इसके विपरीत जानने के बाद एटी एंड टी सीखना आसान है। सिंटैक्स की तुलना में वास्तविक भाषा आपके सिर में आने के लिए बहुत कठिन है। तो हर तरह से बस एक पर ध्यान केंद्रित करें और फिर दूसरे को सीखें जब यह आता है।


16
क्या? क्योंकि GCC डिफ़ॉल्ट रूप से & t पर उपयोग करता है इसलिए & t सिंटैक्स में सीखने का कोई कारण नहीं है। खासकर जब आप बस इसे अधिक सहज इंटेल सिंटैक्स में बदल सकते हैं।
L̲̳̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e

7
@ लोंगपोक लर्निंग इंटेल सिंटैक्स सिर्फ इसलिए कि हर कोई इसे "अधिक सहज" कह रहा है बेहतर कारण नहीं है। वास्तव में इसका कोई कारण नहीं है।
हॉकेन

1
आप दोनों ही सही हैं, उन्हीं कारणों से जो वेरिलोग और वीएचडीएल दोनों के आसपास अटक गए हैं।
बग

@ हवन: सच। इंटेल सिंटैक्स सीखने का असली कारण यह है कि यह इंटेल और एएमडी के मैनुअल का उपयोग करता है। विक्रेता मैनुअल के रूप में विस्तृत एटी एंड टी सिंटैक्स का उपयोग करके कोई आईएसए संदर्भ मैनुअल नहीं हैं, उदाहरण के लिए felixcloutier.com/x86/cmppd (इंटेल के पीडीएफ से निकाले गए)। इसके अलावा uops.info और agner.org/optimize जैसी प्रदर्शन जानकारी । मुझे लगता है कि मैंने पढ़ा है कि कुछ यूनिक्स विक्रेता ने किसी बिंदु पर एटी एंड टी आईएसए संदर्भ बनाया है, लेकिन यह निश्चित रूप से अब तक पुराना है और एवीएक्स निर्देशों को कवर नहीं करेगा। 100% इस जवाब से सहमत थे: एक ही मशीन कोड, इसे व्यक्त करने के लिए अलग-अलग वाक्य-विन्यास, कोई बड़ी बात नहीं।
पीटर कॉर्ड्स

20

यह व्यावसायिकता का संकेत है कि आप जो कुछ भी उपयोग में है उसे समायोजित करने के लिए तैयार हैं। एक या दूसरे के लिए कोई वास्तविक लाभ नहीं है। Microsoft दुनिया में इंटेल सिंटैक्स आम है, एटी एंड टी लिनक्स / यूनिक्स में मानक है। चूंकि दोनों में से किसी एक का कोई फायदा नहीं है, इसलिए लोग पहले जो कुछ भी देखते हैं उस पर छाप लगाते हैं। उस ने कहा, एक पेशेवर प्रोग्रामर चीजों की तरह ऊपर उठता है। वे जो भी काम करते हैं, या जिस डोमेन में आप काम कर रहे हैं, उसका उपयोग करें।


5
उपकरणों के "पेशेवर" उपयोगकर्ता होने के बारे में, और आपको अधिक उत्पादक बनाने के लिए उन्हें बदलने के बारे में जानना? इंटेल सिंटैक्स के लिए +1।
जोनाथन रेइनहर्ट

5
खैर, हालांकि मैं इंटेल सिंटैक्स का भी पक्ष लेता हूं, उसके पास एक बिंदु है - उदाहरण के लिए मौजूदा एटी एंड टी कोड के रखरखाव पर विचार करें। दोनों के बीच अपना रास्ता जानने में कोई बुराई नहीं है।
इलियट

7
जब मैं दोनों को सीखने की वकालत करूँगा, तो मैं डेविल्स एडवोकेट का किरदार निभाऊंगा और सुझाव दूंगा कि आप बस अपनी पसंद के सिंटैक्स में * कन्वर्ट करने वाली * .s फ़ाइलों को स्क्रिप्ट कर सकते हैं।
बग

2
चूंकि इंटेल सिंटैक्स को पढ़ना आसान है, इसलिए इंटेल सिंटैक्स का एक फायदा है। "लेक्स ईएक्स, [ईएक्सएक्स * 4 + 8]" में "लील 8 (,% ईएक्सएक्स, 4),% ईएक्सएक्स" की तुलना में बेहतर उद्देश्यपूर्ण पठनीयता है
लुसियो एम। टेटो

2
@ बगु हेह, आपने इमेकस को मिस किया; डी
जीडीपी 2

12

इंटेल सिंटैक्स में सब कुछ शामिल है (कोडांतरक / डिस्सेम्बलर को मानते हुए नवीनतम जंक इंटेल को उनके निर्देश सेट में जोड़ा गया है)। मुझे यकीन है कि & t ही है।

पर और टी इंटेल
movl -4 (% ebp,% edx, 4),% eax mov eax, [ebp-4 + edx * *]
Movl -4 (% ebp),% eax mov eax, [ebp-4]
movl (% ecx),% edx mov edx, [ecx]
leal 8 (,% eax, 4),% eax lea eax, [eax * 4 + 8]
leal (% eax,% eax, 2),% eax lea eax, [eax * 2 + eax]

... और अधिक जटिल निर्देशों के साथ यह अधिक जटिल हो जाता है

'निफ ने कहा।


17
नहीं, काफी नहीं कहा।
गनथर पाईज़

2
पोस्टर ने पहले ही कहा था कि वे इंटेल सिंटैक्स पसंद करते हैं; उनके लिए अच्छा; तो आप किसे समझाने की कोशिश कर रहे हैं?
Hawken

2
@ जब तक यह सिर्फ पोस्टर नहीं है जो जवाब पढ़ने जा रहा है।
विंगर सेंडोन

मुझे पसंद है कि कैसे वे डॉर्ड की लंबाई के साथ उदाहरण का उल्लेख करते हैं। कृपया सिंगल बाइट या शॉर्ट पर मेमोरी ऑपरेंड लिखें।
अजय ब्रह्मक्षत्रिय

2

मेरी पहली असेंबली भाषा MIPS थी, जिस पर मैंने ध्यान दिया है कि यह एटीटी सिंटैक्स के समान है। इसलिए मैं एटीटी सिंटैक्स पसंद करता हूं, लेकिन यह वास्तव में तब तक मायने नहीं रखता है जब तक आप इसे पढ़ सकते हैं।


3
MIPS असेंबली केवल लोड / स्टोर अनुदेशन के पता प्रारूप में AT & T सिंटैक्स के समान है। लेकिन MIPS में लोड / स्टोर के लिए केवल 1 सरल पता मोड है, जबकि Intel में बहुत अधिक है, जो इसे और अधिक जटिल बनाता है। ऊपर विचार करें lea -0x30(%rcx,%rax,8),%eaxऔर lea eax,[rcx+rax*8-0x30]जोर्जेंसन तैनात हैं। और एटी एंड टी के विपरीत, एमआईपीएस अभी भी अन्य सभी की तरह गंतव्य-पहले प्रारूप का उपयोग करते हैं। इसके अलावा, एमआइपी नंबर को $ पहले से उपसर्ग करने की आवश्यकता नहीं है, और एमआइपी में नाम दर्ज करना कम है, इसलिए एटी एंड टी जैसे सभी तरह से% होने के लिए बहुत असहज नहीं है
फुल्विक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.