欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

求大神帮忙见见内联汇编

更新时间: 2014-01-05 03:18:01 责任编辑: Author_N1

 

求大神帮忙看看内联汇编
有一个gcc下AT$T格式的内联汇编函数,就几行,要转到windows下masm格式的,实现的是
compare-and-swap的一个基本操作,求大神帮忙看看,感激不尽!!

inline bool CAS(long *ptr, long oldv, long newv) 
{
      unsigned char ret;
      /* Note that sete sets a 'byte' not the word */
      __asm__ __volatile__ (   //  AT&T assembly
                    "  lock\n"
                    "  cmpxchgq %2,%1\n"
                    "  sete %0\n"
                    : "=q" (ret), "=m" (*ptr)
                    : "r" (newv), "m" (*ptr), "a" (oldv)
                    : "memory");
      return ret;
    }

--参考方法--
这是GCC 中C内嵌汇编:
__asm__ __volatile__ (   //  AT&T assembly
                    "  lock\n"
                    "  cmpxchgq %2,%1\n"
                    "  sete %0\n"
                    : "=q" (ret), "=m" (*ptr)
                    : "r" (newv), "m" (*ptr), "a" (oldv)
                    : "memory");
"memory"的意思是通知编译器,内存布局发生变化了,常发生在基址发生变化时使用。%0 = ret %1=*ptr %2=newv 以上三个都是C中的局存变量。至于指令lock cmpxchgg sete是什么意思,我就不清楚了,我是做ARM的对intel汇编不太了解
--参考方法--
sete 设置ret=ZF,ZF是0标记位
CMPXCHG CX,DX
如果指令执行前 (AX)=2300H,(CX)=2300H.(DX)=2400H
则指令执行后 因(CX)=(AX),故(CX)=2400H,ZF=1
如果指令执行前(AX)=2500H,(CX)=2300H,(DX)=2400H
则指令执行后因(CX)!=(AX),故(CX)=2300H,ZF=0

结合汇编代码应该是EAX = oldv
 cmpxchgq %2,%1
%0 = ret %1=*ptr %2=newv 
结合上面说明如果newv = oldv 则newv=*ptr ZF=1
                   如果newv !=oldv 则EAX=*ptr ZF=0
同时将ZF的值返回
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:18:01
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20575/
本文WWW.DOC100.NET DOC100.NET版权所有。