代码之家  ›  专栏  ›  技术社区  ›  itsadok

为什么这个代码是由avr gcc生成的,它是如何工作的?

  •  5
  • itsadok  · 技术社区  · 15 年前

    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,而不是仅仅从R25中减去0xFF INC R25 ?

    2 回复  |  直到 8 年前
        1
  •  5
  •   starblue    15 年前

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

        2
  •  5
  •   Greg Hewgill    8 年前

    tl;博士 编译器的设计目的是使用更便携、更高效的&这里的通解。

    这个 SUBI C (进行)及 H (半进位)用于后续指令的CPU标志(没有 ADDI 在8位AVR BTW中,因此要添加立即值 x 我们减去 -x INC 没有。既然都 苏比 & 集成数字控制 苏比 BRCC / BRCS ),如果您有一个16位或32位大小的计数器,它允许您以一种非常简单的方式递增它,只需 集成数字控制 0x00FF 会增加到 0x0000 0xFF 之前 苏比 你只是 SUBI -1 ADC 0

    进一步阅读:

    https://lists.gnu.org/archive/html/avr-gcc-list/2008-11/msg00029.html

    http://avr-gcc-list.nongnu.narkive.com/SMMzdBkW/foo-subi-vs-inc