Hạn chế của Cú pháp hợp ngữ Intel So với AT&T [đóng cửa]


88

Đối với tôi, cú pháp của Intel dễ đọc hơn nhiều. Nếu tôi lướt qua khu rừng lắp ráp chỉ tập trung vào cú pháp của Intel, tôi có bỏ lỡ điều gì không? Có lý do gì tôi muốn chuyển sang AT&T (ngoài việc có thể đọc bản lắp ráp AT&T của người khác) không? Đầu mối đầu tiên của tôi là gdb sử dụng AT&T theo mặc định.

Nếu điều này quan trọng, tôi chỉ tập trung vào bất kỳ cấu trúc quan hệ và cú pháp nào có thể có đối với Linux / BSD và ngôn ngữ C.


11
Tôi thích những câu hỏi không mang tính xây dựng nhận được hơn 50 phiếu bầu.
thúc

Câu trả lời:


80

Thực sự không có lợi thế cho cái này hơn cái kia. Tôi đồng ý mặc dù cú pháp của Intel dễ đọc hơn nhiều . Hãy nhớ rằng AFAIK, tất cả các công cụ GNU cũng có tùy chọn sử dụng cú pháp Intel.

Có vẻ như bạn có thể đặt GDB sử dụng cú pháp Intel với điều này:

thiết lập thông tin hương vị tháo gỡ

GCC có thể thực hiện cú pháp Intel với -masm=intel.


18
cũng, echo thiết dis intel >> ~ / .gdbinit
oevna

9
Làm thế nào là cú pháp AT&T khó đọc hơn? Tôi thấy việc có các hậu tố kích thước trên toán hạng có nhiều bất lợi hơn là có "dword". Có điều gì khác mà tôi đang thiếu?
Hawken

54
lea -0x30(%rcx,%rax,8),%eaxlà ATT phức tạp cho lea eax,[rcx+rax*8-0x30]. Việc sử dụng + và * thực sự hữu ích trong phong cách của Intel.
jørgensen

9
Tôi thấy "tích chập" của họ là ngang nhau nhưng không tập trung: nếu ATT không rõ ràng, thì Intel không rõ ràng. Mặc dù số học infix quen thuộc hơn với sinh viên đại số, nhưng theo cú pháp thì không rõ ràng là có chính xác 4 đối số đối với phép toán, hoặc chỉ một trong số chúng có thể được nhân và trong cả hai trường hợp đều không rõ ràng rằng số nhân phải là một sức mạnh của 2.
lỗi

10
@Hawken Tôi thấy các hậu tố của AT&T tốt hơn nhiều so với "ptr" của Intel bởi vì bạn luôn chỉ định nó và nó thực sự làm giảm số lượng lỗi (ít nhất là đối với tôi). Về phần còn lại (ví dụ như các ký hiệu $ và%) .. vâng .. chúng không dễ chịu, và đó là điểm, nhưng chúng có một lợi thế: nó rõ ràng và một lần nữa giảm sai lầm. Tôi muốn nói rằng một cái thoải mái khi đọc (Intel) và cái thứ hai để viết (AT&T).
MasterMastic 27/12/12

43

Cú pháp chính cho trình hợp dịch GNU (GAS) là AT&T. Cú pháp Intel là một bổ sung tương đối mới cho nó. Hợp ngữ x86 trong nhân Linux theo cú pháp AT&T. Trong thế giới Linux, đó là cú pháp chung. Trong thế giới MS, cú pháp Intel phổ biến hơn.

Cá nhân tôi ghét cú pháp AT&T . Có rất nhiều trình lắp ráp miễn phí (NASM, YASM) cùng với GAS cũng hỗ trợ cú pháp Intel, vì vậy sẽ không có bất kỳ vấn đề nào khi thực hiện cú pháp Intel trong Linux.

Ngoài ra, nó chỉ là một sự khác biệt về cú pháp. Kết quả của cả hai sẽ là cùng một mã máy x86.


