สวัสดีฉันได้ทำงานในโครงการที่ใช้ 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 ทั้งสองแบบได้รับการติดตั้งผ่านตัวจัดการบรรจุภัณฑ์ดังนั้นควรทันสมัย
avr-objdump
ไฟล์ elf ... มันดูเหมือนว่าจะไม่สอดคล้องกันคืออะไร?
data >>= 1;