Чередовать дизассемблирование + исходник с avr-objdump
У меня есть программа на C для attiny85, которую я хочу разобрать и отобразить с чередующимся исходным кодом.
Вот моя программа: test.c
#include <avr/io.h>
int main() {
for(int i=0; i<100; i++) {
PORTB=i;
}
}
Вот как я это компилирую: avr-gcc -g -O0 -mmcu=attiny85 -o test.elf test.c
Наконец, я генерирую дизассемблированный код с чередующимся исходным кодом с помощью команды: avr-objdump -S -D test.elf
Дизассемблирование текстового раздела показывает следующее дизассемблирование без чередования исходного кода:
00000030 <main>:
30: cf 93 push r28
32: df 93 push r29
34: 00 d0 rcall .+0 ; 0x36 <main+0x6>
36: cd b7 in r28, 0x3d ; 61
38: de b7 in r29, 0x3e ; 62
3a: 1a 82 std Y+2, r1 ; 0x02
3c: 19 82 std Y+1, r1 ; 0x01
3e: 0a c0 rjmp .+20 ; 0x54 <__SREG__+0x15>
40: 88 e3 ldi r24, 0x38 ; 56
42: 90 e0 ldi r25, 0x00 ; 0
44: 29 81 ldd r18, Y+1 ; 0x01
46: fc 01 movw r30, r24
48: 20 83 st Z, r18
4a: 89 81 ldd r24, Y+1 ; 0x01
4c: 9a 81 ldd r25, Y+2 ; 0x02
4e: 01 96 adiw r24, 0x01 ; 1
50: 9a 83 std Y+2, r25 ; 0x02
52: 89 83 std Y+1, r24 ; 0x01
54: 89 81 ldd r24, Y+1 ; 0x01
56: 9a 81 ldd r25, Y+2 ; 0x02
58: 84 36 cpi r24, 0x64 ; 100
5a: 91 05 cpc r25, r1
5c: 8c f3 brlt .-30 ; 0x40 <__SREG__+0x1>
5e: 80 e0 ldi r24, 0x00 ; 0
60: 90 e0 ldi r25, 0x00 ; 0
62: 0f 90 pop r0
64: 0f 90 pop r0
66: df 91 pop r29
68: cf 91 pop r28
6a: 08 95 ret
Дизассемблирование имеет определенный смысл, но мне не хватает чередующегося исходного кода.
Интересно, что выходные данные также включают в себя фрагмент, где я также нахожу основной сегмент в разобранном виде:
#include <avr/io.h>
int main() {
30: 20 00 .word 0x0020 ; ????
32: 00 00 nop
34: 80 00 .word 0x0080 ; ????
36: 00 00 nop
38: 00 00 nop
for(int i=0; i<100; i++) {
3a: 00 00 nop
3c: 40 00 .word 0x0040 ; ????
3e: 00 00 nop
PORTB=i;
40: 80 00 .word 0x0080 ; ????
42: 00 00 nop
44: 00 00 nop
46: 00 00 nop
48: 5a 00 .word 0x005a ; ????
for(int i=0; i<100; i++) {
4a: 00 00 nop
4c: 80 00 .word 0x0080 ; ????
4e: 00 00 nop
50: 00 00 nop
52: 00 00 nop
54: 91 00 .word 0x0091 ; ????
56: 00 00 nop
58: 80 00 .word 0x0080 ; ????
5a: 00 00 nop
5c: 00 00 nop
5e: 00 00 nop
60: b7 00 .word 0x00b7 ; ????
}
}
Теперь вывод включает исходный код, но дизассемблирование выполнено неправильно.
Как мне получить правильный вывод: дизассемблированные инструкции и чередующийся исходный код?
(avr-gcc (GCC) 9.3.0. Сборка чередования и исходный код для avr-objdump, похоже, не имеет проблемы, хотя он использует те же флаги компилятора...)
@Dreamcooled, 👍1
1 ответ
Лучший ответ:
Раздел .stabs содержит отладочную информацию, а не сам код. Здесь нет
смысл в попытке "разобрать" его. Опция -D
avr-objdump
означает «разобрать все, верите ли вы, что это машина или нет».
код". Не то, что вы хотите. Для ваших целей -S
должно быть достаточно.
Я не знаю, почему ваш main()
отображается без исходного кода. я
попробовал ту же самую программу с точно такими же командами, и я вижу
источник чередуется со сборкой. Я использую avr-gcc 5.4.0 и
avr-objdump 2.26.20160125, поставляемый в Ubuntu Eoan.
- avr/io.h ошибка "No such file or directory" при компиляции с использованием avr-gcc
- Как включить библиотеки Arduino с помощью AVR-gcc без IDE?
- AVRdude неправильно считывает значения байтов предохранителя
- программирование ардуино на чистом с
- AVR-GCC не может вызвать функцию, расположенную по фиксированному адресу
- Как создать и загрузить программу на C++ без библиотеки Arduino или IDE?
- avr-gcc -D игнорируется
- Ошибка компиляции кода для Arduino/Genuino Uno
Спасибо. Действительно, если я понизил компилятор до 5.4.0, он тоже работает. Я постараюсь определить версию, которая вызвала проблему, и сообщу об ошибке, как только смогу воспроизвести ее в чистой среде., @Dreamcooled