cpu cmpxchg 指令理解 (CAS)

cmpxchg是汇编指令
作用:比较并交换操作数.
如:CMPXCHG r/m,r 将累加器AL/AX/EAX/RAX中的值与首操作数(目的操作数)比较,如果相等,第2操作数(源操作数)的值装载到首操作数,zf置1。如果不等, 首操作数的值装载到AL/AX/EAX/RAX并将zf清0
该指令只能用于486及其后继机型。第2操作数(源操作数)只能用8位、16位或32位寄存器。第1操作数(目地操作数)则可用寄存器或任一种存储器寻址方式。

内嵌汇编理解cmpxchg指令(CAS)

#include
using namespace std;
int main(){
	int a=0,b=0,c=0;

	__asm{
		mov eax,100;
		mov a,eax
	}
	cout << "a := " << a << endl;
	b = 99;
	c = 11;
	__asm{
		mov ebx,b
		cmpxchg c,ebx
		mov a,eax    
	}
	cout << "b := " << b << endl;
	cout << "c := " << c << endl;
	cout << "a := " << a << endl;
	return 0;
}
输出:( 如果不等, "首操作数"(c)的值装载到AL/AX/EAX/RAX并将zf清0)

a := 100
b := 99
c := 11
a := 11


#include
using namespace std;
int main(){
	int a=0,b=0,c=0;

	__asm{
		mov eax,100;
		mov a,eax
	}
	cout << "a := " << a << endl;
	b = 99;
	c = 99;
	__asm{
		mov eax,99
		mov ebx,777
		cmpxchg c,ebx
		mov a,eax
	}
	cout << "b := " << b << endl;
	cout << "c := " << c << endl;
	cout << "a := " << a << endl;
	return 0;
}



输出:( 如果相等,第2操作数(源操作数)的值装载到首操作数,zf置1)
a := 100
b := 99
c := 777
a := 99



你可能感兴趣的:(Windows,C/C++,Assembler)