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

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » objdump для AVR Object File (AOF)


objdump для AVR Object File (AOF)

Сообщений 61 страница 90 из 210

1

Платформа: .Net 4.5, C#, VS2013
Ссылка на git репозиторий проекта: https://github.com/ViacheslavMezentsev/objdump
Ссылка на последнюю откомпилированную сборку: (пока ссылки нет)

Документацию на AOF можно найти в репозитории.

Как это выглядит в реальности:

http://img.radiokot.ru/files/4453/thumbnail/6by6j47v5.png

Документация на набор инструкций: AVR Instruction Set Manual

Требования: Исходные файлы, указанные в объектном файле, должны находиться в той же папке, откуда вызывается программа, т.е. всё должно быть рядом.
Формат вызова: objdump -S имя_объектного_файла

Описание: Программа objdump формирует смешанные листинги с результатом компиляции исходных файлов при помощи компилятора bascomp.exe. Выходные файлы имеют имя, соответствующее исходному файлу, и расширение .lst. Если в результате компиляции какому-то модулю не соответствует ни одной ассемблерной инструкции, то выходной листинг для него не формируется.

П.С. Сочувствующим товарищам, желающим высказать своё оценочное мнение не по теме: не надо мусорить в сети, вы либо пишите что-то конкретное, связанное с обсуждаемым вопросом, либо не пишите вообще, а просто наблюдайте за процессом. Под чем-то конкретным я понимаю вопросы технического характера (в плане программирования, сборки, отладки).

Я считаю AVR Studio и Proteus в данном конкретном случае - протезом для мозга. Случай этот - изучение ассемблера AVR и просмотр листингов смешанного кода, не выходя из одной программы. Если вы владеете ассемблером, то пользуйтесь на здоровье чем хотите, если нет, то не пишите в этой теме про удобство указанных программ.

Отредактировано uni (2015-02-10 14:55:36)

+2

61

Это вещь специализированная, не каждому надо, а кто знает что это, тому объяснять не нужно. Я им картинки поясняющие показал, думаю дойдёт.

По поводу использования русского языка при программировании. Я не знал, что bascom не чувствителен к кодам символов. Это ему большой плюс.

0

62

uni написал(а):

Это вещь специализированная, не каждому надо, а кто знает что это, тому объяснять не нужно. Я им картинки поясняющие показал, думаю дойдёт.

Тогда почему здесь вы выложили своё творение не так же сухо как на зарубежном ресурсе?

0

63

А где там сухо? Полная документация на объектный файл есть, документация на набор инструкций есть. objdump - это вообще стандартное наименование такой утилиты, она есть с таким именем в любом наборе компилятора. Одного имени знающему человеку достаточно, чтобы понять что это такое. Ключ -S - это стандартный ключ для показа листинга. На самом деле я даже избыточно дал информацию.

0

64

no comments

0

65

:) учитесь, это никогда не поздно: objdump
Я реализовал только маленькую толику из того, что принято называть objdump.

0

66

т.е. вы такой здесь один умный и считаете, что это нужно всем?
меня это пока мало интересует, не нужно

0

67

RDW написал(а):

no comments

0

68

Обновлён (только бинарный файл). Поддерживается 103 команды.

0

69

uni написал(а):

Поддерживается 103 команды.

Похоже, я со своей помощью опоздал.

Саша звонил, он сейчас не имеет возможности написать лично.
Он решил проблему с русским языком.
Первой строкой в батнике должна быть указана кодировка.
Я думаю, вечером он сам напишет.

0

70

Ну, то, что команд больше сотни, не значит, что в программе нет багов. Минимум месяц отлаживать ещё. Я не думал, что буду команды copy-paste'ом набивать, первоначально хотел вообще на бейсике писать, потом подумал - нет, пожалуй, лучше уж на шарпе. Есть у него много удобных вещей, которые помогли ускорить процесс значительно.

Осталась проблема с 32 разрядными командами и сходу я её решить не смог, учитывая текущую архитектуру программы.
Теперь нужно придумать как автоматизировать тестирование, чтобы не вручную все комбинации проверять.

