こんにちは、タイミングが非常に重要なArduino Uno(ATmega328p)を使用するプロジェクトに取り組んでいるため、コンパイラーがコードを変換する命令を確認したいと思いました。そしてそこに私はuint8_t
使用する各反復で右に1ビットシフトするものを持っています、そして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はバージョン6.2.0-1.fc24のシステムによって提供されるAVR gccコンパイラを使用しています。どちらもパッケージマネージャーを介してインストールされるため、最新の状態である必要があります。
avr-objdump
から、elfファイルで使用しました…対応していないように見えるのは何ですか?
data >>= 1;