Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Добавление строки байтов в область памяти
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Turnaev Sergey
Требуется загнать во флешь по нужному адресу HEX байты, но ассемблер упорно пишет вместо этих байтов их ASCII коды.
Делал так:
Код
.org 1000
.db "0000000001C0C07E0100000001C63019839FE00001C0000"


Подскажите как записать именно HEX в память.

Просмотрел много похожих тем, но нужной мне информации не нашёл.
aaarrr
Код
.db 0x00, 0x00, 0x00...


Тут не темы, а документацию смотреть нужно.
Turnaev Sergey
А если байтов всего 3840, то как?
Так же? biggrin.gif
aaarrr
А что Вас смущает?
Ну, напишите для компьютера программку для преобразования bin в текст - дело на 5 минут.
Turnaev Sergey
Собственно интересуют встроенные в язык функции.
Если они есть, то зачем морочить себе голову, написанием дополнительных программ.

А вот если таких функций нет, тогда действительно придётся Си вспоминать.
aaarrr
Цитата(Turnaev Sergey @ Mar 1 2008, 21:43) *
Собственно интересуют встроенные в язык функции.

Встроенные в язык (какой, кстати?) функции описаны в его документации. Из Вашего первого поста совершенно невозможно понять, что требуется подключить бинарный файл, а не "записать HEX в память".
Turnaev Sergey
Цитата(aaarrr @ Mar 2 2008, 00:49) *
Встроенные в язык (какой, кстати?) функции описаны в его документации. Из Вашего первого поста совершенно невозможно понять, что требуется подключить бинарный файл, а не "записать HEX в память".

Намёк понял, уточняю:
Используя встроенные в AVRASM2 функции записать в память программ бинарные данные в HEX представлении.

Документацию естественно смотрел, но нужного мне не нашёл.
ReAl
Цитата(Turnaev Sergey @ Mar 1 2008, 20:55) *
Намёк понял, уточняю:
Используя встроенные в AVRASM2 функции записать в память программ бинарные данные в HEX представлении.

Ну, так с лёту на GNU as это выглядит приблизительно так:

Код
.macro hexstr s
    .set pair, 0
    .irpc c, \s
        .if pair == 0
            .set val, 0x\c
        .else
            .byte val*16 + 0x\c
        .endif
        .set pair, 1 - pair
    .endr
.endm

    .text
    hexstr "0000000001C0C07E0100000001C63019839FE00001C0000"

    .end

Фрагмент листинга.
CODE
15 .text
16 hexstr "0000000001C0C07E0100000001C63019839FE00001C0000"
16 > .set pair,0
16 > .irpc c,0000000001C0C07E0100000001C63019839FE00001C0000
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 0000 00 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 0001 00 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 0002 00 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 0003 00 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x1
16 >> .else
16 0004 01 >> .byte val*16+0x1
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0xC
16 >> .else
16 >> .byte val*16+0xC
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 0005 C0 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0xC
16 >> .else
16 >> .byte val*16+0xC
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 0006 C0 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x7
16 >> .else
16 >> .byte val*16+0x7
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0xE
16 >> .else
16 0007 7E >> .byte val*16+0xE
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x1
16 >> .else
16 0008 01 >> .byte val*16+0x1
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 >> .byte val*16+0x0
16 >> .endif
16 >> .set pair,1-pair
16 >>
16 >> .if pair==0
16 >> .set val,0x0
16 >> .else
16 0009 00 >> .byte val*16+0x0
16 >> .endif


Ищите у аврасма похожие макроинструкции




Ай, аврасм, кажется, обижается на .db с одинм байтом (с нечётным количеством байт) - от себя 0 добавляет и цепочка .db нехороша.
Ну тогда надо гененрировать под .dw
Код
.macro hexstr s
    .set index, 0
    .set val, 0
    .irpc c, \s
        .set val, val*16 + 0x\c
        .set index, index + 1
        .if index == 4
            .word val
            .set index, 0
            .set val, 0
        .endif
    .endr
    .if index == 2  
        .byte val; это на случай нечётного количества байт
    .endif    ; нецелое количество байт (нечётное количество символов) игнорируем (не обрабатываем эту ошибку :-) )
.endm

    .text
; hexstr "0000000001C0C07E0100000001C63019839FE00001C0000"
    hexstr "0123456789"

    .end

Аналогично можно слепить макрос генерации чего угодно, хоть таблиц "данных в инактивированном формате" имени Амброзио.
Turnaev Sergey
ReAl
Дааа.... wacko.gif
Перевариваю...

Разобрался.
Спасибо!

Для AVRASM2 надо написать примерно следующее:
Код
.macro hexstr
    .set index = 0
    .set val = 0
    .irpc c = \hexstr; <-------------нет такой инструкции!
        .set val = val*16 + 0x\c
        .set index, index + 1
        .if index == 4
            .dw val
            .set index = 0
            .set val = 0
        .endif
    .endr; <---------------------нет такой инструкции!
    .if index == 2  
        .db val
    .endif
.endm

.org 0xA000
hexstr "123456789"


Однако я не нашёл аналога инструкций .irpc и .endr
Чем их можно заменить в ущербном AVRASM2?
KRS
Цитата(Turnaev Sergey @ Mar 1 2008, 21:15) *
А если байтов всего 3840, то как?
Так же? biggrin.gif