25
Đã đồng ý và đã đồng ý. Sẽ là một tội ác khi sử dụng cú pháp AT&T, nó phản trực quan và xấu xí, tại sao bạn lại muốn thêm tiền tố mỗi số và đăng ký với $ và%, và chỉ định địa chỉ tương đối trong ký hiệu SIB ngược lại, tôi đã sử dụng cú pháp Intel cho hai năm và vẫn không thể hiểu tại sao AT&T lại tồn tại.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

11
Nếu bạn định nói đậm thì ít nhất hãy cung cấp một số bằng chứng về lý do tại sao thông tin lại tốt hơn nhiều .
Hawken

8
@Hawken Haters sẽ ghét
Gunther Piez

8
@Hawken Có phải bạn đang gợi ý rằng vì anh ấy sử dụng kiểu chữ in đậm, bằng cách nào đó, anh ấy nói rõ ý kiến ​​của mình là sự thật theo cách mà anh ấy sẽ không làm được nếu anh ấy chỉ đơn giản để chữ in đậm một mình? Dù sao thì câu hỏi trên thực tế vẫn mời gọi kiểu "tranh luận" do dư luận dẫn dắt, có lẽ là tại sao nó lại bị đóng cửa!
Elliott

1
Làm thế nào về cú pháp Intel cho ARM?
thúc

33

Thực sự không có lợi thế cho cái này hơn cái kia. Tôi không đồng ý mặc dù cú pháp của Intel dễ đọc hơn nhiều, vì cá nhân tôi ghét cú pháp của Intel . Hãy nhớ rằng AFAIK, tất cả các công cụ GNU cũng có tùy chọn sử dụng cú pháp Intel.

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]

... và nó trở nên phức tạp hơn với các hướng dẫn phức tạp hơn

'nuff nói.

Tái bút: Câu trả lời này tồn tại chủ yếu vì lý do làm nổi bật (IMHO) điểm yếu trong một số câu trả lời khác, thực ra không phải là câu trả lời mà là ý kiến. Và tất nhiên câu trả lời này trong thực tế chỉ là ý kiến ​​khiêm tốn của tôi.

PPS: Tôi không ghét cú pháp của Intel, chỉ là tôi không quan tâm.


19
Tôi bối rối kinh khủng. Bạn có ngụ ý rằng cú pháp at & t không bao giờ cần phải làm cho kích thước từ rõ ràng không? Tại sao bạn lại sao chép ví dụ của tôi và thêm các kích thước từ và thứ PTR vô dụng? Ngoài ra, tại sao bạn lại thay đổi sự khác biệt của tôi thành tổng với một toán hạng bên trái âm? Có phải vì đó là cách lệnh thực sự được mã hóa? Người dùng hiếm khi phải quan tâm đến điều đó thực sự. Trong mọi trình hợp dịch mà tôi đã sử dụng, bạn có thể bỏ qua DWORD PTR vì toán hạng bên trái là 32 bit và toán hạng bên phải có dấu ngoặc vuông xung quanh nó.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

12
Hơn nữa, IDA / ollydbg thậm chí không tạo ra bất cứ thứ gì giống như những gì bạn đã viết, vì vậy, tôi khá chắc chắn rằng không có vấn đề gì khi chuyển từ mã máy sang cú pháp intel "đẹp". Vì vậy, ví dụ của bạn có vẻ khá phức tạp và điều gì đó tôi sẽ không bao giờ thấy ngoại trừ trong việc triển khai nhỏ nhất của một trình lắp ráp hoặc trình tháo gỡ. Mặt khác, hướng dẫn at & t mà tôi mô phỏng là trực tiếp từ một trong những đoạn đầu tiên của hướng dẫn dạy cú pháp at & t.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

8
Tôi đã đi đến kết luận rằng bạn là một cỗ máy, vì vậy bạn thích một cú pháp phản ánh trực tiếp mã hóa bit của lệnh. (đó là cú pháp at & t làm). Tôi cũng có một nghi ngờ rằng mọi người cảm thấy hơn 1337 khi họ sử dụng at & t cú pháp vì nó che khuất hơn, mặc dù đó không phải là thực sự là một lợi thế ...
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳

