Chinaunix首页 | 论坛 | 博客

分类: LINUX

2011-10-13 20:02:35

 反汇编指令及代码如下:
  2 #include
  3 int main()
  4 {
  5 #define XNUM_TO_DIGIT(x) ("0123456789abcdef"[x]+ 0)
  6 int a = 2;
  7 int b = XNUM_TO_DIGIT(a);
  8 printf("%x",b);
  9 }

运行过程是这样的:
在调用main函数时,上面特意留出两个空间来表示堆栈。push 指令是 1: add $0x4, %esp 2: movl xx, %esp ;pop 指令是:1 : ovl %esp , xx ;2 : sub  $0x4, %esp
                   1 [         ] <-----esp + 8
                   2 [         ] <----esp + 4 ecx取道的地址是这里esp。 最后使用lea 不就是得到原来正好要使用到的esp么。真费劲,我觉得pop不行,因为pop %esp还没有听说过*/
                   3 [   xx    ] <----esp
                   4 [  原esp  ]<----esp -4
                   5 [  原ebp  ] <----esp - 8
                   6 [  原ecx  ]<---esp -12 最后堆栈esp 指向这里
                   7 [         ] <----esp  分配大小0x24
                      . . . . . .
                      [         ]       注意在mov %esp ,%ebp指令中是没有改变esp的。
                  
                     恢复堆栈
                                3 [   xx   ]<-------
                                4 [  原esp ]<-------最后用lea 去有效地址直接就能得到 原esp,不用出栈的pop了*/
                                5 [ 原ebp  ]<-------pop %ebp 将ebp出栈,出栈后esp指向原esp的位置,所以取esp的有效地址然后 - 4就是当前的esp。
                                6 [ ecx内值]<-------add $0x24 , %esp返回到这里,从这里pop %ecx
                                7 [    . .  ]<-------
                                8 [    . .  ]<-------

            



080483a4
:

80483a4:       8d 4c 24 04             lea    0x4(%esp),%ecx  /*这是原esp的有效地址即为偏移地址esp为了使esp入栈,因为没有指令可以让esp直接入栈。入栈出栈,esp只是辅助操作的*/
80483a8:       83 e4 f0                and    $0xfffffff0,%esp
80483ab:       ff 71 fc                pushl  0xfffffffc(%ecx) /*出入ecx之后就是前一个esp的偏移值,那么- 4 就是esp的值*/
80483ae:       55                      push   %ebp
80483af:       89 e5                   mov    %esp,%ebp
80483b1:       51                      push   %ecx
80483b2:       83 ec 24                sub    $0x24,%esp
80483b5:       c7 45 f4 02 00 00 00    movl   $0x2,0xfffffff4(%ebp)
80483bc:       8b 45 f4                mov    0xfffffff4(%ebp),%eax
80483bf:       0f b6 80 c3 84 04 08    movzbl 0x80484c3(%eax),%eax
80483c6:       0f be c0                movsbl %al,%eax
80483c9:       89 45 f8                mov    %eax,0xfffffff8(%ebp)
80483cc:       8b 45 f8                mov    0xfffffff8(%ebp),%eax
80483cf:       89 44 24 04             mov    %eax,0x4(%esp)
80483d3:       c7 04 24 c0 84 04 08    movl   $0x80484c0,(%esp)
80483da:       e8 d9 fe ff ff          call   80482b8
80483df:       83 c4 24                add    $0x24,%esp
80483e2:       59                      pop    %ecx
80483e3:       5d                      pop    %ebp
80483e4:       8d 61 fc                lea    0xfffffffc(%ecx),%esp


总结:这里我认为pushl可能不用也行吧。如果没有pushl仍然可以用ecx来恢复原esp的啊。
阅读(1474) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~