Xin chào Tôi đã làm việc trên một dự án bằng Arduino Uno (vì vậy ATmega328p) trong đó thời gian là khá quan trọng và vì vậy tôi muốn xem hướng dẫn nào trình biên dịch đang chuyển đổi mã của tôi. Và trong đó tôi có một uint8_t
cái mà tôi dịch chuyển một bit sang phải trên mỗi lần lặp bằng cách sử dụng data >>= 1
và có vẻ như trình biên dịch đã dịch điều này thành 5 hướng dẫn ( data
nằm trong r24
):
mov r18, r24
ldi r19, 0x00
asr r19
ror r18
mov r24, r18
Nhưng nếu tôi nhìn vào tài liệu hướng dẫn tập hợp, tôi thấy một hướng dẫn thực hiện chính xác điều này: lsr r24
Tôi có bỏ qua điều gì không hoặc tại sao trình biên dịch cũng không sử dụng? Các thanh ghi r18
và r19
không được sử dụng ở bất cứ nơi nào khác.
Tôi đang sử dụng Ardunio nhưng nếu tôi đúng thì nó chỉ sử dụng avr-gcc
trình biên dịch bình thường . Đây là mã (được cắt xén) tạo ra chuỗi:
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;
}
Theo như tôi có thể thấy Ardunino IDE đang sử dụng trình biên dịch gcc AVR được cung cấp bởi hệ thống là phiên bản 6.2.0-1.fc24. Cả hai đều được cài đặt thông qua trình quản lý gói nên được cập nhật.
avr-objdump
trên tập tin elf. Cái gì dường như không tương ứng?
data >>= 1;