将SWP指令从ARMv4移植到ARMv7

时间:2016-01-28 07:16:36

标签: assembly arm

我正在尝试将以下代码从ARMv4移植到ARMv7,因为不推荐使用SWP / SWPB指令。

    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

它生成一个异常,数据未对齐 - 代码80000002.我猜它可能与价值与地址有关......

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

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

好的,以便代码进行:加载a2指向的数据,并将其存储回相同的位置,然后将a1中的数据取消引用作为指针,从中加载数据“地址”并将其存储回同一个地方,然后取消引用您在第一个实例中加载的任何数据作为指针,从该“地址”加载数据并将其存储回相同的位置。唷!即使伪造的地址确实恰好有效,但这很多都没有实现 - 非常多。

您需要做的就是加载目标数据,存储替换数据,并在独占失败时重试整个过程。由于原始代码具有相同的源和目标寄存器,因此您需要额外的寄存器重排,以避免在存储之前删除替换值。

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