7
@Longpoke Không, cú pháp AT&T không cần phải làm rõ kích thước từ nếu nó rõ ràng so với ngữ cảnh. Cũng giống như với intel: Bạn không cần SOMEWORD PTR[]nếu kích thước toán hạng rõ ràng khỏi ngữ cảnh. Nhưng bạn cần nó trong trường hợp di chuyển ngay lập tức đến một vị trí bộ nhớ (cả ltừ AT&T như DWORD PTR của Intel). Và vâng, ví dụ của tôi khá giả - nhưng của bạn cũng vậy. Trong trường hợp bạn vẫn không hiểu tại sao: Bạn đã bỏ qua các kích thước từ không cần thiết trên Intel, nhưng có chúng trong AT&T. Bạn chọn các toán hạng theo cách sao cho chúng sắp xếp phù hợp trong Intel, nhưng không làm như vậy trong AT&T.
Gunther Piez

7
Vì vậy, bạn đang nói -4(ebp,edx,4)điều tốt hơn [4*edx+ebp-4]? Tôi thấy cái sau trực quan hơn.
Calmarius

24

Đó là "cùng một ngôn ngữ", trong đó nó biên dịch xuống cùng một mã máy, có cùng một mã quang, v.v. Mặt khác, nếu bạn đang sử dụng GCC, bạn có thể sẽ muốn học cú pháp AT&T, chỉ vì nó mặc định - không có tùy chọn trình biên dịch thay đổi, v.v. để có được nó.

Tôi cũng đã từng sử dụng Intel-Cú pháp x86 ASM (trên DOS) và thấy nó trực quan hơn ban đầu khi chuyển sang C / UNIX. Nhưng một khi bạn học AT & T, nó sẽ dễ dàng như vậy.

Tôi sẽ không nghĩ nhiều đến điều đó --- thật dễ dàng để học AT&T khi bạn biết Intel và ngược lại. Ngôn ngữ thực tế khó đi vào đầu bạn hơn nhiều so với cú pháp. Vì vậy, bằng mọi cách chỉ cần tập trung vào một và sau đó học cái khác khi nó xuất hiện.


16
Gì? Vì GCC sử dụng at & t theo mặc định nên không có lý do gì để học cú pháp at & t. Đặc biệt là khi bạn có thể chuyển nó sang cú pháp Intel trực quan hơn.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

7
@longpoke Học cú pháp intel chỉ vì mọi người gọi nó là "trực quan hơn" không phải là lý do tốt hơn. Thực ra không có lý do gì cả.
Hawken

1
Cả hai bạn đều đúng, vì những lý do giống nhau mà cả Verilog và VHDL đều gặp khó khăn.
bug

@Hawken: Đúng. Lý do thực sự để học cú pháp của Intel là đó là những gì hướng dẫn sử dụng của Intel và AMD. Không có hướng dẫn sử dụng tham chiếu ISA nào sử dụng cú pháp AT&T chi tiết như hướng dẫn sử dụng của nhà cung cấp, ví dụ: felixcloutier.com/x86/cmppd (trích xuất từ ​​tệp PDF của Intel). Ngoài ra, thông tin về hiệu suất như uops.infoagner.org/optimize . Tôi nghĩ rằng tôi đã đọc rằng một số nhà cung cấp Unix đã thực hiện tham chiếu ISA của AT&T tại một số điểm, nhưng chắc chắn nó đã lỗi thời cho đến nay và sẽ không bao gồm các hướng dẫn AVX. 100% đồng ý với câu trả lời này: cùng một mã máy, cú pháp khác nhau để thể hiện nó, không có vấn đề gì.
Peter Cordes

20

