【发布时间】:2017-02-14 01:14:59
【问题描述】:
试图理解屏障的以下实现。目标是_entry只能输入一次。我唯一没有得到的部分是%rip的使用。如果mutex(%rip)=0 显然它会旋转,但这是为什么呢?
.section data
mutex:
.long 0
.section text
...
_entry:
xor %rax, %rax
xchgl mutex(%rip), %rax
cmp %rax, 0
jnz _entry
【问题讨论】:
-
它只是对位置无关代码使用 rip-relative 寻址。如果 PIC 不是必需的,那么绝对寻址的工作原理相同。 PS:虽然它坏了,你想将它设置为
1而不是0。更不用说它甚至不会组装,因为您无法将long加载到%rax。 -
@Jester 所以
mutex(%rip)与mutex相同,还是实际上是针对下一条指令的第一个字节? -
是一样的(会访问
mutex),但是汇编器会生成一个相对于机器码中下一条指令的偏移量。 -
我明白了。这很有意义。