简体   繁体   中英

about AT&T assembly syntax (%esp,1)

When I read some disassembly code, for I am not up on AT&T syntax, I do not know what some code like (%esp,1) means.

11      printf("%x", a);
0x401386        <main+182>:    movl  $0x1,0x4(%esp,1)
0x40138e        <main+190>:    movl  $0x40300d,(%esp,1)
0x401395        <main+197>:    call  0x401810 <printf>

Could someone tell what it does mean? Thank you!

                              ; Decompiled, sort of, back to C
                              ; ==============================
    movl  $0x1,0x4(%esp,1)    ; %esp[1] = 1 (the "1" really means, "add 4")
    movl  $0x40300d,(%esp,1)  ; %esp[0] = "%x"
    call  0x401810 <printf>   ; push return address and branch to printf

It seems that the compiler knows that a is equal to 1 , and that it already has adjusted the stack pointer downward to make room for the arguments. Perhaps it combined pushing space onto the stack with the function prologue.

In general, the addressing modes look like...

r    ; register
(r)  ; memory, register contains the address
8(r) ; memory, displacement of 8 off the register

This wikibook seems to have some information about the GNU assembler and its AT&T syntax:

http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax

I also found these two sources of documentation on Gas, but they don't seem to be very clear or useful:

  1. http://webster.cs.ucr.edu/AsmTools/Gas/GasDoc/as_toc.html
  2. http://sourceware.org/binutils/docs-2.17/as/index.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM