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陈述发表评论。此声明已在此处的另一个博客中评论,因为“我不明白将差的两个最高有效位设置为零的目的。对于任何合理的字符串,都不应该首先将这些位设置为零。”
也许该声明有一定目的。如果是,那可能就不太明显了。