彙編 通過子程式交換兩個記憶體變數

2021-07-11 08:07:13 字數 1425 閱讀 7625

;交換[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...