【问题标题】:about AT&T assembly syntax (%esp,1)关于 AT&T 汇编语法 (%esp,1)
【发布时间】:2012-05-16 03:02:14
【问题描述】:

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

有人能说出这是什么意思吗?谢谢!

【问题讨论】:

  • 0x4(%esp,1) 与 Intel 语法中的 [esp*1 + 0x4] 相同。
  • 但是……好像[esp+ 0x4*1]比较常见? ——对不起我的英语不好。 0x4(%esp,2) 好像没什么实际意义?
  • 常见的是[esp+eax*4+16](其中eax 是位于esp+16 的32 位整数数组的索引)。这就是寻址模式中存在“规模”的原因。
  • "比较常见?"比较常见的是odes note matter您使用的工具很重要。
  • 另请参阅AT&T syntax tag wiki,了解有关语法的更多详细信息,以及指向更多文档的链接。

标签: c assembly att


【解决方案1】:

这本 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

【讨论】:

    【解决方案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" 没用?
    • x86 具有索引寻址模式,“,1”不是必需的,但如果使用了索引功能,则可能是 ,2 或 ,4。只是反汇编器没有灵感。
    • 所以,0x4(%esp,2) 表示 *(%esp + 2*0x4),0x4(%esp,4) 表示 *(%esp + 4*0x4),0x4(% esp,3) 被禁止?
    • "好像编译器知道a等于1",是的,"a"是由"const"限定的
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多