首页
登录 | 注册

一个反汇编的 = 分析

 反汇编指令及代码如下:
  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的啊。

相关文章

  • RTC的驱动移植和JNI修改 唠叨几句,本文目的是: 1>移植hym8563的rtc驱动,硬件板载是S905X,操作系统是Android7.1. 2>从drivers分析道DateTimeSetting.java的执行过程. 首 ...
  • 一.编译运行    Erlang程序运行主要有三种方式:    1.在Erlang shell中编译运行:        c(hello).        hello:start().    2.在命令提示符下编译运行:        er ...
  • 综述 UBI全称Unsorted Block Images,是一种原始flash设备的卷管理系统.这个系统能在一个物理的flash设备上管理操纵多个卷并且能在整个flash芯片上实现损耗均衡. 从某种意义上说,UBI和LVM有点相似,LVM ...
  • Linux内核连接跟踪锁的优化分析(2) 作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net  微博:weibo.com/glinuxer QQ技术群:4367710 路漫漫其修 ...
  • 1. 背景:     一直以为OpenStack的创建快照的操作是在线创建快照(live snapshot), 并且应该是增量的快照,即利用virsh或者qemu的live snapshot来实现的:          virsh  sna ...
  • kmemleak的工作原理很简单,主要是对kmalloc().vmalloc().kmem_cache_alloc()等接口分配的内存地址空间进行跟踪,通过对其地址.空间大小.分配调用栈等信息添加到PRIO搜索树中进行管理.当有匹配的内存释 ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.014 s.
京ICP备10005923号