+ -
当前位置:首页 → 问答吧 → 不知道vc想干嘛,翻译这么一段汇编

不知道vc想干嘛,翻译这么一段汇编

时间:2011-11-19

来源:互联网

不废话,看代码:

void f(int& val)
{
val++;

}

Assembly code


6:        val++; //c++中的
00401048   mov         eax,dword ptr [ebp+8]
0040104B   mov         ecx,dword ptr [eax]
0040104D   add         ecx,1
00401050   mov         edx,dword ptr [ebp+8]
00401053   mov         dword ptr [edx],ecx
7:
8:    }






[ebp+8]保存 参数val的值

然后进入函数体, 执行va++;

要是我写汇编的话,
我直接:

mov eax,[ebp+8];
add eax,1;
mov [ebp+8],eax;
即可

不知道 那段汇编搞什么??

eax保存了[val+8]的地址,ecx又保存了dword ptr [eax] 即ecx保存了[val+8]这块内存的内容!!!

然后 add ecx,1;

接着:又把[val+8]内存的地址放到edx中!!

然后把修改后的ecx的值放到[ebp+8]中!!

不知道vc搞什么,。 搞了这么复杂,到底想干什么???


作者: qunqun2012   发布时间: 2011-11-19

你开优化了么?

生成的没错啊。因为你是传引用进去的实际第一个参数是val的地址。

作者: mydo   发布时间: 2011-11-19

dword ptr这个指令 不是取地址的意思,

我理解错了,汇编都还给老师了。。。。。。。。。。。



这样,,,,,为了说明问题,, 一个是引用,一个不是引用

我贴出主要汇编来:
00401046 rep stos dword ptr [edi]
6: val++;
00401048 mov eax,dword ptr [ebp+8] //[ebp+8]中保存的是参数val的地址
0040104B add eax,1 //放到eax中,然后加1
0040104E mov dword ptr [ebp+8],eax //eax加1后,再次放到val中
7: 
8: }



6: val++;
00401048 mov eax,dword ptr [ebp+8]
0040104B mov ecx,dword ptr [eax]
0040104D add ecx,1
00401050 mov edx,dword ptr [ebp+8]
00401053 mov dword ptr [edx],ecx
7:
8: }

光看汇编, 谁能看出,哪个汇编是引用,哪个不是引用来???

附上原因,




引用 1 楼 mydo 的回复:
你开优化了么?

生成的没错啊。因为你是传引用进去的实际第一个参数是val的地址。

作者: qunqun2012   发布时间: 2011-11-19

6: val++; //c++中的
00401048 mov eax,dword ptr [ebp+8] //ebp+8保存的是val的值,这指令把 val放到eax中
0040104B mov ecx,dword ptr [eax] //把地址等于eax的内存放到ecx中
0040104D add ecx,1 //ecx加1
00401050 mov edx,dword ptr [ebp+8] //ebp+8的内存放到edx
00401053 mov dword ptr [edx],ecx //加1后的ecx放到地址为edx的内存中
7:
8: }


是不是有问题啊,

如果把 ebp+8中的内容理解为 val地址,那么


6: val++; //c++中的
00401048 mov eax,dword ptr [ebp+8] //地址放到eax
0040104B mov ecx,dword ptr [eax] // ebp+8中的内容放到ecx中
0040104D add ecx,1 //加1
00401050 mov edx,dword ptr [ebp+8] //ebp+8的内容 干嘛放到edx???? 这句或许是编译器搞出来的,多余了
00401053 mov dword ptr [edx],ecx // 
7:
8: }




引用楼主 qunqun2012 的回复:
不废话,看代码:

void f(int& val)
{
val++;

}

Assembly code


6: val++; //c++中的
00401048 mov eax,dword ptr [ebp+8]
0040104B mov ecx,dword ptr [eax]
0040104D add ……

作者: qunqun2012   发布时间: 2011-11-19

引用楼主 qunqun2012 的回复:
要是我写汇编的话,
我直接:
mov eax,[ebp+8];
add eax,1;
mov [ebp+8],eax;
即可

LZ,你也是放屁脱裤子----多此一举,你的三句要我写就一句:
inc [ebp+8] 
;------------------------
学汇编/反汇编,最大的好处之一就是让我们清楚,高级语言写的代码,到底是么意思。

作者: gsy999   发布时间: 2011-11-19