问题
很久以前准备写的一篇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