当我阅读一些反汇编代码时,因为我没有使用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>
有人能说出它的意思吗?谢谢!
答案 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的这两个文档来源,但它们似乎不是很清楚或有用: