2012-05-16 43 views
2

当我读了一些反汇编代码,因为我不起来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> 

有人能说出它的含义吗?谢谢!

+1

'为0x4(%ESP,1)'是相同'[ESP * 1个+为0x4]'在Intel语法。 –

+0

但是......似乎[esp + 0x4 * 1]更常见? - 为我可怜的英语打扮。 0x4(%esp,2)似乎没有实际意义? – runningair

+0

常见的类似'[esp + eax * 4 + 16]'(其中'eax'是位于'esp + 16'的32位整数数组的索引]。这就是寻址模式中存在“缩放”的原因。 –

回答

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 

看来,编译器知道一个等于,而且它已经调整了堆栈指针向下腾出空间的参数。也许它结合了功能序言将空间推到堆栈上。

一般来说,寻址模式看起来像......

r ; register 
(r) ; memory, register contains the address 
8(r) ; memory, displacement of 8 off the register 
+0

谢谢!但是......“,1”没用? – runningair

+0

x86具有索引寻址模式,“1”不是必需的,但可能是2或4使用了索引功能。这只是反汇编没有灵感。 – DigitalRoss

+0

因此,0x4(%esp,2)表示*(%esp + 2 * 0x4),0x4(%esp,4)表示*(%esp + 4 * 0x4),0x4(%esp,3)被禁止? – runningair