关于两个对象交换的扩展

来源:互联网 发布:淘宝男模特何家彦 编辑:程序博客网 时间:2024/04/30 07:06

前面一节,我讲到了两个对象交换的四种方法,今天,通过调试,来比较下这四种方法的汇编代码,测试环境为vc6.0

方法1:temp = a;mov eax, dword ptr[ebp + 8] //ptr[ebp + 8]为a的地址mov ecx, dword ptr[eax]     //在ecx中暂存a中的内容mov dword ptr[ebp-4], ecx   //ebp-4为c的地址,将a的值赋值给tempa = b;mov edx, dword ptr[ebp+8]   //取a的地址mov eax, dword ptr[ebp+0Ch] //取b的地址, ptr[ebp+0Ch]为b的地址mov ecx, dword ptr[eax]     //在ecx中存放b的值mov dword ptr[edx], ecx     //将b的值赋值给ab = temp;mov edx, dword ptr[ebp+0ch] //取b的地址mov eax, dword ptr[ebp-4]   //读temp中的值mov dword ptr[edx],eax      //把temp的值赋值给b


方法2:a = a^b;mov eax, dword ptr[ebp+8]      //取a的地址mov ecx, dword ptr[ebp+0ch]    //取b的地址mov edx, dword ptr[eax]        //将a的值存放在寄存器中xor edx, dword ptr[ecx]        //进行异或操作mov eax, dword ptr[ebp+8]      //取a的地址mov dword ptr[eax], edx        //把数据写回到a中b = a^b;mov ecx, dword ptr[ebp+8]      //取a的地址mov edx, dword ptr[ebp+0ch]    //取b的地址mov eax, dword ptr[ecx]        //将a的值存放在寄存器中xor eax, dword ptr[edx]        //进行异或操作mov ecx, dword ptr[ebp+0ch]    //取b的地址mov dword ptr[ecx], eax        //把数据写回到b中a = a^b;mov edx, dword ptr[ebp+8]      //取a的地址mov eax, dword ptr[ebp+0ch]    //取b的地址mov ecx, dword ptr[edx]        //将a的值存放在寄存器中xor ecx, dword ptr[eax]        //进行异或操作mov edx, dword ptr[ebp+8]      //取a的地址mov dword ptr[ebp+8], ecx      //把数据写回到a中

方法3:a = a + b;mov eax, dword ptr[ebp+8]       //取a的地址mov ecx, dword ptr[eax]         //读a的值到寄存器中mov edx, dword ptr[ebp+0ch]     //取b的地址add ecx, dword ptr[edx]         //进行加操作mov eax, dword ptr[ebp+8]       //取a的地址mov dword ptr[eax], ecx         //把数据写回到a中b = a - b;mov ecx, dword ptr[ebp+8]       //取a的地址mov edx, dword ptr[ebp+0ch]     //取b的地址mov eax, dword ptr[ecx]         //读a的值到寄存器中sub eax, dword ptr[edx]         //进行减操作mov ecx, dword ptr[ebp+0ch]     //取b的地址mov dword ptr[ecx], eax         //把数据写回到b中a = a - b;mov edx, dword ptr[ebp+8]       //取a的地址mov eax, dword ptr[ebp+0ch]     //取b的地址mov ecx, dword ptr[edx]         //读a的值到寄存器中sub ecx, dword ptr[eax]         //进行减操作mov edx, dword ptr[ebp+8]       //取a的地址mov dword ptr[ebp+8], ecx       //把数据写回到a中


方法4:a = a * b;mov eax, dword ptr[ebp+8]       //取a的地址mov ecx, dword ptr[ebp+0ch]     //取b的地址mov edx, dword ptr[eax]         //读a的值到寄存器中imul edx, dword ptr[ecx]        //进行乘操作mov eax, dword ptr[ebp+8]       //取a的地址mov dword ptr[eax], ecx         //把数据写回到a中b = a / b;mov ecx, dword ptr[ebp+8]       //取a的地址mov esi, dword ptr[ebp+0ch]     //取b的地址mov eax, dword ptr[ecx]         //读a的值到寄存器中cdq                             //先把edx的每一位置为eax的最高位,再把edx扩展为eax的高位idiv eax, dword ptr[esi]        //进行除法操作mov edx, dword ptr[ebp+0ch]     //取b的地址mov dword ptr[edx], eax         //把数据写回到b中a = a / b;mov eax, dword ptr[ebp+8]       //取a的地址mov ecx, dword ptr[ebp+0ch]     //取b的地址mov eax, dword ptr[eax]         //读a的值到寄存器中cdq                             //先把edx的每一位置为eax的最高位,再把edx扩展为eax的高位idiv eax, dword ptr[ecx]        //进行除法操作mov edx, dword ptr[ebp+8]       //取a的地址mov dword ptr[edx], eax         //把数据写回到a中


仅从汇编代码的行数来看,使用乘除法的代码量最大,异或和加减法的代码量次之,使用中间变量的方法的代码量最小,因此使用中间变量的方法效果不一定差。