關於兩個物件交換的擴充套件

2021-06-19 07:48:28 字數 3734 閱讀 6082

前面一節,我講到了兩個物件交換的四種方法,今天,通過除錯,來比較下這四種方法的彙編**,測試環境為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...