AT&T ile Karşılaştırıldığında Intel Assembly Sözdiziminin Sınırlamaları [kapalı]


88

Benim için Intel sözdiziminin okunması çok daha kolay. Yalnızca Intel sözdizimine odaklanarak montaj ormanında gezinmeye gidersem, herhangi bir şeyi kaçırır mıyım? AT & T'ye geçmek istememin herhangi bir nedeni var mı (başkalarının AT&T derlemesini okuyabilmenin dışında)? İlk ipucum gdb'nin varsayılan olarak AT&T kullanmasıdır.

Bu önemliyse, odak noktam yalnızca Linux / BSD ve C diliyle herhangi bir ilişki derlemesi ve sözdizimi olabilir.


11
Yapıcı olmayan soruların 50'den fazla artı oy almasını seviyorum.
17:31

Yanıtlar:


80

Birinin diğerine göre gerçekten hiçbir avantajı yok. Intel sözdiziminin okunmasının çok daha kolay olduğuna katılıyorum . AFAIK'in tüm GNU araçlarının Intel sözdizimini kullanma seçeneğine sahip olduğunu unutmayın.

Görünüşe göre GDB'nin Intel sözdizimini şu şekilde kullanmasını sağlayabilirsiniz:

sökme çeşidi bilgisini ayarla

GCC, Intel sözdizimini -masm=intel.


18
ayrıca echo set dis intel >> ~ / .gdbinit
oevna

9
AT&T sözdizimi nasıl daha az okunabilir? İşlenenler üzerinde boyut soneklerinin "dword" e sahip olmaktan daha uygun olduğunu düşünüyorum. Kaçırdığım başka bir şey var mı?
Hawken

54
lea -0x30(%rcx,%rax,8),%eaxiçin kıvrılmış ATT lea eax,[rcx+rax*8-0x30]. + Ve * kullanımı Intel tarzına gerçekten yardımcı oluyor.
jørgensen

9
"Evrişim" i eşit ama özdeş değil olarak görüyorum: ATT opaksa, Intel belirsizdir. İnfix aritmetiği cebir öğrencilerine daha tanıdık gelse de, sözdiziminden işlem için tam olarak 4 argüman olduğu veya bunlardan sadece birinin çarpılabileceği açık değildir ve her iki durumda da çarpanın bir 2'nin gücü
hata

10
@Hawken AT & T'nin soneklerini Intel'in "ptr" lerinden çok daha iyi buluyorum çünkü her zaman bunu belirtiyorsunuz ve gerçekten hata miktarını azaltıyor (en azından benim için). Geri kalanı hakkında (örneğin $ ve% sembolleri) .. evet .. hoş değiller ve önemli olan da bu, ancak bir avantajları var: açık ve bir kez daha hataları azaltıyor. Birinin okumak için (Intel) ve ikincisi yazmak için (AT&T) rahat olduğunu söyleyebilirim.
MasterMastic

43

GNU derleyicisinin (GAS) birincil sözdizimi AT & T'dir. Intel sözdizimi ona nispeten yeni bir ektir. Linux çekirdeğindeki x86 derlemesi AT&T sözdizimindedir. Linux dünyasında, bu yaygın sözdizimidir. MS dünyasında Intel sözdizimi daha yaygındır.

Şahsen, AT&T sözdiziminden nefret ediyorum . GAS'ın yanı sıra Intel sözdizimini de destekleyen birçok ücretsiz derleyici (NASM, YASM) vardır, bu nedenle Linux'ta Intel sözdizimini yaparken herhangi bir sorun olmayacaktır.

Bunun ötesinde, bu sadece sözdizimsel bir farklılık. Her ikisinin sonucu aynı x86 makine kodu olacaktır.


25
Kabul edildi ve kabul edildi. AT&T sözdizimini kullanmak suç olmalı, karşı sezgisel ve çirkin, neden her bir sayının önüne $ ve% ile kaydolmak ve göreceli adreslemeyi ters SIB gösteriminde belirtmek isteyesiniz, Intel sözdizimini kullanıyorum iki yıldır ve hala AT & T'nin neden var olduğunu anlayamıyorum.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

11
Cesurca ifade edecekseniz, en azından istihbaratın neden bu kadar iyi olduğuna dair bazı kanıtlar sağlayın .
Hawken

8
@Hawken Nefretçiler nefret edecek
Gunther Piez

8
@Hawken Cesur yazıyı kullandığı için, bir şekilde cesur olanı yalnız bırakmış olsaydı, fikrini olamayacağı bir şekilde gerçek olarak ifade ettiğini mi söylüyorsunuz? Soru, pratikte bu tür bir fikir odaklı "tartışmaya" davet ediyordu, muhtemelen neden şimdi kapandı!
Elliott

1
ARM için Intel sözdizimi nasıl olur?
17:35

