当我读了一些反汇编代码,因为我不起来AT & T语法,我不知道什么样的一些代码(%ESP,1)表示。有关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>
有人能说出它的含义吗?谢谢!
当我读了一些反汇编代码,因为我不起来AT & T语法,我不知道什么样的一些代码(%ESP,1)表示。有关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>
有人能说出它的含义吗?谢谢!
这维基似乎有关于GNU汇编器和AT & T语法的一些信息:
http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax
我还发现燃气文档的这两个来源,但他们似乎并不很清晰或有用:
; 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
看来,编译器知道一个等于,而且它已经调整了堆栈指针向下腾出空间的参数。也许它结合了功能序言将空间推到堆栈上。
一般来说,寻址模式看起来像......
r ; register
(r) ; memory, register contains the address
8(r) ; memory, displacement of 8 off the register
谢谢!但是......“,1”没用? – runningair
x86具有索引寻址模式,“1”不是必需的,但可能是2或4使用了索引功能。这只是反汇编没有灵感。 – DigitalRoss
因此,0x4(%esp,2)表示*(%esp + 2 * 0x4),0x4(%esp,4)表示*(%esp + 4 * 0x4),0x4(%esp,3)被禁止? – runningair
'为0x4(%ESP,1)'是相同'[ESP * 1个+为0x4]'在Intel语法。 –
但是......似乎[esp + 0x4 * 1]更常见? - 为我可怜的英语打扮。 0x4(%esp,2)似乎没有实际意义? – runningair
常见的类似'[esp + eax * 4 + 16]'(其中'eax'是位于'esp + 16'的32位整数数组的索引]。这就是寻址模式中存在“缩放”的原因。 –