;交換[esi],[edi]兩個記憶體變數
moveax, [esi]
xchg
eax, [edi]
mov[esi],eax
;功能:使用子程式交換兩個記憶體變數
include vcio.inc
.data
num1 dword 1234
num2 dword 5678
str_output byte "num1 = %d, num2 = %d",0ah,0
.code
;主程式
main proc
push offset num1
push offset num2
call
swap
invoke printf, offset str_output, num1, num2
retmain endp
;子程式
swap proc
push ebp
mov ebp, esp
pushad
;body of swap
;[ebp+4] is return addr,[ebp+8] is the first argument,[ebp+12] is the sec agru
mov esi, [ebp+8]
mov edi, [ebp+12]
;swap [esi],[edi]
mov eax, [esi]
xchg eax, [edi]
mov [esi], eax
popad
pop ebp
ret2*4;2 is the num of arguments, 4 is the size of argument
swap endp
end main
push offset num1 ;將引數進棧push offset num2 ;將第二個引數進棧
call swap ;呼叫子函式,有兩個動作,第乙個是將下一條指令的位址入棧,第二個動作是轉到子程式,即將eip修改為子程式的位址
子程式一進來就有push ebp 和mov ebp, esp兩句這裡是剛開始接觸子程式呼叫的難點,為什麼不直接使用esp而還要賦給ebp使用ebp呢?
因為esp的位置會隨著程式pop,push而動態改變
我們後面要訪問第乙個引數本來是在[esp+8],但因為pushad後esp改變了,第乙個引數也就不再是[esp+8]
所有我們一進來就將esp儲存在ebp中,之後第乙個引數就可以通過[ebp+8]訪問
ret 2*4這一句是說明將兩個引數彈出棧不要了,因為棧中每個資料戰4個位元組,所以*4
交換兩個變數
目的 實現兩個變數值的交換 以int 型別為例 方法一 使用臨時變數。優點 安全,適合任何型別資料交換,無溢位風險。缺點 保守 效率不高,需要使用第三方臨時變數 棧空間 1 void swap value int var1,int var2 2 方法二 利用 算術運算實現。優點 不需要額外的臨時變數...
swap交換兩個變數
最簡單的交換兩個變數值是用指標。void swap int a,int b work 這裡有個問題,一定要想清楚。為什麼在函式體內不能交換指標了?變成這樣 void swap int a,int b will not work在swap函式裡,a and b 都會產生乙個copy來,那你tmp a ...
交換兩個變數方法
將兩個變數的值互換,相當簡單的問題。假設有變數a b int a int b 方法1 將a b的值互換,為 int tmp a a b b tmp 然而,如果要求不用中間變數,就交換變數的值,該怎麼做呢?乙個比較有效率且眾所周知的方法就是 方法2 三次異或操作 int a 10,b 12 a 101...