What do the dollar ($) and percentage (%) signs represent in x86 assembly?

30,614

Solution 1

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.

Solution 2

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`

Solution 3

Yes, "32(%esp)" indicates an offset of 32 from %esp.

Solution 4

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).
Share:
30,614

Related videos on Youtube

juliensaad
Author by

juliensaad

Updated on September 28, 2020

Comments

  • juliensaad
    juliensaad over 3 years

    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?

  • juliensaad
    juliensaad about 12 years
    Thanks a lot, I did not know where to look for this
  • Taryn East
    Taryn East almost 10 years
    Hi - I'm not sure this actually answers the question... what are the $ and % ?
  • phuclv
    phuclv almost 10 years
    @TarynEast they are prefixes for immidiates and registers like Necrolis has said
  • phuclv
    phuclv almost 10 years
    the % prefix is not required if using noprefix directive stackoverflow.com/questions/549347/…
  • Taryn East
    Taryn East almost 10 years
    Your post showed up in the "low quality" review queue... for not having enough explanation in it. My recommendation was based on that... Feel free to edit it to say what you have said above ;)
  • Necrolis
    Necrolis almost 10 years
    @LưuVĩnhPhúc: Interesting, I've see that directive before, probably cause its extremely poorly documented :( sourceware.org/binutils/docs/as/i386_002dVariations.html
  • Incerteza
    Incerteza over 9 years
    that's funny but I've never seen percent mark % being used.
  • Ciro Santilli OurBigBook.com
    Ciro Santilli OurBigBook.com almost 9 years
    GAS calls it "Memory References", documented at: sourceware.org/binutils/docs-2.18/as/i386_002dMemory.html x86 concept summarized brilliantly at: en.wikipedia.org/wiki/X86#Addressing_modes