Assembly 在臂上使用SWP时锁的用途

Assembly 在臂上使用SWP时锁的用途,assembly,arm,Assembly,Arm,下表包含锁的臂部件代码 try: MOV R3,#1 SWP R2,R3,[R1,#0] CMP R2,#1 BEQ try LDR R4,[R2,#0] ADD R3,R4,#1 STR R3,[R2,#0] SWP R2,R3,[R1,#0] 我的问题是,当R2等于1时,分支返回尝试的目的是什么?据我所知,如果执行这个分支,那么SWP操作有问题,但我不知道细节。如果没有更高级别的上下文,就很难推断出确切的细节,但这看起来可能是某种票据锁/信号量/原子增量。似乎r1持有指向原子数据类型变量的

下表包含锁的臂部件代码

try: MOV R3,#1
SWP R2,R3,[R1,#0]
CMP R2,#1
BEQ try
LDR R4,[R2,#0]
ADD R3,R4,#1
STR R3,[R2,#0]
SWP R2,R3,[R1,#0]

我的问题是,当R2等于1时,分支返回尝试的目的是什么?据我所知,如果执行这个分支,那么SWP操作有问题,但我不知道细节。

如果没有更高级别的上下文,就很难推断出确切的细节,但这看起来可能是某种票据锁/信号量/原子增量。似乎
r1
持有指向原子数据类型变量的指针地址,该变量本身充当互斥体:

try: MOV R3,#1
SWP R2,R3,[R1,#0]
此时,我们已将值1自动存储到
r1
指向的位置,并将其中的值检索到
r2
。现在有两种可能:要么它已经包含1,在这种情况下,
swp
实际上没有改变任何东西,要么它包含不同的值

CMP R2,#1
BEQ try
如果之前的互斥量值为1,则表示当前已使用锁:设想此代码的第二个副本并行运行,但稍晚一点-第一个家伙将在1中交换,因此第二个家伙将看到它并重试,在
r1
位置旋转,直到它再次包含除1以外的内容。如果它不是1,那么互斥锁是无人认领的,但是由于
swp
,现在那里的值是1,所以我们持有互斥锁并可以继续

LDR R4,[R2,#0]
ADD R3,R4,#1
STR R3,[R2,#0]
这意味着现在在
r2
中的“无人认领”互斥量值实际上也是一个指向感兴趣数据的指针:我们增加了它,因为知道这里的读-修改-写实际上是原子互斥量

SWP R2,R3,[R1,#0]
…在这里我不知道*。将递增的数据交换回互斥体本身似乎没有多大意义——如果不是1,那么它似乎会释放互斥体,但如果我们(或系统中的其他代理)现在再次运行此代码,“some value+1”似乎不太可能成为有效的4字节对齐指针。我只能想象这个片段是更复杂事物中不完整的一部分

*如果像我目前想象的那样简单地释放互斥锁,我希望
r2
被写回,而不是
r3