안녕하세요, 타이밍이 매우 중요한 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;