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