嗨,我一直在使用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。两者都通过软件包管理器安装,因此应该是最新的。
1
程序集似乎不对应于C代码。
—
尤金(Eugene Sh)。
好吧,我使用Ardunio IDE对其进行了编译,然后
—
xZise
avr-objdump
在elf文件中使用了……似乎与之不符的是什么?
@Eugene Sh .:它确实对应于C代码。它仅对应于直线
—
Curd
data >>= 1;
这是“用班次代替分工”是错误建议的情况之一。如果执行/ = 2,则编译器将生成lsr r24; (提示:请尝试使用gcc资源管理器来尝试生成asm代码)
—
PlasmaHH
什么编译器?什么处理器?显然,这是使问题有意义的必要信息。
—
Olin Lathrop'2