Đó là một dấu hiệu của sự chuyên nghiệp cho thấy bạn sẵn sàng điều chỉnh cho phù hợp với bất kỳ thứ gì đang được sử dụng. Không có lợi thế thực sự cho cái này hay cái kia. Cú pháp intel phổ biến trong thế giới Microsoft, AT&T là tiêu chuẩn trong Linux / Unix. Vì không có lợi thế cho một trong hai, mọi người có xu hướng ghi dấu ấn vào bất cứ thứ gì họ nhìn thấy đầu tiên. Điều đó nói lên rằng, một lập trình viên chuyên nghiệp nêu lên trên những điều như thế. Sử dụng bất kỳ thứ gì họ sử dụng tại nơi làm việc hoặc trong miền bạn đang làm việc.


5
Làm thế nào để trở thành một người dùng "chuyên nghiệp" của các công cụ và biết cách thay đổi chúng để giúp bạn làm việc hiệu quả hơn? +1 cho cú pháp Intel.
Jonathon Reinhart

5
Chà, mặc dù tôi cũng ủng hộ cú pháp của Intel, nhưng ông ấy có lý - chẳng hạn như hãy xem xét việc duy trì mã AT&T hiện có. Chắc chắn không có hại gì khi biết cách của bạn xung quanh cả hai.
Elliott

7
Mặc dù tôi cũng sẽ ủng hộ việc học cả hai, tôi sẽ chơi Devil's Advocate và gợi ý rằng bạn có thể chỉ cần viết vim thành các tệp * .s tự động chuyển đổi sang cú pháp bạn chọn.
bug

2
vì cú pháp intel dễ đọc hơn nên cú pháp intel có lợi thế hơn. "lea eax, [eax * 4 + 8]" có khả năng đọc nhiều mục tiêu tốt hơn so với "Leal 8 (,% eax, 4),% eax"
Lucio M. Tato

2
@bug Heh, bạn viết sai chính tả emacs; D
GDP2

12

Cú pháp của Intel bao gồm tất cả mọi thứ (giả sử trình lắp ráp / tháo gỡ được cập nhật với rác mới nhất mà Intel thêm vào tập lệnh của họ). Tôi chắc tại & t cũng vậy.

tại & 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]

... và nó trở nên phức tạp hơn với các hướng dẫn phức tạp hơn

'nuff nói.


17
Không, nói là không đủ.
Gunther Piez

2
Người đăng đã nói rằng họ thích cú pháp intel hơn; tốt cho họ; vậy bạn đang cố gắng thuyết phục ai?
Hawken

2
@Hawken không chỉ là người đăng sẽ đọc câu trả lời.
Winger Sendon

Tôi thích cách anh ấy đề cập đến ví dụ với độ dài từ khóa. Vui lòng viết toán hạng bộ nhớ trên byte đơn hoặc ngắn.
Ajay Brahmakshatriya

2

Hợp ngữ đầu tiên của tôi là MIPS, ngôn ngữ mà tôi nhận thấy rất giống với cú pháp ATT. Vì vậy, tôi thích cú pháp ATT hơn, nhưng nó không thực sự quan trọng miễn là bạn có thể đọc nó.


3
Hợp ngữ MIPS chỉ tương tự với cú pháp AT&T ở định dạng địa chỉ của trình hướng dẫn tải / lưu trữ. Nhưng MIPS chỉ có 1 chế độ địa chỉ đơn giản cho tải / lưu trữ trong khi Intel có nhiều chế độ khác, điều này làm cho điều này trở nên phức tạp hơn. Hãy xem xét lea -0x30(%rcx,%rax,8),%eaxlea eax,[rcx+rax*8-0x30]jørgensen đã đăng ở trên. Và không giống như AT&T, MIPS vẫn sử dụng định dạng đích đầu tiên như tất cả các định dạng khác. Bên cạnh đó, số MIPS không cần phải được bắt đầu bằng $, và đăng ký tên trong MIPS là ngắn, do đó, nó không phải là rất không thoải mái để có% tất cả các con đường như AT & T
phuclv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.