Assembly 将SWP指令从ARMv4移植到ARMv7

Assembly 将SWP指令从ARMv4移植到ARMv7,assembly,arm,Assembly,Arm,由于SWP/SWPB指令已被弃用,我正在尝试将以下代码段从ARMv4移植到ARMv7 swp a1, a1, [a2] 我自己也尝试过并产生了以下代码,尽管我必须承认我不熟悉汇编程序 swapstore1 ldrex a3, [a2] strex a4, a3, [a2] cmp a4, #0 bne swapstore1 swapstore2 ldrex a2, [a1] strex a4, a2,

由于SWP/SWPB指令已被弃用,我正在尝试将以下代码段从ARMv4移植到ARMv7

    swp  a1, a1, [a2]
我自己也尝试过并产生了以下代码,尽管我必须承认我不熟悉汇编程序

swapstore1
    ldrex   a3, [a2]
    strex   a4, a3, [a2]
    cmp     a4, #0
    bne     swapstore1

swapstore2
    ldrex   a2, [a1]
    strex   a4, a2, [a1]
    cmp     a4, #0
    bne     swapstore2

swapstore3
    ldrex   a1, [a3]
    strex   a4, a1, [a3]
    cmp     a4, #0
    bne     swapstore3
它生成一个异常,数据未对齐-代码8000002。我猜这可能与价值和地址有关

我使用的是Microsoft(R)ARM宏汇编程序版本15.01.50304


非常感谢您的帮助。

好的,代码如下:加载
a2
指向的数据,并将其存储回同一位置,然后将
a1
中的数据作为指针取消引用,从该“地址”加载数据并将其存储回同一位置,然后取消引用您在第一个实例中作为指针加载的任何数据,从该“地址”加载数据并将其存储回同一位置。呸!即使伪造的地址碰巧是有效的,那也是一个很大的不足

您只需加载目标数据,存储替换数据,然后在独占失败时重试整个过程。由于原始代码具有相同的源寄存器和目标寄存器,因此需要额外的寄存器洗牌位,以避免在存储替换值之前将其破坏

swapstore
    ldrex   a3, [a2]
    strex   a4, a1, [a2]
    cmp     a4, #0
    bne     swapstore
    mov     a1, a3

swp的速度有多慢?如果它仍然有效,它可能仍然比用循环替换它要好。如果您想要获得性能,您可能必须修改周围的代码,以便通过高效地使用不同的原语(如
ldrex
/
strex
)来完成它需要完成的任务。需要一个循环来实现同步原语。如果您的最终代码有嵌套循环来实现原子比较交换,那么您就错了。Peter有一个很好的观点-我的答案是字面意义上的“使用独占而不是
swp
”情况-如果
swp
实际上只是比直接原子交换操作更复杂的操作的一部分,那么你真的想在排他性方面重写整个操作。ldrex/strex不是swp的直接替代品。不过,循环是使用ldrex/strex的正确方法。您可能会发现swp没有被禁用,或者可以为您正在使用的核心启用。这是事实,但是
ldrex/strex
有几个警告。通常,ARM使用缓存来实现数据的临时存储
strex
就像刷新缓存以提交数据(并让其他内核知道它)。操作系统在刷新缓存时应执行
clrex
,并且[a2]内存必须是正常的可缓存内存。通常,明智的做法是在手之前添加
pld/pldw
指令,以确保数据在缓存中。比如说,谢谢你的“不喜欢”,我要跨过下一个障碍。实际上,我正在尝试将phoneME移植到WindowsCE7。