专栏首页charlieroro简单了解C语言内嵌汇编

简单了解C语言内嵌汇编

最近看自旋锁的实现,自选锁的循环查找锁的主要实现类似如下,该实现使用到了内嵌的汇编(摘自sanos内核,源代码有2处实现,一处使用intel汇编,是没有问题的,另一处使用内嵌汇编语法,源代码中为cmpxchgl %2, %0,是错误的,应该是cmpxchgl %0, %2)

内嵌汇编有个固定格式,如下:

asm ( assembler template         /* 汇编语句 */
    : output operands                  /* 输出 */
    : input operands                   /* 输入 */
    : list of clobbered registers     
    );

cmpxchgl的描述如下:

Compares the value in the AL, AX, EAX, or RAX register with the first operand (destination operand). If the twovalues are equal, the second operand (source operand) is loaded into the destination operand. Otherwise, thedestination operand is loaded into the AL, AX, EAX or RAX register. RAX register is available only in 64-bit mode. (* Accumulator = AL, AX, EAX, or RAX depending on whether a byte, word, doubleword, or quadword comparison is being performed *) TEMP ← DEST IF accumulator = TEMP THEN ZF ← 1; DEST ← SRC; ELSE ZF ← 0; accumulator ← TEMP; DEST ← TEMP; FI;

  1. cmpxchgl %0, %2为汇编语句,表示对第3个和第1个入参进行操作,即cmpxchgl *dest,exchange;
  2. "=m" (*dest), "=a" (old)为输出部分,将m内存的内容存到*dest中,将a寄存器内容存到old;
  3. "r" (exchange), "m" (*dest), "a" (comperand)); 为输入部分,将exchange放入r寄存器,将*dest放入m,将comperand放入a寄存器;

使用C语言翻译如下:

int atomic_compare_and_exchange(int *dest, int exchange, int comperand) 
{
    int old = comperand;
    if ( comperand== *dest)
    {
        *dest = exchange;
    }
    else
    {
        old  = *dest;
    }
    return old;
}

参考:http://blog.chinaunix.net/uid-23955580-id-2945814.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • go语言的数组和切片区别

    可以得出结论:如官方文档所述,数组是需要指定个数的,而切片则不需要。数组赋值也可是使用如下方式,忽略元素个数,使用“...”代替

    charlieroro
  • kubernetes client-go解析

    Indexer保存了来自apiServer的资源。使用listWatch方式来维护资源的增量变化。通过这种方式可以减小对apiServer的访问,减轻apiSe...

    charlieroro
  • redis 6源码解析之 dict

    edis源码的dict.c主要实现了基于hash表的操作,如增删改查,对哈希表大小的扩容和缩容,以及对哈希表的rehash和增量rehash等。在源码的dict...

    charlieroro
  • Codeforces 626D Jerry's Protest(暴力枚举+概率)

    D. Jerry's Protest time limit per test:2 seconds memory limit per test:256 megab...

    Angel_Kitty
  • hdu------(1525)Euclid's Game(博弈决策树)

    Euclid's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3276...

    Gxjun
  • 关于Spark运行流式计算程序中跑一段时间出现GC overhead limit exceeded

    最近在升级一个框架的时候,发现某个流式计算程序每隔一定的时间就会出现GC overhead limit exceeded的错误问题。 这个问题肯定是内存不够,但...

    sparkexpert
  • 更好地使用 RSS 订阅喜欢的微博博主

    平时我喜欢逛各种各样的网站,但实在是受不了各种纷乱的信息的烦扰,所以最近一直在用RSS阅读器来订阅我经常逛的内容。

    zgq354
  • Oracle 11g RAC 应用补丁简明版

    之前总结过《Oracle 11.2.0.4 RAC安装最新PSU补丁》, 这次整理为简明版,忽略一切输出的显示,引入一些官方的说明,增加OJVM PSU的补丁...

    Alfred Zhao
  • ZOJ 80ers' Memory

    80ers' Memory ---- Time Limit: 1 Second      Memory Limit: 32768 KB ---- I guess...

    ShenduCC
  • 10分钟上手,OpenCV自然场景文本检测(Python代码+实现)

    EAST文本检测器需要OpenCV3.4.2或更高版本,有需要的读者可以先安装OpenCV。

    新智元

扫码关注云+社区

领取腾讯云代金券