AT&T x86 | `xadd %eax, (%ecx)` 有啥作用?

Posted

技术标签:

【中文标题】AT&T x86 | `xadd %eax, (%ecx)` 有啥作用?【英文标题】:AT&T x86 | What does `xadd %eax, (%ecx)` do?AT&T x86 | `xadd %eax, (%ecx)` 有什么作用? 【发布时间】:2019-01-06 21:46:38 【问题描述】:

它是否交换 %eaxvalue stored at address%ecxx 并将总和存储在 address%ecx 中?

【问题讨论】:

【参考方案1】:

指令XADD ...

...将第一个操作数(目标操作数)与第二个操作数(源操作数)交换,然后将两个值的总和加载到目标操作数中。

所以,根据它的操作,它执行如下微码:

TEMP ← SRC + DEST;
SRC  ← DEST;
DEST ← TEMP;

在你的情况下,这意味着xadd %eax, (%ecx)

创建一个 TEMP 变量,其中包含EAX 的值加上ECX 指向的地址处的值 将ECX指向的地址的值移动到EAXTEMP变量移动到ECX指向的地址

该指令可以与LOCK 前缀组合,因此可以原子地执行。

【讨论】:

以上是关于AT&T x86 | `xadd %eax, (%ecx)` 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

x86 AT&T 寻址模式中基址寄存器的省略

AT&T 语法中的 3 或 4 参数 x86 程序集[重复]

将 ISR 链接到向量中断 80x86 32 位 AT&T 程序集

X86 AT&T常用寄存器及其操作指令

有没有一种简单的方法可以在 AT&T 汇编中像这样将两个寄存器相乘:%eax * %ebx = %ecx

关于 AT&T 语法汇编中的 cmp/jg、jle 等