안녕하세요, 타이밍이 매우 중요한 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엘프 파일에 사용 했습니다 ... 해당하지 않는 것은 무엇입니까?
data >>= 1;