Went to see the printf or puts implementation rather then just calling a library function. Then saw Intel assembly and reminded myself why I've never wrestled with it.
AT&T syntax:
movl mem_location(%ebx,%ecx,4), %eax
Intel syntax: mov eax, [ebx + ecx*4 + mem_location]
The other differences are minor compared to that, IMHO. mov eax, [ ptr ]
is like eax = *ptr; // or, eax = ptr[ 0 ];
The offset/multiplier memory addressing format for AT&T syntax was always more troubling for me. Coming from a TASM/MASM/NASM/PASCAL/x86 background first, it felt "icky" to put offsets outside of the "brackets" (or parenthesis, as it were) [0][1].[0] https://github.com/lpsantil/rt0/blob/master/src/lib/00_start...
[1] https://github.com/lpsantil/rt0/blob/master/src/lib/00_start...
68k, Alpha, PDP-11, SPARC, and VAX have the destination on the far right.
The order is probably as contentious as the great endianness debate, but I think one of the most awkward parts of having src, dst order is that subtraction looks backwards. I prefer dst, src because it corresponds closely with the direction of assignment in higher-level languages:
op a, b, c ; a = b op c
op a, b ; a op= b