为什么AVR编译器在乘法后附加“ clr r1”行?

问题描述 投票:1回答:1

我正在尝试检查AVR编译器如何进行乘法编译?

输入C代码:

unsigned char square(unsigned char num) {
    return num * num;
}

输出汇编代码:

square(unsigned char):
        mul r24,r24
        mov r24,r0
        clr r1
        ret

我的问题是为什么要添加语句clr r1?看来,假设参数已存储在r24中,并且返回值在r24处可用,则可以删除该语句并仍然可以按需得到。

直接Godbolt链接:https://godbolt.org/z/PsPS_N

更新:

我也看到相关的更一般的讨论here

c embedded avr avr-gcc
1个回答
2
投票

这将是the AVR ABI used by GCC的问题。特别是:

R1

总是包含零。在insn期间,内容可能会被破坏,例如通过使用R0 / R1作为隐式的MUL指令输出寄存器。如果insn破坏了R1,则insn必须将R1恢复为之后为零。 [...]

这就是您在程序集中看到的。 R1被MUL覆盖,因此之后必须将其清除为零。

© www.soinside.com 2019 - 2024. All rights reserved.