What do the dollar ($) and percentage (%) signs represent in x86 assembly?
Question
I am trying to understand how the assembly language works for a micro-computer architecture class, and I keep facing different syntaxes in examples:
sub $48, %esp
mov %eax, 32(%esp)
What do these codes mean? What is the 32 operand an addition to the esp register?
Solution
Thats not Intel syntax, its AT&T syntax, also called GAS syntax.
the $
prefix is for immediates (constants), and the %
prefix is for registers (they are required1).
For more about AT&T syntax, see also the [att]
tag wiki.
1 Unless the noprefix
option is specified, see here & here. But usually noprefix
is only used with .intel_syntax noprefix
, to get MASM-like syntax.
OTHER TIPS
Compared to Intel syntax, AT&T syntax has many differences
$
signifies a constant (integer literal). Without it the number is an absolute address%
denotes a register- The source/destination order is reversed
()
is used for memory reference, like[]
in Intel syntax
So the above snippet is equivalent to
sub esp, 48 ; esp -= 48
mov [esp+32], eax ; store eax to the value at the address `esp + 32`
Yes, "32(%esp)" indicates an offset of 32 from %esp.
As @Necrolis said, that's written in AT&T syntax. It means:
subtract 48 from the register esp (the stack pointer).
store the contents of eax to the four bytes starting at (esp + 32).
This is AT&T syntax for x86. In AT&T %
generally denotes a register while $
is reserved for immediates. If you omit th $
the assembler would interpret the 48 as an address.