我试图反转以下ARM代码。

mystery7
02 46            MOV R2, R0
08 B9            CBNZ R0, loc_100E1D8
00 20            MOVS R0, #0
70 47            BX LR
loc_100E1D8
90 F9 00 30      LDRSB.W R3, [R0]
02 E0            B loc_100E1E4
loc_100E1DE
01 32            ADDS R2, #1
92 F9 00 30      LDRSB.W R3, [R2]
loc_100E1E4
00 2B            CMP R3, #0
FA D1            BNE loc_100E1DE
10 1A            SUBS R0, R2, R0
6F F3 9F 70      BFC.W R0, #0x1E, #2
70 47            BX LR
; End of function mystery7


我可以看到它是一个计算字符串长度的函数。但是,BFC.W指令似乎清除了最高有效的2位。因此,清除了符号位及其右端的位。为什么这样做?

#1 楼

我将其发布为“答案”,因为我的声誉尚未允许我发表评论。

问题是从Bruce Dang等人的“实践逆向工程”一书中复制的。如“ mystery7”,请参见书中的图2.13。作者本人未对奇怪的BFC.W陈述发表评论。此声明已在此处的另一个博客中评论,因为“我不明白将差的两个最高有效位设置为零的目的。对于任何合理的字符串,都不应该首先将这些位设置为零。”

也许该声明有一定目的。如果是,那可能就不太明显了。