• CAS学习过程中的一些记录


     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

  • 相关阅读:
    shell脚本模拟交互操作实现上传文件至sftp
    从文件A中去除掉文件B的内容
    Linux批量kill某个程序的进程
    单数据盘或者很多数据盘mount挂载到某个目录
    用户HTTP请求过程简单剖析
    linux服务器系统盘坏且系统盘为软raid的修复方法
    linux系统运行状态检查
    TCP的三次握手和四次挥手
    ES6嵌套对象的解构
    DRF框架在嵌套关系下实现嵌套对象字段的过滤
  • 原文地址:https://www.cnblogs.com/woooodlin/p/13130400.html
Copyright © 2020-2023  润新知