0

71

В бейсике есть практически всё, что в шарпе.
На работе пишу на шарпе, дома на бейсике
Мне нравится, что в одном проекте можно на двух языках писать.
Часть старых библиотек написано на бейсике, прекрасно уживаются с кодом Шарпа, позволяя вести отладку сразу и там и там.

0

72

Я думал, что Linq там не поддерживается, потому откинул этот вариант. Я пользуюсь запросами, чтобы упростить конструкции. Посмотрел сейчас, оказывается поддерживается, но всё равно проблемы совместимости у них есть, хотя бы из-за чувствительности к регистру. Да и некоторые участки моего кода не сразу поймешь как на бейсике написать, так как там это будет выглядеть по-другому. Это касается перебора классов в сборке при поиске совпадения по интерфейсу. Очень мало ответов в сети по специальным вопросам на бейсике, потому что-то сложное я на нём бы не стал писать. Ну, а битовая арифметика там бы вообще, наверное "взорвала мозг". Я на шарпе то не сразу понял как делать некоторые магические операции типа перевода из дополнительного кода.

0

73

Я пользуюсь транслятором из одного языка в другой.
Телерик весьма неплох. http://converter.telerik.com/

Вот пример перевода класса ANDI:

C#

using System;

namespace objdump.Instructions {

    // ANDI - Add without Carry.
    // 0111 KKKK dddd KKKK
    public class andi: IInstruction {

        public OpInfo info;
        public OpInfo OpInfo { get { return info; } }           
       
        public andi() { info = new OpInfo( "ANDI", @"0111\d{12}" ); }

        public string Disassemble( Record item ) {
         
            string op;

            try {

                // Преобразуем в двоичное представление.
                var code = Convert.ToString( item.OpCode, 2 ).PadLeft( 16, '0' );

                // Узнаём параметры инструкции.
                // 0123 4567 8901 2345
                // 0111 KKKK dddd KKKK
                var Rd = 16 + Convert.ToByte( code.Substring( 8, 4 ), 2 );
                var K = Convert.ToByte( code.Substring( 4, 4 ) + code.Substring( 12, 4 ), 2 );

                op = String.Format( "ANDI R{0}, ${1:X2}", Rd, K );
           
            } catch( Exception ex ) {

                // Отладочное сообщение в случае ошибки.
                op = String.Format( "line: {0}, addr: {1}, opcode: {2:X4} - {3}",
                    item.LineNumber, item.Address, item.OpCode, ex.Message );

                throw new Exception( op );
            }

            return op;   
        }

    }

}

VBNET

Namespace objdump.Instructions

' ANDI - Add without Carry.
' 0111 KKKK dddd KKKK
Public Class andi
    Implements IInstruction

    Public info As OpInfo
    Public ReadOnly Property OpInfo() As OpInfo
    Get
        Return info
    End Get
    End Property

    Public Sub New()
    info = New OpInfo("ANDI", "0111\d{12}")
    End Sub

    Public Function Disassemble(item As Record) As String

    Dim op As String

    Try

        ' Преобразуем в двоичное представление.
        Dim code = Convert.ToString(item.OpCode, 2).PadLeft(16, "0"C)

        ' Узнаём параметры инструкции.
        ' 0123 4567 8901 2345
        ' 0111 KKKK dddd KKKK
        Dim Rd = 16 + Convert.ToByte(code.Substring(8, 4), 2)
        Dim K = Convert.ToByte(code.Substring(4, 4) + code.Substring(12, 4), 2)

        op = [String].Format("ANDI R{0}, ${1:X2}", Rd, K)
    Catch ex As Exception

        ' Отладочное сообщение в случае ошибки.
        op = [String].Format("line: {0}, addr: {1}, opcode: {2:X4} - {3}", item.LineNumber, item.Address, item.OpCode, ex.Message)

        Throw New Exception(op)
    End Try

    Return op
    End Function

End Class

End Namespace

'=======================================================
'Service provided by Telerik (telerik.com)
'Conversion powered by NRefactory.
'Twitter: @telerik
'Facebook: facebook.com/telerik
'=======================================================

