加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

简单了解C语言内嵌汇编

发布时间:2020-12-16 09:07:31 所属栏目:百科 来源:网络整理
导读:最近看自旋锁的实现,自选锁的循环查找锁的主要实现类似如下,该实现使用到了内嵌的汇编(摘自sanos内核,源代码有2处实现,一处使用intel汇编,是没有问题的,另一处使用内嵌汇编语法,源代码中为cmpxchgl %2,%0,是错误的,应该是cmpxchgl %0,%2) 内嵌汇

最近看自旋锁的实现,自选锁的循环查找锁的主要实现类似如下,该实现使用到了内嵌的汇编(摘自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,EAX or RAX register. RAX register is available only in 64-bit mode.
?
(* Accumulator = AL,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,1)">int comperand) 
{
    int old = comperand;
    if ( comperand== *dest)
    {
        *dest = exchange;
    }
    else
    {
        old  = *dest;
    }
    return old;
}
?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读