我正在尝试将以下代码从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
任何帮助都将受到高度赞赏。
答案 0 :(得分:2)
好的,以便代码进行:加载a2
指向的数据,并将其存储回相同的位置,然后将a1
中的数据取消引用作为指针,从中加载数据“地址”并将其存储回同一个地方,然后取消引用您在第一个实例中加载的任何数据作为指针,从该“地址”加载数据并将其存储回相同的位置。唷!即使伪造的地址确实恰好有效,但这很多都没有实现 - 非常多。
您需要做的就是加载目标数据,存储替换数据,并在独占失败时重试整个过程。由于原始代码具有相同的源和目标寄存器,因此您需要额外的寄存器重排,以避免在存储之前删除替换值。
swapstore
ldrex a3, [a2]
strex a4, a1, [a2]
cmp a4, #0
bne swapstore
mov a1, a3