+1

74

Надо же, спасибо за наводку, а я как-то долго ломал голову как перевести метод Initialize() c C# на VB.Net, там typeof() используется и я не сразу нашёл аналог в бейсике.

Ещё у меня есть одна конструкция: - ( ~k << 1 & 0x7F ). Так вот я её составил методом перебора, т.к. до сих пор не могу понять как она работает. k имеет тип uint. Это перевод из дополнительного кода относительного адреса у всех команд ветвления. Там можно прыгать назад и вперёд в зависимости от условия и прыжок назад представлен в дополнительном коде 7-разрядного числа. Так вот, нужно было из текущего адреса команды (uint) отнять это самое относительное смещение. Не знаю уж как, но чисто интуитивно подобрал конструкцию, она работает, но я не знаю как :) Оставил разбор полётов на потом, т.к. мне не нравится, когда код мне непонятен.

0

75

Обновлён (только бинарный файл). Поддерживается 127 команд.

+1

76

Вопрос с русским языком решился.

Кому интересны подробности, информация здесь

Программа разработанная Славиком (ник на форуме "uni"), поддерживает русские имена файлов, как с пробелами, так и без. Если имя с пробелами, заключать в кавычки, вместе с расширением.

Также появилась поддержка вложенных (подключенных) в исходнике файлов, естественно и с кирилическим написанием имён тоже (чай не в западах проживаем).

Поддерживаются длинные пути (проверил до 200 символов), написанные кирилицей в том числе.

Все вышесказанное проверено на Windows 7 x32 x64.

Отредактировано sasha_1973 (2013-11-03 20:12:50)

0

77

RDW написал(а):

т.е. вы такой здесь один умный и считаете, что это нужно всем?
меня это пока мало интересует, не нужно


Ну чего Вы такой вредный, не интересно, не нравится, не интересует, не читайте.

Никто, никому, ничего не навязывает.

Зачем-же обижать человека, который старается ради тех, кому это интересно или может пригодиться!!!

Заметьте, не просто старается, а выкладывает для всех!!!

Для чего рубать на корню энтузиазм.

Отредактировано sasha_1973 (2013-11-03 20:09:01)

0

78

Пипец, Славик, ну ты и маньяк!!!

Когда только успеваешь спать, у тебя что, сутки в 2 раза длиннее, поделись рецептом?

Отредактировано sasha_1973 (2013-11-03 20:16:52)

0

79

Обновлён (только бинарный файл). Поддерживается 137 команд.

Остались вариации команд: LDS, STS, LPM, ELPM и SPM и всё. Дальше только отлов багов. 32-разрядные команды я осилил (сейчас поддерживаются JMP и CALL). Сплю иногда :)

Отредактировано uni (2013-11-03 20:27:22)

+1

80

uni написал(а):

Сплю иногда

Смотри, так и до инфаркта недалеко!!!

Отловленные баги, сюда или на mail?

0

81

Можно сюда с примером кода на бейсике, который был тестом и логом.

Отредактировано uni (2013-11-03 20:30:38)

0

82

uni написал(а):

Обновлён (только бинарный файл). Поддерживается 137 команд.

Остались вариации команд: LDS, STS, LPM, ELPM и SPM и всё. Дальше только отлов багов. 32-разрядные команды я осилил (сейчас поддерживаются JMP и CALL). Сплю иногда

Отредактировано uni (Сегодня 18:27:22)

Вот-это красотища, нема слов, одни выражения, и все 16-ти этажные!!!

1000 баллов по 5-ти бальной шкале!!!

СЛАВЯНЕ ЛУЧШИЕ!!!

http://s7.uploads.ru/t/qBZwb.jpghttp://s6.uploads.ru/t/aHmgB.jpg

Отредактировано sasha_1973 (2013-11-03 20:42:59)

0

83

Вот-бы еще сделать так, что-бы сразу после компиляции, появлялось рядышком окно с результатом, а еще лучше, что-бы все работало синхронно с набором кода в Bascom!

Отредактировано sasha_1973 (2013-11-03 20:36:02)

