Batasan Sintaks Majelis Intel Dibandingkan dengan AT&T [ditutup]

88

Bagi saya, sintaks Intel jauh lebih mudah dibaca. Jika saya melewati hutan perakitan yang hanya berkonsentrasi pada sintaks Intel, apakah saya akan melewatkan sesuatu? Apakah ada alasan saya ingin beralih ke AT&T (selain dapat membaca rakitan AT&T orang lain)? Petunjuk pertama saya adalah bahwa gdb menggunakan AT&T secara default.

Jika ini penting, fokus saya hanya pada perakitan relasi dan sintaks mungkin harus ke Linux / BSD dan bahasa C.

oevna
sumber
11
Saya suka pertanyaan non-konstruktif yang mendapatkan lebih dari 50 suara.
ceving

Jawaban:

80

Benar-benar tidak ada keuntungan satu sama lain. Saya setuju bahwa sintaks Intel jauh lebih mudah dibaca. Ingatlah bahwa AFAIK, semua alat GNU memiliki opsi untuk menggunakan sintaks Intel juga.

Sepertinya Anda dapat membuat GDB menggunakan sintaks Intel dengan ini:

mengatur intel rasa pembongkaran

GCC dapat melakukan sintaks Intel dengan -masm=intel.

Zifre
sumber
18
juga, echo set dis intel >> ~ / .gdbinit
oevna
9
Bagaimana sintaks AT&T kurang terbaca? Saya merasa memiliki sufiks ukuran pada operan lebih rapi daripada memiliki "dword". Apakah ada hal lain yang saya lewatkan?
Hawken
54
lea -0x30(%rcx,%rax,8),%eaxadalah ATT yang berbelit-belit lea eax,[rcx+rax*8-0x30]. Penggunaan + dan * sangat membantu dalam gaya Intel.
jørgensen
9
Saya melihat "konvolusi" mereka sama tetapi tidak disengaja: jika ATT tidak jelas, maka Intel berarti ambigu. Meskipun aritmatika infiks lebih akrab bagi siswa aljabar, tidak jelas dari sintaks bahwa terdapat tepat 4 argumen untuk operasi tersebut, atau bahwa hanya satu dari mereka yang dapat dikalikan, dan dalam kedua kasus tersebut tidak jelas bahwa pengali harus a kekuatan 2.
bug
10
@Hawken Saya menemukan sufiks AT & T jauh lebih baik daripada "ptr" Intel karena Anda selalu menentukannya dan itu benar - benar mengurangi jumlah kesalahan (setidaknya untuk saya). Tentang yang lainnya (misalnya simbol $ dan%) .. yeah .. mereka tidak menyenangkan, dan itulah intinya, tetapi mereka memiliki keuntungan: eksplisit dan sekali lagi mengurangi kesalahan. Saya akan mengatakan yang satu nyaman untuk membaca (Intel) dan yang kedua untuk menulis (AT&T).
MasterMastic
43

Sintaks utama untuk GNU assembler (GAS) adalah AT&T. Sintaks Intel adalah tambahan yang relatif baru untuk itu. perakitan x86 di kernel Linux ada dalam sintaks AT&T. Di dunia Linux, ini adalah sintaks yang umum. Di dunia MS, sintaks Intel lebih umum.

Secara pribadi, saya benci sintaks AT&T . Ada banyak assembler gratis (NASM, YASM) bersama dengan GAS yang mendukung sintaks Intel juga, jadi tidak akan ada masalah dalam melakukan sintaks Intel di Linux.

Di luar itu, itu hanya perbedaan sintaksis. Hasil dari keduanya akan menjadi kode mesin x86 yang sama.

mmx
sumber
25
Setuju dan setuju. Seharusnya kejahatan menggunakan sintaks AT&T, itu kontra-intuitif dan jelek, mengapa Anda ingin mengawali setiap nomor dan mendaftar dengan $ dan%, dan menentukan pengalamatan relatif dalam notasi SIB terbalik, saya telah menggunakan sintaks Intel untuk dua tahun dan masih belum bisa melihat mengapa AT&T ada.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
11
Jika Anda akan menyatakannya dengan huruf tebal setidaknya berikan beberapa bukti mengapa intel jauh lebih baik.
Hawken
8
@Hawken Haters akan membenci
Gunther Piez
8
@Hawken Apakah Anda menyarankan bahwa karena dia menggunakan tipe yang berani, dia entah bagaimana menyatakan pendapatnya sebagai fakta dengan cara yang tidak akan dia lakukan jika dia membiarkan yang berani saja? Pertanyaan itu sebenarnya mengundang "debat" yang didorong oleh opini seperti ini, mungkin mengapa sekarang sudah ditutup!
Elliott
1
Bagaimana dengan sintaks Intel untuk ARM?
ceving
33

