汇编学习:完成swap(交换) 函数的 功能

#include<iostream>
using namespace std;


void swap (int *a , int *b )
{
	//int temp  = *a;
	//*a = *b;
	//*b = temp;


	_asm
	{
			mov eax , dword ptr [a]   ;  a  的指针地址--------int *pa = a
			mov ecx, dword ptr [eax]  ;  得到指针a 指向的值 ,存放到ecx 寄存 器 --------int _a = *pa

			mov ebx , dword ptr [b]   ;  b 的指针地址             -------- int *pb = b
			push ebx				  ;  保存当前b 的指针地址       -------- int * ptemp = pb
			mov ebx , dword ptr [ebx] ; 将b 指向的值 ,存放到ebx 寄存器  --------- int _b  = *pb

			mov dword ptr[eax] , ebx  ;  将eax (a) 指向的值 改为 ebx 寄存器的值 --- ----  *a = _b
			pop ebx					  ;  得到上次保存的地的址 ebx(b)              ------- pb = pTemp 
			mov dword ptr[ebx] , ecx  ;   将ebx (b) 指向的值 改为ecx 寄存器的值 a  --------*b = _a 
	}
}



void swap3(int *a , int *b)
{
	int * temp = a;
	a = b ; 
	b = a;
}


void swap1(int a ,int b)
{
	int temp = a ;
	a = b ;
	b = temp;
}

void swap2(int & a ,int &b)
{
	int temp = a;
	a = b ;
	b = temp;
}







int main()
{
/*
	int b  = 1;  
	int c  = 2;
*/
	
/*

	int *pb = &b ;
	int *pc=  &c;

	swap3 ( &b, &c );

	printf( "%d " ,b );
	printf( "%d " ,c );
*/

	int c = 10;
	int b = 20;
	int * pc;
	int * pb;
	_asm
	{
		lea eax , [c] ;和这句意思一样 "lea eax , dword ptr [c] | lea eax ,c "  编译器会自动转成前者 ,(得到c 的地址)
		mov ebx , [c]  ;和这句意思一样 "mov eax , dword ptr [c] | mov eax , c " ,编译器会自动转成后者  ,(得到c 的值 )

		lea ebx ,[b]
		
		mov pc ,eax ; 让pc  指向 c 的地址
		mov pb , ebx; 让pb 指向b 的地址
	}
	swap(pc, pb);  // 将pc指针的 的地址,和pb 的地址传过去。(是pc 本身的地址,不是pc 指向的地址)

	printf ( "%d ,  %d" , c,b );

	return  0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值