64,652
社区成员
发帖
与我相关
我的任务
分享
// 普通青年
std::swap(a, b);
// 文艺青年
void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
// 2B青年
void swap(int* a, int* b){*a^=*b^=*a^=*b;}
var_8= dword ptr -8
var_4= dword ptr -4
;定义两个变量5和4
mov [ebp+var_4], 5
mov [ebp+var_8], 4
;向函数传入两个地址
lea eax, [ebp+var_8] ;取4的偏移地址
mov [esp+4], eax ;将这个地址进栈
lea eax, [ebp+var_4] ;取5的偏移地址
mov [esp], eax ;将这个地址进栈
call sub_401390 ;调用普通方式的swap的函数
sub_401390 proc near ;实现过程
var_4= dword ptr -4
arg_0= dword ptr 8
arg_4= dword ptr 0Ch
push ebp ;保存ebp
mov ebp, esp ;将esp赋值给ebp
sub esp, 4 ;栈顶指针减4,开辟一个空间,就是上述代码中的tmp的空间
mov eax, [ebp+arg_0] ;将5的地址赋值给eax
mov eax, [eax] ;将eax指向的内容赋值给eax,取*a值的过程
mov [ebp+var_4], eax ;将*a的值赋值给新开辟的空间,即tmp
mov edx, [ebp+arg_0] ;用edx将4的地址保存
mov eax, [ebp+arg_4] ;将4的地址赋值给eax
mov eax, [eax] ;将eax指向的内容赋值给eax,取*b值的过程
mov [edx], eax ;将eax赋值给edx指向的内容,就*b = *a的过程
mov edx, [ebp+arg_4] ;将4赋值给edx
mov eax, [ebp+var_4] ;将tmp赋值给eax
mov [edx], eax ;将eax赋值给edx指向的空间,即*a = tmp的过程
leave
retn
sub_401390 endp
;同上
mov [ebp+var_4], 5
mov [ebp+var_8], 4
;同上
lea eax, [ebp+var_8]
mov [esp+4], eax
lea eax, [ebp+var_4]
mov [esp], eax
call sub_401390
sub_401390 proc near
var_10= dword ptr -10h
arg_0= dword ptr 8
arg_4= dword ptr 0Ch
push ebp ;保存ebp
mov ebp, esp ;将esp赋值给ebp
;下面保存三个寄存器保存,以便能下面使用这三个寄存器
push edi
push esi
push ebx
sub esp, 4 ;开辟一个空间
mov edi, [ebp+arg_0] ;取值5赋值给edi
mov eax, [ebp+arg_0] ;取值5赋值给eax
mov [ebp+var_10], eax ;将eax赋值给ebp-10的地方
mov ebx, [ebp+arg_4] ;将4地址赋值给ebx
mov esi, [ebp+arg_4] ;将4地址赋值给esi
mov ecx, [ebp+arg_0] ;将5地址赋值给ecx
mov edx, [ebp+arg_0] ;将5地址赋值给edx
mov eax, [ebp+arg_4] ;将4地址赋值给eax
mov eax, [eax] ;将eax指向的内容赋值给eax,就是eax = 4
xor eax, [edx] ;将edx指向的内容与eax进行按为异或,就是4^5的过程,结果eax=(100)^(101)=001
mov [ecx], eax ;将eax赋值给ecx指向的空间,此时ecx = 1
mov eax, [ecx] ;将ecx指向的空间赋值给eax
xor eax, [esi] ;将esi指向的空间和eax进行异或,即4^1=(100)^(001)=101=5;
mov [ebx], eax ;将eax赋值给[ebx],就是4的地址
mov eax, [ebx] ;将[ebx]赋值给eax
mov edx, [ebp+var_10] ;将最开始的eax赋值给edx,即5
xor eax, [edx] ;5与eax进行异或,即5^1=(101)^(001)=(100)=4
mov [edi], eax ;保存到[edi]中,edi最开始是5的地址,这样就保证了交换
add esp, 4 ;释放申请的空间
;下面是恢复ebx,esi,edi,ebp,清除现场
pop ebx
pop esi
pop edi
pop ebp
retn
sub_401390 endp