1 inline jint     Atomic::cmpxchg    (jint     exchange_value, volatile jint*     dest, jint     compare_value) {
2 int mp = os::is_MP();
3 __asm__ volatile (LOCK_IF_MP(%4) "cmpxchgl %1,(%3)"
4 : "=a" (exchange_value)
5 : "r" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
6 : "cc", "memory");
7 return exchange_value;
8 }
9
10 // Adding a lock prefix to an instruction on MP machine
11 // 在多处理的指令前添加lock前缀
12 #define LOCK_IF_MP(mp) "cmp $0, " #mp "; je 1f; lock; 1: "

12行代码的意思应该是:

 cmp $0 $1;
je 1f;//等于则跳转
lock;// 内存屏障

"1:"是什么意思还看不出来

inline 关键字主要功能是为了 代替掉 宏代码片段。
jint 猜测是指代java int
cmpxchg compare and change

内嵌汇编:高级语言与汇编混合的代码

cmpxchgl %1,(%3)  是汇编指令模板, %1 %3是指令的操作数,称为占位符
指令模板后面用小括号括起来的是C语言表达式
操作数至多有10 个
在每个操作数前面有一个用引号括起来的字符串,字符串的内容是对该操作数的限制或者说要求。
"="表示"exchange_value"是输出操作数
"=a" (exchange_value),表示把eax寄存器中存的值写入exchange_value变量中。
"r" 表示需要将"exchange_value"与某个通用寄存器相关联,先将操作数的值读入寄存器,然后在指令中使用相应寄存器,而不是"resexchange_valueult"本身,当然指令执行 完后需要将寄存器中的值存入变量"exchange_value",从表面上看好像是指令直接对"exchange_value"进行操作,实际上GCC做了隐式处理,这样我们可以少写一 些指令。
"m"表示操作数放在内存,两个操作数不能同时使用"m"作为限定字符,指令movl允许寄存器到寄存器,立即数到寄存器等,但是不允许内存到内存的操作

立即数:通常把在立即寻址方式指令中给出的数称为立即数

内嵌汇编语法如下:
       __asm__(汇编语句模板: 输出部分: 输入部分: 破坏描述部分)
共四个部分:汇编语句模板,输出部分,输入部分,破坏描述部分,各部分使用":"格开,汇编语句模板必不可少,其他三部分可选,
    如果使用了后面的部分,而前面部分为空,也需要用":"格开,相应部分内容为空。例如:
             __asm__ __volatile__("cli": : :"memory")

部分参考自https://www.cnblogs.com/joey-hua/p/5279875.html

最新文章

  1. HTML5系列:HTML5绘图
  2. 通什翡翠商城大站协议邮件群发系统日发20-30万封不打码不换ip不需发件箱100%进收件箱
  3. DateTime , DateTime2 ,DateTimeOffset 之间的小区别
  4. 关于Windows下mysql忘记root密码的解决方法
  5. 上struts2的xml在<result type="redirect">参数问题
  6. PHPBB 学习
  7. jmeter http get 登录
  8. Xcode换版本或者改名字后无法使用simpholders2
  9. 新浪微博开放平台OAuth授权解决方案(含代码)
  10. RMAN学习笔记
  11. P2P直播承载平台与CDN直播承载平台比较
  12. webpack2归纳总结
  13. [bzoj1999]树网的核
  14. Android开发(十八)——头部、中部、底部布局技巧
  15. python3练习-装饰器
  16. 微软和Sun针对Java的世纪之战
  17. Android开发——JobScheduler机制
  18. ruby 数组操作
  19. XSS第四节,XSS攻击实例(一)
  20. Mybatis返回map集合

热门文章

  1. 阿里P8大佬熬夜10天,把所有Android第三方库整理成了PDF
  2. Python Tkinter小实例——模拟掷骰子
  3. leetcode138container-with-water
  4. Python列表排序方法汇总,超详细!
  5. C++ 中表达式求值
  6. nginx&http 第六章 http 协议学习 1
  7. 处理Ceph osd的journal的uuid问题
  8. 02Java写一个hello world
  9. RTP协议解析及H264/H265 音视频RTP打包分析
  10. Golang 实现 Redis(6): 实现 pipeline 模式的 redis 客户端