ARM:“STMDB SP!,{R0-R8}”(又名PUSH {R0-R8})是原子操作吗?

时间:2014-05-13 09:58:10

标签: assembly stack arm atomic

我想知道STMDB SP!,{R0-R8}是否是ARM(v7)中的原子操作,因为它对我来说看起来很复杂。那么例如可能的是,CPU在“中间”某处被中断并且已经将R5-R8存储在堆栈上并且SP现在是SP_old-16并且在处理中断之后处理器继续使用R0-R4?感谢。

4 个答案:

答案 0 :(得分:4)

就中断处理而言,它是原子的。

如果我没记错的话,在中断处理完成后,中断指令会导致它被中止并重新执行,以保证中断延迟。

答案 1 :(得分:4)

为了澄清这里稍微有点混乱的答案,首先是; V7-A 1

在标准配置中,唯一可以中断多重访问指令的异常是同步数据中止,因此它们在中断方面实际上是原子的(尽管 in内存访问条款)。

如果支持低延迟中断配置并且已启用,则为true。这里IRQ,FIQ和异步中止也可以中断指令。在此基础上引用v7-A ARM ARM:

  

ARM不赞成任何软件依赖于在访问正常内存的单个加载或存储指令生成的一系列内存事务中不会发生中断或异步中止的行为。

     

注意

     

显示出这种依赖性的特殊情况是从内存加载堆栈指针的加载倍数。在LDM期间执行中断的实现中,这可能会破坏堆栈指针。

以这种方式中断的指令将被放弃,如果返回,则从头开始重新执行(因此对于存储,较低的地址可能会看到两次写入)。

其次是v7-M 2 ,其古怪的异常模型:

这里每天都有低延迟。在多个访问指令期间总是可以采用例外,但是该架构允许(在某些条件下)根据问题中的建议从中断点继续执行。允许放弃和重启行为作为替代,并且是不可持续指令/异常组合的唯一选择。

[1] ARMv7-A ARM (DDI0406C.b)

的A3.5.3和B1.8.12节

[2] ARMv7-M ARM (DDI0403D)

的B1.5.10节

答案 2 :(得分:2)

如果已配置,则可以中断然后重新启动(不继续)。如果内存不可访问,也可以中止。

与其他设备相比,它不是原子的。

答案 3 :(得分:1)

STM是一条指令,因此它与其他指令一样具有原子性。告诉cpu从SP-4指向的内存开始保存N个寄存器,然后在单个指令中将SP更新为SP-N * 4。因此,它有责任在不同的模式切换(即中断)之间保持一致的状态。