gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:09:42 26 4
gpt4 key购买 nike

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

最佳答案

为了澄清这里稍微令人困惑的答案组合,首先; v7-A1:

标准配置中可以中断多路访问指令的唯一异常(exception)是同步数据中止,因此它们在中断方面是有效的原子(尽管不是在内存访问方面)。

但是,如果支持并启用了低延迟中断配置,则情况并非如此。这里 IRQ、FIQ 和异步中止也可以中断指令。在此引用 v7-A ARM ARM:

ARM deprecates any software reliance on the behavior that an interrupt or asynchronous abort cannot occur in a sequence of memory transactions generated by a single load or store instruction that accesses Normal memory.

Note

A particular case that has shown this reliance is load multiples that load the stack pointer from memory. In an implementation where an interrupt is taken during the LDM, this can corrupt the stack pointer.



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

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

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

[1] ARMv7-A ARM (DDI0406C.b) 的 A3.5.3 和 B1.8.12 节

[2] ARMv7-M ARM (DDI0403D)的B1.5.10节

关于assembly - ARM: "STMDB SP!, {R0-R8}"(又名PUSH {R0-R8})是原子操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23628136/

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