前面一節,我講到了兩個物件交換的四種方法,今天,通過除錯,來比較下這四種方法的彙編**,測試環境為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的值賦值給temp
a = 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的值賦值給a
b = 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中
僅從彙編**的行數來看,使用乘除法的**量最大,異或和加減法的**量次之,使用中間變數的方法的**量最小,因此使用中間變數的方法效果不一定差。
關於兩個物件的交換
為使問題簡單化,設定a b為整型定義如下 int a int b 要求做到將a,b的值互換 方法1 使用中間變數temp int temp temp a a b b temp 方法2 不使用中間變數,採用異或的方法 a a b b a b a a b 方法3 不使用中間變數,使用加減法a a b b...
關於兩個窗體之間交換資料
學習.net不短時間了,最近做的乙個東西需要用到在幾個窗體之間進行通訊。類似於一般軟體的設定這個選項卡,開啟時候進行一些基本引數的設定,然後主程式會根據這些引數作出反映。之前我採取的方法是在主窗體類中建立乙個子窗體的例項。然後把要傳遞的子窗體引數設定為public,這樣在主窗體中就可以呼叫了。這樣做...
兩個整數交換
第乙個程式設計題是 用 c 語言寫乙個函式交換兩整數的值,不借助第三個變數。事實上這個題目一聽到就有了想法,因為以前有做過,形如 方法一 a a b b a b a a b 不過提出了最大的問題,就是兩個正數的溢位問題。這個確實是缺限,以前遇到卻沒去找它的解決方法。此時提出了強轉型別為long in...