Benar-benar tidak ada keuntungan satu sama lain. Saya tidak setuju bahwa sintaks Intel jauh lebih mudah dibaca, karena secara pribadi saya benci sintaks Intel . Ingatlah bahwa AFAIK, semua alat GNU memiliki opsi untuk menggunakan sintaks Intel juga.

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]

... dan menjadi lebih rumit dengan instruksi yang lebih kompleks

'kata nuff.

PS: Jawaban ini ada terutama karena alasan menyoroti kelemahan (IMHO) di beberapa jawaban lain yang sebenarnya bukan jawaban, tapi opini. Dan tentu saja jawaban ini pada kenyataannya hanyalah pendapat saya yang sederhana.

PPS: Saya tidak membenci sintaks Intel, saya hanya tidak peduli.

Gunther Piez
sumber
19
Saya sangat bingung. Apakah Anda menyiratkan bahwa sintaks at & t tidak perlu membuat ukuran kata menjadi eksplisit? Mengapa Anda menyalin contoh saya dan menambahkan ukuran kata dan PTR yang tidak berguna? Juga mengapa Anda mengubah perbedaan saya menjadi jumlah dengan operan kiri negatif? Apakah karena begitulah instruksi sebenarnya dikodekan? Pengguna jarang benar-benar harus peduli tentang itu. Di setiap assembler yang saya gunakan, Anda dapat menghilangkan DWORD PTR karena operan kiri 32-bit dan operand kanan memiliki tanda kurung siku di sekitarnya.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
12
Selain itu, IDA / ollydbg bahkan tidak menghasilkan apa pun seperti yang Anda tulis, jadi, saya cukup yakin tidak ada masalah beralih dari kode mesin ke sintaksis intel yang "bagus". Jadi contoh Anda tampaknya dibuat-buat dan sesuatu yang tidak pernah saya lihat kecuali dalam implementasi assembler atau disassembler yang paling sepele. Di sisi lain, instruksi at & t yang saya tiru langsung dari salah satu paragraf pertama dari tutorial pengajaran sintaks at & t.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
8
Saya telah sampai pada kesimpulan bahwa Anda adalah mesin sehingga Anda lebih memilih sintaks yang secara langsung mencerminkan pengkodean bit instruksi. (yang dilakukan oleh sintaks at & t). Saya juga memiliki kecurigaan bahwa orang merasa lebih 1337 ketika mereka menggunakan sintaks at & t karena lebih tidak jelas, meskipun itu sebenarnya bukan keuntungan ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
7
@Longpoke Tidak, sintaks AT&T tidak perlu membuat ukuran kata eksplisit jika jelas dari konteksnya. Sama halnya dengan intel: Anda tidak perlu SOMEWORD PTR[]jika ukuran operand jelas dari konteksnya. Tetapi Anda membutuhkannya jika memindahkan langsung ke lokasi memori (baik ldari AT&T sebagai DWORD PTR dari Intel). Dan ya, contoh saya cukup dibuat-buat - tapi begitu juga contoh Anda. Jika Anda masih tidak melihat alasannya: Anda meninggalkan ukuran kata yang tidak diperlukan di Intel, tetapi memilikinya di AT&T. Anda memilih operan sedemikian rupa sehingga mereka selaras dengan baik di Intel, tetapi tidak melakukannya di AT&T.
Gunther Piez
7
Jadi, apakah Anda mengatakan -4(ebp,edx,4)sesuatu lebih baik dari [4*edx+ebp-4]? Saya menemukan yang terakhir lebih intuitif.
Calmarius
24

Ini adalah "bahasa yang sama", yang dikompilasi ke kode mesin yang sama, memiliki opcode yang sama, dll. Di sisi lain, jika Anda sama sekali menggunakan GCC, Anda mungkin ingin mempelajari sintaks AT&T, hanya karena itu default - tidak ada opsi kompiler yang berubah, dll. untuk mendapatkannya.

Saya juga memotong gigi saya pada Intel-syntax x86 ASM (pada DOS, juga) dan merasa lebih intuitif pada awalnya ketika beralih ke C / UNIX. Tapi begitu Anda mempelajari AT&T, itu akan terlihat sama mudahnya.

Saya tidak akan terlalu memikirkannya --- belajar AT&T itu mudah setelah Anda mengenal Intel, dan sebaliknya. Bahasa yang sebenarnya jauh lebih sulit dipahami daripada sintaksnya. Jadi dengan segala cara, fokuslah pada satu dan kemudian pelajari yang lain ketika itu muncul.