0

84

На форуме Bascom, так никто и не отозвался за 2 суток.

0

85

В Notepad++ второе окно получается перетаскиванием одной из вкладок (открытого файла) в рабочее пространство. У меня компиляция настроена на клавишу F7 (убрал в настройках эту клавишу с другой опции). После сборки, которая у меня по командному файлу происходит, где указана моя утилитка, нужно переключиться с окна на окно, чтобы lst-файл понял, что он изменился извне. Тогда Notepad++ спрашивает, а не хотите ли вы обновить вид файла, т.к. он изменился.

http://img.radiokot.ru/files/4453/thumbnail/6ei6dyzxp.png

Отредактировано uni (2013-11-03 20:49:57)

0

86

uni написал(а):

После сборки, которая у меня по командному файлу происходит


Если не жалко, скинь на mail, настроенные Notepad++ и командный файлик?

0

87

Эти файлы лежат в хранилище с каждым моим проектом в bascom: https://mysvn.ru/avr/bascom/tinycmd/

build.cmd, clean.cmd, rebuild.cmd, showrpt.js - вот эти файлы.

Я их писал на скорую руку, так что их надо допиливать правильно, чтобы нужную информацию выводили, но они рабочие. Только нужно туда вставить строчку: objdump -S "%~dp0MainUnit.obj"

Вот и всё, а в Notepad++ нужно эти три команды забить так, как это описано в статье, ссылку на которую я приводил. Я просто не знаю где и как лежат настройки Notepad++, поэтому рекомендую всё же не побояться и замахнуться на Вильяма на нашего на Шекспира и сделать всё самому.

П.С. Очень удобно получилось. Сразу вижу в модуле, какой "хвост" из своих библиотек прикрепляет bascom. Идёт мой листинг, а ниже код без исходника - это функции, которые определены в стандартной библиотеке (библиотеках). Сразу видна таблица векторов прерываний и начальная инициализация.

Можно покопаться сразу в коде bascom'а. Например, понять как работает софт-стек, т.е. программный. Когда мы объявляем в функции локальную переменную, то её размер записывается в R24 и далее идёт RCALL на вот такой кусок кода:

0776 925A     ST   -Y, R5
0778 924A     ST   -Y, R4
077A 0E48     LSL  R18
077C 2788     EOR  R24, R24
077E 1E58     ADC  R5, R24
0780 9508     RET

А вот объявление переменных:

Код:
                  Local Temp As Byte
017E E081     LDI  R24, $01
0180 D2FA     RCALL $+05F6 (0776)
                  Local Ptr As Word
0182 E082     LDI  R24, $02
0184 D2F8     RCALL $+05F2 (0776)

Смотрел я на этот код и не мог понять, а где же использование R24, в котором размер храниться? И причём тут LSL R18 вообще? Заглянул в pdf'ку, а коды у ADD и LSL в данном случае как-то странно совпадают. На самом деле там должна быть мнемоника ADD R4, R24. Такой вот первый косяк. Пока даже не знаю в чём дело.

Отредактировано uni (2013-11-03 21:24:15)

+1

88

Не подскажешь, что за ошибка?

http://s7.uploads.ru/t/u9xna.jpg

0

89

uni написал(а):

Только нужно туда вставить строчку: objdump -S "%~dp0MainUnit.obj"

Куда вставлять?

0

90

Господи, ты где такой компилятор-то откопал? Регистрируйся на рутрекере, я тебе дам ссылку на 2.0.7.5, который у меня стоит. Дело в том, что старые версии могу вообще не поддерживать такой синтаксис.

Код:
@echo off

"C:\Program Files\MCS Electronics\BASCOM-AVR\bascomp.exe" "%~dp0MainUnit.bas" SS=40 HW=16 FR=32 CHIP=31

if %errorlevel% == 2 goto ShowError

objdump -S "%~dp0MainUnit.obj"

goto Exit

:ShowError
  type "%~dp0MainUnit.err"

:Exit

Отредактировано uni (2013-11-03 21:27:06)

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » objdump для AVR Object File (AOF)