33

Birinin diğerine göre gerçekten hiçbir avantajı yok. Intel sözdiziminin okunmasının çok daha kolay olmasına katılmıyorum, çünkü kişisel olarak Intel sözdiziminden nefret ediyorum . AFAIK'in tüm GNU araçlarının Intel sözdizimini kullanma seçeneğine sahip olduğunu unutmayın.

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]

... ve daha karmaşık talimatlarla daha karmaşık hale geliyor

'nuff dedi.

Not: Bu cevap temel olarak, aslında cevaplar değil fikirler olan bazı diğer cevaplardaki zayıflıkların altını çizme (IMHO) nedeniyledir. Ve elbette gerçekte bu cevap sadece alçakgönüllü görüşüm.

PPS: Intel sözdiziminden nefret etmiyorum, umurumda değil.


19
Kafam çok karıştı. At & t sözdiziminin asla kelime boyutunu açık hale getirmesine gerek olmadığını mı ima ediyorsunuz? Neden örneğimi kopyaladınız ve kelime boyutları ve işe yaramaz PTR şeyini eklediniz? Ayrıca neden farklılıklarımı negatif sol operandlı toplamlara dönüştürdünüz? Talimatın aslında bu şekilde kodlandığı için mi? Kullanıcı nadiren bunu gerçekten önemsemek zorunda kalır. Kullandığım her derleyicide, sol işlenen 32-bit olduğundan ve sağ işlenenin etrafında köşeli parantezler olduğundan DWORD PTR'yi atlayabilirsiniz.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

12
Dahası, IDA / ollydbg yazdığınız gibi hiçbir şey üretmiyor, bu yüzden makine kodundan "güzel" intel sözdizimine geçişte sorun olmadığına eminim. Öyleyse, örneğiniz oldukça uydurma görünüyor ve bir montajcı veya sökücünün en önemsiz uygulaması dışında asla göremeyeceğim bir şey. Öte yandan, alay ettiğim at & t talimatları doğrudan & t sözdiziminde öğretici öğretimin ilk paragraflarından birinden.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

8
Bir makine olduğunuz sonucuna vardım, bu nedenle talimatın bit kodlamasını doğrudan yansıtan bir sözdizimi tercih edersiniz. (at & t sözdiziminin yaptığı şey budur). Ayrıca insanların at & t sözdizimini kullandıklarında daha belirsiz olduğundan daha 1337 hissettiğinden şüpheleniyorum, ancak bu gerçekten bir avantaj değil ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

7
@Longpoke Hayır, AT&T sözdiziminin bağlamdan anlaşılırsa kelime boyutunu açık hale getirmesine gerek yoktur. Aynı intel ile aynı: SOMEWORD PTR[]İşlenen boyutu bağlamdan anlaşılırsa buna ihtiyacınız yoktur . Ancak, hemen bir bellek konumuna (her ikisi de lAT & T'den Intel'den DWORD PTR olarak) taşıma durumunda ihtiyacınız var . Ve evet benim örneğim oldukça uydurma - ama seninki de öyleydi. Hala nedenini anlamıyorsanız: Intel'de gereksiz kelime boyutlarını atladınız, ancak AT & T'ye sahipsiniz. İşlenenleri, Intel'de güzel bir şekilde hizalanacak şekilde seçersiniz, ancak bunu AT & T'de yapmayın.
Gunther Piez

7
Yani her -4(ebp,edx,4)şeyin daha iyi olduğunu [4*edx+ebp-4]mu söylüyorsun ? İkincisini daha sezgisel buluyorum.
Calmarius

24

Aynı makine koduna derlenmesi, aynı işlem kodlarına sahip olması, vb. Açısından "aynı dil" dir. Öte yandan, GCC'yi kullanıyorsanız, muhtemelen AT&T sözdizimini öğrenmek isteyeceksiniz, çünkü varsayılan - bunu elde etmek için derleyici seçeneklerini değiştirmek vb. yok.

Ben de Intel-syntax x86 ASM'de (DOS'ta da) dişlerimi kestim ve başlangıçta C / UNIX'e geçerken daha sezgisel buldum. Ama AT & T'yi öğrendikten sonra, o kadar kolay görünecek.

Bu kadar düşünmemiştim - Intel'i tanıdıktan sonra AT & T'yi öğrenmek kolaydır ve bunun tersi de geçerlidir. Gerçek dili kafanıza almak sözdiziminden çok daha zordur. Yani, elbette sadece birine odaklanın ve sonra ortaya çıktığında diğerini öğrenin.


16
Ne? GCC'nin at & t'yi varsayılan olarak kullandığı için, & t sözdizimini öğrenmek için bir neden yoktur. Özellikle onu daha sezgisel Intel sözdizimine geçirebildiğinizde.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