Jacob B
sumber
16
Apa? Karena GCC menggunakan at & t secara default, tidak ada alasan untuk mempelajari sintaks at & t. Terutama ketika Anda bisa mengubahnya ke sintaks Intel yang lebih intuitif.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
7
@longpoke Mempelajari sintaksis intel hanya karena semua orang menyebutnya "lebih intuitif" bukanlah alasan yang lebih baik. Sebenarnya tidak ada alasan sama sekali.
Hawken
1
Anda berdua benar, untuk alasan yang sama dengan Verilog dan VHDL.
bug
@Hawken: Benar. Alasan sebenarnya untuk mempelajari sintaks Intel adalah apa yang digunakan manual Intel dan AMD. Tidak ada manual referensi ISA yang menggunakan sintaks AT&T sedetail manual vendor, misalnya felixcloutier.com/x86/cmppd (diekstrak dari PDF Intel). Juga info kinerja seperti uops.info dan agner.org/optimize . Saya rasa saya membaca bahwa beberapa vendor Unix membuat referensi AT&T ISA di beberapa titik, tetapi sudah pasti sudah usang sekarang dan tidak akan mencakup instruksi AVX. 100% setuju dengan jawaban ini: kode mesin yang sama, sintaks yang berbeda untuk mengekspresikannya, bukan masalah besar.
Peter Cordes
19

Itu tanda profesionalisme bahwa Anda bersedia menyesuaikan diri dengan apa pun yang digunakan. Tidak ada keuntungan nyata bagi yang satu atau yang lainnya. Sintaks intel umum di dunia Microsoft, AT&T adalah standar di Linux / Unix. Karena tidak ada keuntungan bagi salah satunya, orang cenderung membekas pada apa pun yang mereka lihat pertama kali. Konon, seorang programmer profesional mengangkat hal-hal di atas seperti itu. Gunakan apa pun yang mereka gunakan di tempat kerja, atau di domain tempat Anda bekerja.

phorgan1
sumber
5
Bagaimana dengan menjadi pengguna alat yang "profesional", dan mengetahui cara mengubahnya agar Anda lebih produktif? 1 untuk sintaks Intel.
Jonathon Reinhart
5
Yah, meskipun saya juga menyukai sintaks Intel, dia ada benarnya - pertimbangkan pemeliharaan kode AT&T yang ada, misalnya. Jelas tidak ada salahnya mengetahui jalan Anda di sekitar keduanya.
Elliott
7
Meskipun saya juga menganjurkan mempelajari keduanya, saya akan memainkan Devil's Advocate dan menyarankan agar Anda dapat membuat skrip vim menjadi file * .s yang mengonversi otomatis ke sintaks pilihan Anda.
bug
2
karena sintaks intel lebih mudah dibaca, sintaksis intel memiliki keuntungan. "lea eax, [eax * 4 + 8]" memiliki keterbacaan objektif yang jauh lebih baik daripada "leal 8 (,% eax, 4),% eax"
Lucio M. Tato
2
@bug Heh, kamu salah eja emacs; D
GDP2
13

Sintaks Intel mencakup semuanya (dengan asumsi assembler / disassembler adalah yang terbaru dengan junk terbaru yang ditambahkan Intel ke set instruksi mereka). Saya yakin at & t sama.

di & 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]

... dan menjadi lebih rumit dengan instruksi yang lebih kompleks

'kata nuff.

L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
sumber
17
Tidak, tidak cukup kata.
Gunther Piez
2
Poster tersebut telah menyatakan bahwa mereka lebih menyukai sintaksis intel; baik untuk mereka; jadi siapa yang kamu coba yakinkan?
Hawken
2
@Hawken bukan hanya poster yang akan membaca jawabannya.
Winger Sendon
Saya suka bagaimana dia menyebutkan contoh dengan panjang kata-kata. Harap tulis operan memori pada byte tunggal atau pendek.
Ajay Brahmakshatriya
2

Bahasa assembly pertama saya adalah MIPS, yang saya perhatikan sangat mirip dengan sintaks ATT. Jadi saya lebih suka sintaks ATT, tetapi itu tidak terlalu penting selama Anda bisa membacanya.

gsk
sumber
3
Perakitan MIPS hanya mirip dengan sintaks AT&T dalam format alamat instruksi muat / penyimpanan. Tetapi MIPS hanya memiliki 1 mode pengalamatan sederhana untuk memuat / menyimpan sementara Intel memiliki lebih banyak, yang membuatnya lebih kompleks. Pertimbangkan lea -0x30(%rcx,%rax,8),%eaxdan lea eax,[rcx+rax*8-0x30]jørgensen diposting di atas. Dan tidak seperti AT&T, MIPS masih menggunakan format tujuan-pertama seperti yang lainnya. Selain itu, nomor MIPS tidak perlu diawali dengan $, dan nama register di MIPS pendek, jadi tidak terlalu tidak nyaman untuk memiliki% sepenuhnya seperti AT&T
phuclv