关于 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)的主要内容,如果未能解决你的问题,请参考以下文章
Linux下的AT&T语法(即GNU as 汇编语法)入门