PDA

View Full Version : ASM AT&T Syntax



lttq
15-10-2011, 10:56 AM
AT&T là 1 ngôn ngữ lập trình asm trên nền tảng linux,bài viết này có thể hơi không liên quan đến C cho lắm.Nhưng cũng là đáng để đọc

AT&T hoạt động tương tự như x86 instruction của intel trên windows
Tuy nhiên có 1 vài điểm khác biệt cũng cần lưu ý để phân biệt 2 cái này.
đầu tiên cần đọc về x86 instruction tại đây để nắm về các opcode của x86:
http://en.wikipedia.org/wiki/X86_instruction_listings
Tiếp đầu ngữ cho AT&T :

Intex Syntax



mov eax,1
mov ebx,0ffh
int 80h

AT&T Syntax



movl $1,%eax
movl $0xff,%ebx
int $0x80

các thanh ghi thêm "%"
Và các giá trị được thêm "$"

đưa vào toán hạng ngược lại :


Intex Syntax


instr dest,source
mov eax,[ecx]

AT&T Syntax



instr source,dest
movl (%ecx),%eax

Toán hạng nằm trong dấu "()".

Intex Syntax


mov eax,[ebx]
mov eax,[ebx+3]

AT&T Syntax



movl (%ebx),%eax
movl 3(%ebx),%eax

Các phép tính phức tạp hơn

Intel Syntax



instr foo,segreg:[base+index*scale+disp]
mov eax,[ebx+20h]
add eax,[ebx+ecx*2h
lea eax,[ebx+ecx]
sub eax,[ebx+ecx*4h-20h]

AT&T Syntax


instr %segreg:disp(base,index,scale),foo
movl 0x20(%ebx),%eax
addl (%ebx,%ecx,0x2),%eax
leal (%ebx,%ecx),%eax
subl -0x20(%ebx,%ecx,0x4),%eax

Các hậu tố thêm vào làm rõ hơn các lệnh:

b = byte (8 bit)
s = short (16 bit integer) or single (32-bit floating point)
w = word (16 bit)
l = long (32 bit integer or 64-bit floating point)
q = quad (64 bit)
t = ten bytes (80-bit floating point)



Intel Syntax



mov al,bl
mov ax,bx
mov eax,ebx
mov eax, dword ptr [ebx]

AT&T Syntax



movb %bl,%al
movw %bx,%ax
movl %ebx,%eax
movl (%ebx),%eax

Inline ASM trong AT&T :


#include "stdio.h"
int Tong(int a, int b)
{
asm("movl 8(%ebp), %eax"); //ebp-8 là vị trí của a (4 byte)
asm("addl 0xc(%ebp), %eax"); // ebp - 12 là vị trí của b(4 byte)
}

int main()
{
printf("%d\n", Tong(2,4));
return 0;
}
}

tham khảo : http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax#Operation_Suffixes

hardwire
17-10-2011, 10:06 AM
không biết Windows có system call giống Linux không nữa
nghe nói nó xài ngắt 0x2e

lttq
17-10-2011, 10:32 AM
không biết Windows có system call giống Linux không nữa
nghe nói nó xài ngắt 0x2e

INT 2e là để switch từ ring 3 sang ring 0 mà.Là để nhảy vào kernel mode.Lúc đó thì có thể gọi ngắt được rồi.Các tham số để lựa chọn trong ngắt thì chắc là nằm trong EAX.

quangnh89
17-10-2011, 05:15 PM
INT 2e là để switch từ ring 3 sang ring 0 mà.Là để nhảy vào kernel mode.Lúc đó thì có thể gọi ngắt được rồi.Các tham số để lựa chọn trong ngắt thì chắc là nằm trong EAX.

INT 2E dùng với các hệ thống cũ, bây giờ với kiến trúc mới, windows đổi thành SYSCALL

thanh ghi eax chứa chỉ số của hàm cần gọi
edx chứa địa chỉ của dãy các tham số cần truyền cho hàm

hardwire
18-10-2011, 04:53 PM
bạn nào có chi tiết về ngắt 0x2e không mình xài 32 bit không có cái vụ syscall đâu
ai có bảng system call number không

lttq
19-10-2011, 06:51 PM
bạn nào có chi tiết về ngắt 0x2e không mình xài 32 bit không có cái vụ syscall đâu
ai có bảng system call number không

Tớ nghĩ cậu cần gọi cái nào,tham số gì thì cứ google thôi.Còn cái bảng chi tiết thì mình chịu.trên 32bit cũng gọi được systemcall mà.

hardwire
20-10-2011, 08:56 AM
trên 32 bit không có íntruction syscall. Hình như có sysenter thôi