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

Posted

技术标签:

【中文标题】关于 AT&T 汇编语法 (%esp,1)【英文标题】:about AT&T assembly syntax (%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,了解有关语法的更多详细信息,以及指向更多文档的链接。 【参考方案1】:

这本 wikibook 似乎有一些关于 GNU 汇编器及其 AT&T 语法的信息:

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

我也找到了这两个关于 Gas 的文档来源,但它们似乎不是很清楚或有用:

    http://webster.cs.ucr.edu/AsmTools/Gas/GasDoc/as_toc.html 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"限定的

以上是关于关于 AT&T 汇编语法 (%esp,1)的主要内容,如果未能解决你的问题,请参考以下文章

关于 AT&T 语法汇编中的 cmp/jg、jle 等

需要一个很好的 AT&T 汇编语法来源

AT&T汇编语法与x86语法基本区别

Linux下的AT&amp;T语法(即GNU as 汇编语法)入门

Linux下AT&T汇编语法格式与Intel汇编语法格式异同

与 AT&T 相比,英特尔汇编语法的局限性 [关闭]