gpt4 book ai didi

assembly - 锁前缀的范围是什么?

转载 作者:行者123 更新时间:2023-12-01 07:15:12 25 4
gpt4 key购买 nike

据说以“lock”为前缀的汇编指令是原子的。我想知道“锁定”是否只能影响一个汇编指令;汇编指令本身不是原子的吗?

以下是 linux 内核中原子函数的示例:

static __inline__ int atomic_sub_and_test(int i, atomic_t *v)
{ unsigned char c;
__asm__ __volatile__(
LOCK "subl %2,%0; sete %1"
:"=m" (v->counter), "=qm" (c)
:"ir" (i), "m" (v->counter) : "memory");
return c; }

在这个例子中可以中断 subl 和 sete 吗?

最佳答案

锁定前缀影响单个指令。

指令在修改多个 CPU 之间共享的内存时不再具有原子性。涉及读取内存操作数、对其执行某些操作(例如 AND、XOR、INC 等)然后将其写回的修改不被其他 CPU 视为原子操作。锁定前缀“锁定”了内存位置,因此 3 个步骤(读取、修改、写入)看起来是一个步骤,即其他 CPU 只能观察锁定指令之前和之后的内容。

请参阅 Intel 或 AMD 的官方 CPU 文档。

编辑 :在您新添加的示例中,如果我们谈论的是中断,则这些指令都不能被中断。中断发生在整个指令之间。锁定前缀使 sub指令原子。 sete指令不是原子的,它是用来转换 ZF标志为零或非零整数值。

关于assembly - 锁前缀的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11372052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com