关于两个对象交换的扩展
来源:互联网 发布:淘宝男模特何家彦 编辑:程序博客网 时间: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中
仅从汇编代码的行数来看,使用乘除法的代码量最大,异或和加减法的代码量次之,使用中间变量的方法的代码量最小,因此使用中间变量的方法效果不一定差。
- 关于两个对象交换的扩展
- 关于两个对象的交换
- 关于两个对象交换的问题
- 关于Java交换两个对象的问题
- 关于Java交换两个对象的问题
- 关于Java交换两个对象的问题
- 关于两个对象交换的问题(实践的角度)
- 关于两个值的交换
- 关于两个数的交换
- 关于两个值的交换
- 两个变量交换的扩展思考
- 关于交换两个数的思考
- 关于交换两个值的一些讨论
- 一、关于交换两个变量的问题
- 关于交换两个变量
- 关于两个数交换
- 关于两个对象的比较
- java怎么实现两个对象内容的交换
- 各种分布式文件系统简介
- 最近一段时间的关于FPGA的工作总结
- CSS学习之一
- jboss eap6.1(5)(ejb升级)
- hdu 3046 Pleasant sheep and big big wolf (最小割)
- 关于两个对象交换的扩展
- linux进程编程
- Vim:打造Linux C/C++程序员的编辑器
- 理解软件开发
- 上班时间打帝国,太疯狂了... ...
- Java系列笔记 - Java 类加载与初始化
- 高效地展示Bitmap
- java--第一天
- FZU - 2115 多项式积分