这是我正在处理的C项目中的反汇编AVR代码的片段。我注意到这个奇怪的代码正在生成,我不明白它是如何工作的。我假设这是某种荒谬的优化...

有什么解释?

92:         ticks++;         // unsigned char ticks;
+0000009F:   91900104    LDS       R25,0x0104     Load direct from data space
+000000A1:   5F9F        SUBI      R25,0xFF       Subtract immediate
+000000A2:   93900104    STS       0x0104,R25     Store direct to data space
95:         if (ticks == 0) {
+000000A4:   2399        TST       R25            Test for Zero or Minus
+000000A5:   F009        BREQ      PC+0x02        Branch if equal
+000000A6:   C067        RJMP      PC+0x0068      Relative jump

具体来说,为什么第二条指令从R25中减去0xFF而不是INC R25

最佳答案

SUBI指令可用于将8位常量与8位值相加/相减。它具有与INC相同的成本,即指令大小和执行时间。因此,SUBI被编译器首选,因为它更通用。没有相应的ADDI指令,可能是因为它是多余的。

10-06 01:46