Listing 9.1: Optimizing MSVC 2010 (/Ox /Ob0)

    1. COMM _sum:DWORD
    2. $SG2803 DB sum=%d, product=%d’, 0aH, 00H
    3. _x$ = 8 ; size = 4
    4. _y$ = 12 ; size = 4
    5. _sum$ = 16 ; size = 4
    6. _product$ = 20 ; size = 4
    7. _f1 PROC
    8. mov ecx, DWORD PTR _y$[esp-4]
    9. mov eax, DWORD PTR _x$[esp-4]
    10. lea edx, DWORD PTR [eax+ecx]
    11. mov ecx, DWORD PTR _product$[esp-4]
    12. push esi
    13. mov esi, DWORD PTR _sum$[esp]
    14. mov DWORD PTR [esi], edx
    15. mov DWORD PTR [ecx], eax
    16. pop esi
    17. ret 0
    18. _f1 ENDP
    19. _main PROC
    20. push OFFSET _product
    21. push 123 ; 0000007bH
    22. call _f1
    23. mov eax, DWORD PTR _product
    24. mov ecx, DWORD PTR _sum
    25. push eax
    26. push ecx
    27. push OFFSET $SG2803
    28. call DWORD PTR __imp__printf
    29. add esp, 28 ; 0000001cH
    30. xor eax, eax
    31. _main ENDP

    让我们在OD中查看:图9.1。首先全局变量地址被传递进f1()。我们在堆栈元素点击“数据窗口跟随”,可以看到数据段上分配两个变量的空间。这些变量被置0,因为未初始化数据(BSS1)在程序运行之前被清理为0。这些变量属于数据段,我们按Alt+M可以查看内存映射fig. 9.5.

    让我们跟踪(F7)到f1()fig. 9.2.在堆栈中为456 (0x1C8) 和 123 (0x7B),接着是两个全局变量的地址。

    让我们跟踪到f1()结尾,可以看到两个全局变量存放了计算结果。

    Figure 9.1: OllyDbg: 全局变量地址被传递进f1()

    9.1 Global variables example - 图2

    Figure 9.2: OllyDbg: f1()开始

    Figure 9.3: OllyDbg: f1()完成

    Figure 9.4: OllyDbg: 全局变量被传递进printf()

    9.1 Global variables example - 图5