1
为什么编译器不直接使用LSR
嗨,我一直在使用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 …