---
title: atomic_sub指令
description: "对整数变量进行原子减。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0034.html
sourcePath: /source/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0034.html
indexId: be9f7f9cbda72fcf024ebb7b4a6445d7f2e050e928cbda4d9258244f6e4d6e6065
---
# atomic_sub指令

#### 函数功能

对整数变量进行原子减。


#### 处理步骤

x86上代码段：

```
static inline void atomic_sub(int i, atomic_t *v)
{
asm volatile(LOCK_PREFIX "subl %1,%0" : "+m" (v->counter) : "ir" (i));
}
```

在鲲鹏上替换：

- 第一种方法：使用GCC自带原子操作替换

```
static inline void atomic_sub(atomic_t *v)
{
__sync_sub_and_fetch(&((*v).counter), 1);
}
```


- 第二种方法：使用内联汇编替换

```
static inline void atomic_sub(atomic_t *v)
{
unsigned int tmp;
int result, i;
i = 1;
__asm__ volatile(" prfm pstl1strm, %2\n"
"1: ldaxr %w0, %2\n"    //加载数据到寄存器
" sub %w0, %w0, %w3\n"  //减操作
" stlxr %w1, %w0, %2\n" //减后的数据写入内存并判断是否写入成功
" cbnz %w1, 1b"         //若写入内存失败，重新执行减操作
: "=&r"(result), "=&r"(tmp), "+Q"(v->counter)
: "Ir"(i));
}
```
