Differences in Intel (NASM) vs AT&T (GAS) Syntax.
Intel Syntax
mov eax,1
mov ebx,0ffh
int 80h
AT&T Syntax
movl $1,%eax
movl $0xff,%ebx
int $0x80
instr dest src
instr srd dest
Intel Syntax
instr dest,source
mov eax,[ecx]
AT&T Syntax
instr source,dest
movl (%ecx),%eax
Intex Syntax
mov eax,[ebx]
mov eax,[ebx+3]
AT&T Syntax
movl (%ebx),%eax
movl 3(%ebx),%eax
segreg:[base+index*scale+disp]
%segreg:disp(base,index,scale) == disp + base + index*scale
, where scale defaults to 1 if absent.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
Style | 8 bits | 16 bit | 32 bits | 64 bits |
---|---|---|---|---|
ATT(GAS) | 'b' | 'w' | 'l' | 'q' |
Intel(NASM) | byte ptr | word ptr | dword ptr | qword ptr |
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
Style | 8 bits | 16 bit | 32 bits | 64 bits | Example |
---|---|---|---|---|---|
ATT(GAS) | 'db' | 'dw' | 'dd' | 'dq' | var1 dd 40 |
Intel(NASM) | .byte | .int | .long | var1: .int 40 |
;
in Intel and #
or C style in Att.
NASM
; Text segment begins
section .text
global _start
; Program entry point
_start:
; Put the code number for system call
mov eax, 1
; Return value
mov ebx, 2
; Call the OS
int 80h
GAS
# Text segment begins
.section .text
.globl _start
# Program entry point
_start:
# Put the code number for system call
movl $1, %eax
/* Return value */
movl $2, %ebx
# Call the OS
int $0x80