【问题标题】:gcc compiled binary in x86 assemblygcc 在 x86 程序集中编译的二进制文件
【发布时间】:2013-11-14 00:16:58
【问题描述】:

gcc 编译二进制有以下程序集:

 8049264:   8d 44 24 3e             lea    0x3e(%esp),%eax          
 8049268:   89 c2                   mov    %eax,%edx                
 804926a:   bb ff 00 00 00          mov    $0xff,%ebx               
 804926f:   b8 00 00 00 00          mov    $0x0,%eax                
 8049274:   89 d1                   mov    %edx,%ecx                
 8049276:   83 e1 02                and    $0x2,%ecx                
 8049279:   85 c9                   test   %ecx,%ecx
 804927b:   74 09                   je     0x8049286

乍一看,我根本不知道它在做什么。我最好的猜测是某种内存对齐和清除局部变量(因为 rep stos 在局部变量位置填充 0)。如果你看一下前几行,将地址加载到 eax 并移动到 ecx 并测试它是否是偶数地址,但我不知道为什么会这样。我想知道这里到底发生了什么。

【问题讨论】:

    标签: gcc assembly x86


    【解决方案1】:

    看起来像是将位于 [ESP + 0x03e] 的局部变量初始化为零。首先,初始化 EDX 以保存地址,初始化 EBX 以保存以字节为单位的大小。然后,检查EDX & 2 是否为非零;换句话说,EDX 作为指针是否是 wyde-aligned 但不是 tetra-aligned。 (假设 ESP 是四字节对齐的,因为它通常应该是,在 ESP 上方的 0x3E 字节处初始化的 EDX 不会是四字节对齐的。但这有点无关紧要。)如果是这种情况,来自 AX 的 wyde,它为零,存储在 [EDX],EDX 加 2,计数器 EBX 减 2。现在,假设 ESP 至少是 wyde 对齐的,EDX 保证是四对齐的。通过将 EBX 右移两位来计算 ECX 以保存剩余的 4 字节数,从 EDX 加载 EDI,REP STOS 在 [EDI] 处存储许多零 4 字节,在此过程中增加 EDI。然后,从 EDI 加载 EDX 以获取指针-过去空间初始化-到目前为止。最后,如果至少有两个字节未初始化,则将零字节存储在 [EDX] 并且 EDX 增加 2,如果至少有一个字节未初始化,则将零字节存储在 [EDX] 和 EDX加一。这种额外复杂性的关键显然是将大多数零存储为四字节值而不是单字节值,在某些情况下和某些 CPU 架构中,这可能会稍微快一些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-13
      • 2011-04-14
      • 2011-01-09
      • 2012-02-16
      • 1970-01-01
      • 2010-09-16
      • 2013-02-02
      • 1970-01-01
      相关资源
      最近更新 更多