关于AT& T汇编语法(%esp,1)

时间:2012-05-16 03:02:15

标签: c assembly att

当我阅读一些反汇编代码时,因为我没有使用AT& T语法,我不知道像(%esp,1)这样的代码是什么意思。

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>

有人能说出它的意思吗?谢谢!

2 个答案:

答案 0 :(得分:2)

                              ; 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

似乎编译器知道 a 等于 1 ,并且它已经向下调整了堆栈指针以为参数腾出空间。也许它通过功能序言将空间推入堆栈。

通常,寻址模式看起来像......

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

答案 1 :(得分:2)

这个wikibook似乎有一些关于GNU汇编程序及其AT&amp; T语法的信息:

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

我还发现了Gas的这两个文档来源,但它们似乎不是很清楚或有用:

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