cpu cmpxchg 指令理解 (CAS)

来源:互联网 发布:王自如 罗永浩 知乎 编辑:程序博客网 时间:2024/04/28 08:06

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<iostream>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,bcmpxchg c,ebxmov a,eax    }cout << "b := " << b << endl;cout << "c := " << c << endl;cout << "a := " << a << endl;return 0;}
输出:(如果不等, "首操作数"(c)的值装载到AL/AX/EAX/RAX并将zf清0)

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


#include<iostream>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,99mov ebx,777cmpxchg c,ebxmov a,eax}cout << "b := " << b << endl;cout << "c := " << c << endl;cout << "a := " << a << endl;return 0;}



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



0 0