首页 > 解决方案 > 是否有同时执行“xadd”和“adc reg,0”的 x86 汇编指令?

问题描述

我最近了解到XADD,我没有运气在谷歌上查找。这样的指令是否XADD还添加了进位标志?(例如。XADC)或者我是否被迫用两个不同的指令来做?

我在 Ubuntu 上,我在 64 位模式下使用 NASM。

标签: assemblyx86-64instruction-setcarryflag

解决方案


xadd,并且adc是两个不同的小众版本的加法,通常不会重叠,所以 x86 没有关于它的指令也就不足为奇了。

  • xadd通常与lockatomic_fetch_add 的内存目标(通常是前缀)一起使用
  • adc通常用于扩展精度的东西,用于比寄存器宽的整数的高位部分

如果你做了lock xadd/ lock xadc(假设的),你就不会做一个双倍宽度的原子 fetch_add,你会在一个更大的数字的两半上做两个单独的原子加法。所以它并不是很有用;如果你想 atomic_fetch_add 一个__int128,你需要一个lock cmpxchg16b重试循环,而不是 xadd / "xadc"。

如果您想执行fetch_add(&mem, reg) + CFor fetch_add(&mem, reg+CF),您可以使用adcxadd以某种顺序手动执行此操作。(如果这是一个问题,也许还有一些分支来处理+CF自身产生进位的情况)。

这是一个足够小众的需求,x86 没有选择在它上面花费一个操作码。只有有限数量的操作码,每一个都需要解码器中的晶体管,并且至少需要微码来实现它。


推荐阅读