-1

gcc compile binary has following assembly:

 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

At first glance, I had no idea what it is doing at all. My best guess is some sort of memory alignment and clearing up local variable (because rep stos is filling 0 at local variable location). If you take a look at first few lines, load address into eax and move to ecx and test if it is even address or not, but I'm lost why this is happening. I want to know what exactly happen in here.

4

1 回答 1

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 架构中,这可能会稍微快一些。如果至少有两个字节未初始化,则将零字节存储在 [EDX] 并且 EDX 递增 2,如果至少有一个字节未初始化,则将零字节存储在 [EDX] 并且 EDX 递增一个。这种额外复杂性的关键显然是将大多数零存储为四字节值而不是单字节值,在某些情况下和某些 CPU 架构中,这可能会稍微快一些。如果至少有两个字节未初始化,则将零字节存储在 [EDX] 并且 EDX 递增 2,如果至少有一个字节未初始化,则将零字节存储在 [EDX] 并且 EDX 递增一个。这种额外复杂性的关键显然是将大多数零存储为四字节值而不是单字节值,在某些情况下和某些 CPU 架构中,这可能会稍微快一些。

于 2013-11-14T00:47:19.843 回答