คำถามติดแท็ก avr-gcc

1
ทำไมคอมไพเลอร์ไม่ใช้ LSR โดยตรง
สวัสดีฉันได้ทำงานในโครงการที่ใช้ 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 > …
10 arduino  avr-gcc 

4
ทำไมคอมไพเลอร์ GCC จึงไม่ใช้รหัสบางอย่าง
ฉันไม่สามารถเข้าใจว่าทำไม GCC คอมไพเลอร์ตัดส่วนของรหัสของฉันในขณะที่มันรักษารหัสเดียวกันในละแวก? รหัส C: #define setb_SYNCO do{(PORTA|= (1<<0));} while(0); ISR(INT0_vect){ unsigned char i; i = 10; while(i>0)i--; // first pause - omitted setb_SYNCO; setb_GATE; i=30; clrb_SYNCO; while(i>0)i--; // second pause - preserved clrb_GATE; } ส่วนที่สอดคล้องกันของ LSS (ไฟล์แอสเซมเบลอร์ที่สร้างโดยคอมไพเลอร์): ISR(INT0_vect){ a4: 1f 92 push r1 a6: 0f 92 push r0 a8: …
9 avr  c  avr-gcc  optimization  gcc 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.