gcc在x86程序集中编译二进制文件

时间:2013-11-14 00:16:59

标签: gcc assembly x86

gcc compile binary具有以下程序集:

 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并测试它是否是偶数地址,但我已经失去了为什么会发生这种情况。我想知道这里究竟发生了什么。

1 个答案:

答案 0 :(得分:1)

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