为什么 PowerPC 编译器在调用函数之前发出 clclr 指令?

逆向工程 拆卸 电源
2021-06-30 01:05:33

我将自己在 C 中编写的代码反汇编为 PowerPC 程序集,但我无法理解为什么crclr在调用printf函数之前会发生这种情况。

C代码

int main()
{
     int a, b, c;
     a = 10;
     b = 2;
     c = a * b;
     printf("%d", c);
     return 0;
}

PowerPC 汇编代码

stwu r1, -0x10(r1)
mflr r0
stw r0, 0x14(r1)
lis r3, unk_38@h
addi r3, r3, unk_38@l
li r4, 0x14
crclr 4*cr1+eq
bl printf
li r3, 0
lwz r0, 0x14(r1)
mtlr r0
addi r1, r1, 0x10
blr

unk_38:
   .byte 0x25 # %
   .byte 0x64 # d

谁能告诉我为什么?

提前致谢 :)

1个回答

这可能是编译器优化的产物。请注意li r4,0x14指令 - 编译器优化您的2*10计算并将结果直接加载20到 中r4但是,进行计算会修改一些状态位,而li不会,因此编译器尝试使用 进行相同的修改crclr,并且优化器不够聪明,无法意识到当它位于函数之前时这并不是真正必要的称呼。