assembly - 是否有同时执行“xadd”和“adc reg,0”的 x86 汇编指令?
问题描述
我最近了解到XADD
,我没有运气在谷歌上查找。这样的指令是否XADD
还添加了进位标志?(例如。XADC
)或者我是否被迫用两个不同的指令来做?
我在 Ubuntu 上,我在 64 位模式下使用 NASM。
解决方案
不 xadd
,并且adc
是两个不同的小众版本的加法,通常不会重叠,所以 x86 没有关于它的指令也就不足为奇了。
xadd
通常与lock
atomic_fetch_add 的内存目标(通常是前缀)一起使用adc
通常用于扩展精度的东西,用于比寄存器宽的整数的高位部分
如果你做了lock xadd
/ lock xadc
(假设的),你就不会做一个双倍宽度的原子 fetch_add,你会在一个更大的数字的两半上做两个单独的原子加法。所以它并不是很有用;如果你想 atomic_fetch_add 一个__int128
,你需要一个lock cmpxchg16b
重试循环,而不是 xadd / "xadc"。
如果您想执行fetch_add(&mem, reg) + CF
or fetch_add(&mem, reg+CF)
,您可以使用adc
和xadd
以某种顺序手动执行此操作。(如果这是一个问题,也许还有一些分支来处理+CF
自身产生进位的情况)。
这是一个足够小众的需求,x86 没有选择在它上面花费一个操作码。只有有限数量的操作码,每一个都需要解码器中的晶体管,并且至少需要微码来实现它。
推荐阅读
- ansible - Ansible:如何处理当前用户没有读取权限的文件(模式`0o600`)?
- angular - 使用ngFor时如何为cdkDropListConnectedTo设置Angular Material cdkDropList #name
- postgresql - 如何将表格的内容直接插入到另一个表格中?
- python - Shapley 值:解释 LSTM 预测时的维度问题
- arrays - MongoDB:如何计算两个对象内部的数组中的元素?
- javascript - 我的带有套接字 io 的烧瓶应用程序不允许使用 405 方法
- c# - 我可以将格式为 Mddyyy 的字符串转换为日期时间对象 c# 核心
- javascript - 在 Chrome 扩展内容脚本中注入 Popper.js
- swift - 何时何地在应用程序中查看订阅的到期日期和取消日期?
- arrays - 如果将输入数组定义为 const,如何对它进行排序?