А откуда вы берете столько данных, в таком довольно экзотичном виде?
Если их генерит программа не проще ли сразу вставить туда ",0x"
Или если данные есть в бинарном файле просто прилинковать его к проекту.
SasaVitebsk
Делал для себя. Особо не вылизывал. Можно из бинарника в любой файл преобразовать. В том числе и в asm.
ReAl
Цитата(Turnaev Sergey @ Mar 1 2008, 22:52) *
Однако я не нашёл аналога инструкций .irpc и .endr
"Нет значит не было". Инструкции .irpc, .irp, .rept как правило так и называются везде, где они есть. .endr - у GNU as это просто завершитель одной из этих инструкций повторения, у других макроасемблеров они могут "закрываться" таким же.endm, как и макрос.

.rept - просто повторение заданное число раз блока кода
Код
; задержка на заданное число циклов (<= 768)
.macro delay_cycles cycles, tempreg =WL
        .set _cy_, \cycles
        .if _cy_ >= 6
            ldi    \tempreg , lo8(_cy_ / 3)
             dec    \tempreg
            brne .-4
            .set _cy_, _cy_ % 3
        .endif
        .if (_cy_ & 0x01)
            nop
        .endif
        .rept  (_cy_ / 2)
            rjmp .
        .endr
.endm


.irpc - перебор одного аргумента посимвольно, как использовано в показанном макросе.

.irp - перебор агргументов из списка аргументов. Тоже приятная вещица
Код
; генерируем группу макросов словных сдвигов вправо - арифметического, логического, циклического
.irp cmd, asr, lsr, ror
    .macro \cmd\()w reg:req
        \cmd    \reg+1
        ror    \reg
    .endm
.endr

.set r16, 16
.set r18, 18
.set r20, 20

    .text
    asrw r16
    lsrw r18
    rorw r20

; ещё группу макросов генерируем одним махом
.irp cmd, push, pop, clr
    .macro _\cmd regs : vararg
        .irp r, \regs
            \cmd \r
        .endr
    .endm
.endr
; и проверяем использование
    _push r16,r17,r18
    _clr r16, r18
    _pop r18, r17, r16


Цитата(Turnaev Sergey @ Mar 1 2008, 22:52) *
Чем их можно заменить в ущербном AVRASM2?
Может, лучше переформулировать вопрос? Не "в ущербном", а "ущербный"
IAR ASM тоже очень неплох. Причём он когда-то даже бесплатным был, с сайта атмел скачивался - ассемблер и линкер командной строки, маленький аккуратный архив.
Turnaev Sergey
Цитата(KRS @ Mar 2 2008, 03:12) *
А откуда вы берете столько данных, в таком довольно экзотичном виде?
Если их генерит программа не проще ли сразу вставить туда ",0x"
Или если данные есть в бинарном файле просто прилинковать его к проекту.

Ну собственно если 240*128/8 то получим как раз столько байтов. smile.gif
Это картинка, которую я хочу вывести на ЖК дисплей.
С форматом BMP уже разобрался, думаю действительно надо будет писать свою прогу под это дело.

А вот по поводу линковки по подробнее пожалуйста.
Есть бинарный файл, его надо прицепить в определённое место HEX файла проекта.
Как это сделать?

SasaVitebsk
Спасибо, работает.
Единственный недостаток, это лишняя запятая в конце каждой строки, приходится её убирать вручную.
ReAl
Тю, я думал, оно исходно почему-то в таком текстовом виде.

Если оно исходно бинарное - то гляньте на http://srecord.sourceforge.net/
Конвертилка из многого количества форматов в ещё большее количество.
Насколько помню - можно будет вообще прямо в hex проекта влить в нужные адреса bin-файл, ну а уж асм сгенерировать так точно можно

Ну и тот же GNU as позволяет
Код
    .text
label:
    .incbin "tb.bin"; можно ещё через запятую стартовый адрес и длину (откуда из того фоайла взять и сколько)
KRS
Цитата(Turnaev Sergey @ Mar 2 2008, 13:33) *
Ну собственно если 240*128/8 то получим как раз столько байтов. smile.gif
Это картинка, которую я хочу вывести на ЖК дисплей.
С форматом BMP уже разобрался, думаю действительно надо будет писать свою прогу под это дело.

скорее всего придется, обычно биты приходится переставлять задом наперед, что бы удобнее было выводить (хотя для 8 битного процессора это все равно, сдвиг в другую сторону). Но у меня например есть дисплей у которого память на пикели ветикальными полосками отображается ( на матричный принтер похоже).

Цитата(Turnaev Sergey @ Mar 2 2008, 13:33) *
А вот по поводу линковки по подробнее пожалуйста.
Есть бинарный файл, его надо прицепить в определённое место HEX файла проекта.
Как это сделать?

я честно говоря AvrStudio 100 лет не пользовался, а их ассемблером вообще, раньше помню там никакого линкера не было. Вам надо взять IAR или GCC и там и там есть возможность подключить бинаный файл к проекту причем в определенный сегмент (секцию). Тем боллее что AvrStudio вроде как поддерживает WinAvr
SasaVitebsk
Цитата(Turnaev Sergey @ Mar 2 2008, 14:33) *
SasaVitebsk
Спасибо, работает.
Единственный недостаток, это лишняя запятая в конце каждой строки, приходится её убирать вручную.


smile.gif Да писал на скорую руку. Да и для себя ессно.

Подправил с учётом замечаний. smile.gif Ввёл ини файл для начальной настройки "под себя".
Turnaev Sergey
SasaVitebsk
Спасибо! Теперь самое, оно! a14.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.