ollydbg 试手 问题:i = i++

问题

很久以前准备写的一篇blog,当时只写了题目,调试用ollydbg搞的,最近才想起来要填坑 大概是问,如下c系语言

int i = 0;  
i = i++;  

那么最终 i 的值是多少

调试环境

本来应该是ollydbg,但是现在电脑是64位,还是用ida pro 1.6 64位
codeblocks 16.01
gcc version 4.9.2
windows10

main.cpp

#include <stdio.h>
int main() {  
    int i = 0;
    i = i++;
    //为什么要加hello world,纯粹只是为了让调试的时候方便点
    printf("hello world   %d\n",i);
    return 0;
}

调试

利用ide编译生成,在bin/Debug里面,会有一个main.exe,把该文件直接拖入ida pro里面
如下图所示
i=i++.1.png

在打开的界面,鼠标放在任意一行按下F2(下断点)下个断点,接着按下F9(执行)运行,程序就会断在刚才断点之处
i=i++.2.png

接着不停的按下F8(单步跳过),直到看到下图_main函数
i=i++.3.png

尝试按下F7(单步进入)

i=i++.4.png

此时

.text:0040134E mov     dword ptr [esp+1Ch], 0
.text:00401356 mov     eax, [esp+1Ch]
.text:0040135A lea     edx, [eax+1]
.text:0040135D mov     [esp+1Ch], edx
.text:00401361 mov     [esp+1Ch], eax
.text:00401365 mov     eax, [esp+1Ch]
.text:00401369 mov     [esp+4], eax
.text:0040136D mov     dword ptr [esp], offset aHelloWorldD ; "hello world%d\n"
.text:00401374 call    _printf
.text:00401379 mov     eax, 0

dword ptr [esp+1Ch], 0 理解为int i的地址是在 [esp + 1Ch]处,被赋值为0
mov eax, [esp+1Ch], 就是说暂时把 i 的值赋值一份给eax
lea edx, [eax + 1],可以理解为 i++ 赋值给了 edx
mov [esp+1Ch], edx,可以理解为 i = i++中等号的作用,此时 i 的值为1
mov [esp+1Ch],eax,这样过后 i 又被赋值成了 0
所以后面打印出来的 i 值是 0

参考

IDA Pro使用技巧及大杂烩