Wait a bloody second. Why does GAS looks like this for ARM:
push {ip, lr}
ldr r0, =hello
bl printf
mov r0, #41
add r0, r0, #1 // Increment
pop {ip, lr}
bx lr
str r0, [r1] /* M[r1] = r0; */
ldr r0, [r1] /* r0 = M[r1]; */
str r0, [r1, #8] /* M[r1 + 8] = r0; */
ldr r0, [r1, #8] /* r0 = M[r1 + 8]; */
str r0, [r1, -r2] /* M[r1 - r2] = r0; */
ldr r0, [r1, -r2] /* r0 = M[r1 - r2]; */
with the destination on the left-hand side, with no "%" before the register names, and with the square brackets for addresses (with relatively sane looking expressions inside those brackets) — basically the same syntax that ARM's own assembler uses, — while x86 gets some absolutely unhinged syntax that looks like it just fell out of the sky (or an abyss for that matter) since it has almost no relation to what's written in the Intel's docs? I always assumed that GAS used some "unified" style for all its targets and disregarded the conventions of the CPU manufacturers but apparently no, it only did that for x86?