我正在尝试检查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。
这将是the AVR ABI used by GCC的问题。特别是:
R1
总是包含零。在insn期间,内容可能会被破坏,例如通过使用R0 / R1作为隐式的MUL指令输出寄存器。如果insn破坏了R1,则insn必须将R1恢复为之后为零。 [...]
这就是您在程序集中看到的。 R1被MUL
覆盖,因此之后必须将其清除为零。