2

当我阅读一些反汇编代码时,由于我不了解 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>

有人可以告诉它是什么意思吗?谢谢!

4

2 回答 2

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
于 2012-05-16T03:07:04.290 回答
2

这个 wikibook 似乎有一些关于 GNU 汇编器及其 AT&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
于 2012-05-16T03:13:18.280 回答