为什么先用 MOV R0、R3 再用 MOV R3、R0(如此来回)

逆向工程 拆卸 手臂
2021-06-17 07:09:15

我有一个我试图理解的静态库档案。

首先,我使用“ar”来提取目标文件。
目标文件是“ELF 32 位 LSB 可重定位、ARM、EABI5 版本 1 (SYSV),未剥离”
然后我使用 'objdump -D' 来获取汇编指令。

现在我正在观察程序集列表并找到一些奇怪的(对我来说)说明。
显然,在一个带有链接(bl)的分支之后,R0 被移动到 R3,下一条指令将 R3 移动到 R0。

23c:    e1a00003        mov     r0, r3
240:    ebfffffe        bl      0 <atoi>
244:    e1a03000        mov     r3, r0
248:    e1a00003        mov     r0, r3

这在存档内的不同目标文件中多次发生。

最后,当从分支返回时,R0 和 R3 都被设置为 R0 的值。
这种行为有什么好的解释?

1个回答

这很可能是未经优化编译的代码 ( -O0)。在此类代码中,冗余操作非常常见,因为编译器忠实地将单个语句转换为机器代码,但不会尝试执行优化以移除或简化冗余语句。