LDREX{cond
} Rt
, [Rn
{, #offset
}]
STREX{cond
} Rd
, Rt
, [Rn
{, #offset
}]
LDREXB{cond
} Rt
, [Rn
] 字节加载
STREXB{cond
} Rd
, Rt
, [Rn
] 字节存储
LDREXH{cond
} Rt
, [Rn
] 半字加载
STREXH{cond
} Rd
, Rt
, [Rn
] 半字存储
LDREXD{cond
} Rt
, Rt2
, [Rn
] 双字加载
STREXD{cond
} Rd
, Rt
, Rt2
, [Rn
] 双字存储
其中:
-
cond
-
-
Rd
-
-
Rt
-
-
Rt2
-
-
Rn
-
-
offset
-
为应用于 Rn
中的值的可选偏移量。offset
只可用于 Thumb-2 指令中。 如果省略 offset
,则认为偏移量为 0。
利用 LDREX
和 STREX
可在多个处理器和共享内存系统之前实现进程间通信。
出于性能方面的考虑,请将相应 LDREX
指令和 STREX
指令间的指令数控制到最少。
Note
STREX
指令中所用的地址必须要与近期执行次数最多的 LDREX
指令所用的地址相同。如果使用不同的地址,则STREX
指令的执行结果将不可预知。
ARM LDREX
和 STREX
可用于 ARMv6 及更高版本中。
ARM LDREXB
、LDREXH
、LDREXD
、STREXB
、STREXD
和STREXH
可用于 ARMv6K 及更高版本中。
所有这些 32 位 Thumb 指令均可用于 ARMv6T2 及更高版本,但 LDREXD
和 STREXD
在 ARMv7-M 架构中不可用。
这些指令均无 16 位版本。
MOV r1, #0x1 ; load the ‘lock taken’ value
try
LDREX r0, [LockAddr] ; load the lock value
CMP r0, #0 ; is the lock free?
STREXEQ r0, r1, [LockAddr] ; try and claim the lock
CMPEQ r0, #0 ; did this succeed?
BNE try ; no – try again
.... ; yes – we have the lock