Как мне создать точный файл листинга, используя avr-gcc? - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь создать интерфейс для симулятора AVR.Вход в интерфейс - сборка avr, которая компилируется интерфейсом.Во время этой компиляции я хотел бы сгенерировать файл, который содержит 4 элемента для каждой инструкции сборки: номер строки в исходном файле сборки, расположение инструкции сборки в памяти, код операции для собранной инструкции сборки и исходная сборкаинструкция.

До сих пор я успешно использовал базовую тестовую программу, но как только я начал тестирование с помощью программы, содержащей ветви, я заметил, что и файл листинга, и объектный файл, который я генерировал, не были точными: ветвине разветвлялись на ярлыки, а вместо этого на pc + 1. С этот вопрос Я считаю, что это проблема компоновщика.

Данный файл test.s:

.global main
main:
    ldi r16, 10
    ldi r17, 0
loop: 
    add r17, r16
    dec r16
    cpi r16, 0
    brne loop
    cpi r17, 50
    brge grtr
    ldi r18, 1
    rjmp done
grtr:
    ldi r18, 2
done:
    mov r0, r18

Исходная команда, которую я использовал для сборки, была:

avr-gcc -Wa,-alhns -Wa,-L -mmcu=atmega2560 test.s -c -o test.o > test.lst

Соответствующий шестнадцатеричный файл, который я генерируюиспользование avr-objcopy

:100000000AE010E0100F0A950030>01F4123304F4F6
:0800100021E000C022E0022EF5
:00000001FF

и файла листинга:

   1                .global main
   2                main:
   3 0000 0AE0              ldi r16, 10
   4 0002 10E0              ldi r17, 0
   5                loop: 
   6 0004 100F              add r17, r16
   7 0006 0A95              dec r16
   8 0008 0030              cpi r16, 0
   9 000a 01F4              brne loop
  10 000c 1233              cpi r17, 50
  11 000e 04F4              brge grtr
  12 0010 21E0              ldi r18, 1
  13 0012 00C0              rjmp done
  14                grtr:
  15 0014 22E0              ldi r18, 2
  16                done:
  17 0016 022E              mov r0, r18
  18                
DEFINED SYMBOLS
              test.s:2      .text:0000000000000000 main
              test.s:5      .text:0000000000000004 loop
              test.s:14     .text:0000000000000014 grtr
              test.s:16     .text:0000000000000016 done

NO UNDEFINED SYMBOLS

Если вместо этого я использую

avr-gcc -Wa,-alhns -Wa,-L -mmcu=atmega2560 test.s -o test.o > test.lst

, я генерирую гекс, который включает все прерыванияvector table

:100000000C9472000C947E000C947E000C947E0084
:100010000C947E000C947E000C947E000C947E0068
:100020000C947E000C947E000C947E000C947E0058
:100030000C947E000C947E000C947E000C947E0048
:100040000C947E000C947E000C947E000C947E0038
:100050000C947E000C947E000C947E000C947E0028
:100060000C947E000C947E000C947E000C947E0018
:100070000C947E000C947E000C947E000C947E0008
:100080000C947E000C947E000C947E000C947E00F8
:100090000C947E000C947E000C947E000C947E00E8
:1000A0000C947E000C947E000C947E000C947E00D8
:1000B0000C947E000C947E000C947E000C947E00C8
:1000C0000C947E000C947E000C947E000C947E00B8
:1000D0000C947E000C947E000C947E000C947E00A8
:1000E0000C947E0011241FBECFEFD1E2DEBFCDBF46
:1000F00000E00CBF0E9480000C948C000C94000067
:100100000AE010E0100F0A950030E1F7123314F402
:0C01100021E001C022E0022EF894FFCF95
:00000001FF

, но заметно, что гекс для веток теперь точен.Проблема в том, что файл листинга все тот же, что и раньше.Не только неправильные коды операций для веток, но теперь и области памяти для инструкций по сборке тоже неверны.

Какую ошибку я делаю при создании этого файла листинга?В идеале я хотел бы сгенерировать тот, который имеет надлежащие коды операций и либо не включает таблицу векторов прерываний, либо включает таблицу векторов прерываний и имеет правильные ячейки памяти для инструкций по сборке.

Заранее спасибо.

1 Ответ

1 голос
/ 02 июля 2019

Другим возможным подходом будет сборка + ссылка с отладочной информацией, затем использование objdump с режимом вывода «источник + дизассемблирование» для получения машинного кода и адресов + исходных строк исходного кода.

Это позволило бы вам получить связанные исполняемые файлы с должным образом заполненными целями ветвления.

Вы можете использовать objdump -D для "дизассемблирования" не-кодовых секций исполняемого файла, так что вы, вероятно, можете использовать это для получения hexdump IVT.

...