Tổng số lượt xem trang

Chủ Nhật, 9 tháng 6, 2013

AT&T vs INTEL

AT&T vs INTEL

Đây là 2 cú pháp của ngôn ngữ Assembly.Nó sẽ gây nhầm lẫn cho người học Intel rồi chuyền qua AT&T và ngược lại . Nói dài dòng vậy đủ rồi let 's begin:

Prefixes : theo mình hiểu là cái gắn vào đầu 1 ký tự nào đó làm nó có 1 chút thay đổi nhỏ
Trong AT&T thì "%" sẽ được gắn vào đầu các thanh ghi và "$" gắn vào đầu các cái hằng số được gán vào
Trong Intel dùng hex và binary thì sẽ được gắn "h" và "b" ở phía sau hằng số.
VD:
Intel                                                                    AT&T
mov eax,1                                               movl $1,%eax
mov ebx,0ffh                                          movl $0xff,%ebx
int 80h                                                    int $0x80

Direction of operands: dẫn đến các phép toán (dịch  hơi chuối vì mình ko pro mấy én lịt) ><
Nói chung chỗ này thì thể hiện rõ AT&T nó ngược với Intel làm mình nhiều khi hơi điên chỗ này ><
Intel syntax : tham số đầu là destination hay còn là đích , tham số sau là source tham số nguồn
AT&T syntax: tham số đầu là Source nguồn gốc tội lỗi , tham số sau là Destination đích
VD:
Intel                                                                  AT&T
instr dest,source                                      instr source,dest
mov eax,[ecx]                                         movl (%ecx),eax
Chúng ta thấy ở vd hàng 2 bên intel [] còn bên AT&T () ???? kỳ hén

Memory Operands: Tính toán trên memory j đó dịch thế  cũng được :D
Intel thì ta cũng đã thấy để lấy địa chỉ của thanh ghi thì thanh ghi sẽ được bao bọc bỏi []
AT&T thì được ()
VD
Intel                                                             AT&T 
mov     eax,ebx                movl  (%ebx),%eax
mov     eax,[ebx+3]         movl 3(%ebx),%eax 

Qua vd trên ta thấy cấu truc của AT&T nó được che khuất hay ẩn hơn so với Intel
Sự khác nhau này làm mình cũng thấy khó khăn do ko quen lắm :(
nó ko viết rõ ràng cho mình hỉu :(
Intel                                                         AT&T
segreg:[base+index*scale+disp]                     %segreg:disp(base,index,scale)

À quên khi dùng trong kiểu này thì các hằng số mình ko thêm "$" khi trong () của AT&T nhé
VD
Intel                                                                                     AT&T
instr   foo,segreg:[base+index*scale+disp]           instr   %segreg:disp(base,index,scale),foo
mov eax,[ebx+20h]                                              movl 0x20(%ebx),eax
add eax,[ebx+ecx*2h]                                          movl  (%ebx,%ecx,0x2),%eax
lea  eax,[ebx+ecx]                                                leal  (%ebx.%ecx),%eax
sub eax,[ebx+ecx*4h-20h]                                   subl  -0x20(%ebx,%ecx,0x4),%eax

Phần cuối là suffixes : hay còn gọi là phần gắn vào đuôi mấy cái chữ cái làm đổi nghĩa của nó đồ ó
Có thể thấy AT&T nó gợi nhớ cú pháp sau các opcode và nó còn tùy thuộc vào kích thước toán hạng
AT&T
'l' is long
w is word
b is byte
Đương nhiên Intel cũng thể hiện nhưng nó ghi ở các memory operands như byte word dword .....
VD
Intel                                                                          AT&T
mov  al.bl                                                       movb  %bl.%al
mov  ax,bx                                                     movw  %bx,%ax
mov eax,ebx                                                   movl   %ebx,%eax
mov eax,dword ptr [ebx]                                movl  (%ebx),%eax
Tới đây hết dồi... Lần đầu viết bài nên có nhiều sai sót có j đừng ném gạch em nhé  :D

Thank to http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm đã cho ta tài liệu này :D
và tôi ko quên http://translate.google.com đã giúp tui dịch :D
KHOQUACHOQUA nhé

Không có nhận xét nào:

Đăng nhận xét