嗨,我一直在使用 Arduino Uno(所以 ATmega328p)进行一个项目,其中时间非常重要,所以我想看看编译器将我的代码转换成哪些指令。在那里我有一个uint8_t
我在每次迭代时向右移动一位data >>= 1
,编译器似乎将它翻译成5条指令(data
在r24
):
mov r18, r24
ldi r19, 0x00
asr r19
ror r18
mov r24, r18
但是,如果我查看指令集文档,我会看到一条指令正是这样做的:lsr r24
我是否忽略了某些东西,或者为什么编译器也没有使用它?寄存器r18
并r19
没有在其他任何地方使用。
我使用的是 Ardunio,但如果我是正确的,它只使用普通的avr-gcc
编译器。这是生成序列的代码(修剪):
ISR(PCINT0_vect) {
uint8_t data = 0;
for (uint8_t i = 8; i > 0; --i) {
// asm volatile ("lsr %0": "+w" (data));
data >>= 1;
if (PINB & (1 << PB0))
data |= 0x80;
}
host_data = data;
}
据我所见,Ardunino IDE 使用的是系统提供的 AVR gcc 编译器,版本为 6.2.0-1.fc24。两者都是通过包管理器安装的,所以应该是最新的。