7
@longpoke Intel sözdizimini herkesin "daha sezgisel" olarak adlandırdığı için öğrenmek daha iyi bir neden değil. Aslında hiçbir sebep yok.
Hawken

1
Hem Verilog hem de VHDL'nin takılıp kaldığı nedenlerle ikiniz de haklısınız.
hata

@Hawken: Doğru. Intel sözdizimini öğrenmenin gerçek nedeni, Intel ve AMD'nin kılavuzlarının kullandığı şeyin bu olmasıdır. Satıcı kılavuzlarında ayrıntılı olarak açıklanan AT&T sözdizimini kullanan ISA başvuru kılavuzu yoktur, örneğin felixcloutier.com/x86/cmppd (Intel'in PDF'lerinden alınmıştır). Ayrıca uops.info ve agner.org/optimize gibi performans bilgileri . Sanırım bazı Unix satıcılarının bir noktada AT&T ISA referansı yaptığını okudum, ancak şimdiye kadar kesinlikle modası geçmiş ve AVX talimatlarını kapsamıyor. Bu yanıta% 100 katılıyor: aynı makine kodu, onu ifade etmek için farklı sözdizimi, önemli değil.
Peter Cordes

19

Bu, kullanımda olan her şeye alışmaya istekli olduğunuzun bir profesyonellik işaretidir. Birinin veya diğerinin gerçek bir avantajı yok. Intel sözdizimi Microsoft dünyasında yaygındır, AT&T Linux / Unix'te standarttır. İkisinin de avantajı olmadığı için, insanlar ilk gördükleri her şeye baskı yapma eğilimindedir. Bununla birlikte, profesyonel bir programcı bunun gibi şeylerin üstüne çıkar. İş yerinde veya çalıştığınız alanda kullandıkları her şeyi kullanın.


5
Araçların "profesyonel" bir kullanıcısı olmaya ve sizi daha üretken hale getirmek için bunları nasıl değiştireceğinizi bilmeye ne dersiniz? Intel sözdizimi için +1.
Jonathon Reinhart

5
Ben de Intel sözdizimini tercih etsem de, onun bir anlamı var - örneğin mevcut AT&T kodunun bakımını düşünün. Her ikisinde de yolunuzu bilmenin kesinlikle bir zararı yoktur.
Elliott

7
Her ikisini de öğrenmeyi savunacak olsam da, Devil's Advocate'i oynayacağım ve vim'in komut dosyasını, seçtiğiniz sözdizimine otomatik olarak dönüştüren * .s dosyalarına dönüştürmenizi önereceğim.
hata

2
intel sözdiziminin okunması daha kolay olduğundan, intel sözdiziminin bir avantajı vardır. "lea eax, [eax * 4 + 8]", "leal 8 (,% eax, 4),% eax" den çok daha iyi objektif okunabilirliğe sahip
Lucio M. Tato

2
@bug Heh, emac'leri yanlış
yazdınız

13

Intel sözdizimi her şeyi kapsar (montajcı / sökücünün talimat setine eklenen en son önemsiz Intel ile güncel olduğunu varsayarsak). Eminim aynıdır.

at & t intel
movl -4 (% ebp,% edx, 4),% eax mov eax, [ebp-4 + edx * 4]
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]

... ve daha karmaşık talimatlarla daha karmaşık hale geliyor

'nuff dedi.


17
Hayır, yeterince söylenmedi.
Gunther Piez

2
Poster zaten intel sözdizimini tercih ettiklerini belirtti; onlar için iyi; öyleyse kimi ikna etmeye çalışıyorsun?
Hawken

2
@Hawken, cevapları okuyacak olan sadece poster değil.
Winger Sendon

Dword uzunluğu ile örnek olarak bahsetmesi hoşuma gitti. Lütfen tek bayt veya kısa bir bellek işleneni yazın.
Ajay Brahmakshatriya

2

İlk montaj dilim MIPS idi ve ATT sözdizimine çok benzer olduğunu fark ettim. Bu yüzden ATT sözdizimini tercih ederim, ancak okuyabildiğiniz sürece gerçekten önemli değil.


3
MIPS derlemesi, yalnızca yükleme / depolama yönergesinin adres biçimindeki AT&T sözdizimine benzer. Ancak MIPS, yükleme / depolama için yalnızca 1 basit adresleme moduna sahipken Intel'in çok daha fazlası var, bu da bunu daha karmaşık hale getiriyor. Düşünün lea -0x30(%rcx,%rax,8),%eaxve lea eax,[rcx+rax*8-0x30]Jorgensen yukarıda yayınlanmıştır. Ve AT & T'nin aksine, MIPS hala diğerleri gibi hedef ilk formatı kullanıyor. Ayrıca, MIPS numarasının $ ile ön eklenmesi gerekmez ve
MIPS'deki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.