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里面

如下图所示

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

接着不停的按下F8(单步跳过),直到看到下图_main函数

尝试按下F7(单步进入)

此时

.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使用技巧及大杂烩