|
Добавление строки байтов в область памяти, Не ASCII символы, а именно HEX |
|
|
|
Mar 1 2008, 18:11
|

Знающий
   
Группа: Свой
Сообщений: 562
Регистрация: 25-07-06
Из: Зеленоград, Новосибирск
Пользователь №: 19 088

|
Требуется загнать во флешь по нужному адресу HEX байты, но ассемблер упорно пишет вместо этих байтов их ASCII коды. Делал так: Код .org 1000 .db "0000000001C0C07E0100000001C63019839FE00001C0000" Подскажите как записать именно HEX в память. Просмотрел много похожих тем, но нужной мне информации не нашёл.
--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка." Ф.Дзержинский.
|
|
|
|
|
Mar 1 2008, 18:55
|

Знающий
   
Группа: Свой
Сообщений: 562
Регистрация: 25-07-06
Из: Зеленоград, Новосибирск
Пользователь №: 19 088

|
Цитата(aaarrr @ Mar 2 2008, 00:49)  Встроенные в язык (какой, кстати?) функции описаны в его документации. Из Вашего первого поста совершенно невозможно понять, что требуется подключить бинарный файл, а не "записать HEX в память". Намёк понял, уточняю: Используя встроенные в AVRASM2 функции записать в память программ бинарные данные в HEX представлении. Документацию естественно смотрел, но нужного мне не нашёл.
--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка." Ф.Дзержинский.
|
|
|
|
|
Mar 1 2008, 19:28
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(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 Аналогично можно слепить макрос генерации чего угодно, хоть таблиц "данных в инактивированном формате" имени Амброзио.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Mar 1 2008, 20:52
|

Знающий
   
Группа: Свой
Сообщений: 562
Регистрация: 25-07-06
Из: Зеленоград, Новосибирск
Пользователь №: 19 088

|
ReAlДааа.... Перевариваю... Разобрался. Спасибо! Для 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?
--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка." Ф.Дзержинский.
|
|
|
|
|
Mar 1 2008, 21:12
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Turnaev Sergey @ Mar 1 2008, 21:15)  А если байтов всего 3840, то как? Так же?  А откуда вы берете столько данных, в таком довольно экзотичном виде? Если их генерит программа не проще ли сразу вставить туда ",0x" Или если данные есть в бинарном файле просто прилинковать его к проекту.
|
|
|
|
|
Mar 1 2008, 22:38
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(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 тоже очень неплох. Причём он когда-то даже бесплатным был, с сайта атмел скачивался - ассемблер и линкер командной строки, маленький аккуратный архив.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Mar 2 2008, 10:33
|

Знающий
   
Группа: Свой
Сообщений: 562
Регистрация: 25-07-06
Из: Зеленоград, Новосибирск
Пользователь №: 19 088

|
Цитата(KRS @ Mar 2 2008, 03:12)  А откуда вы берете столько данных, в таком довольно экзотичном виде? Если их генерит программа не проще ли сразу вставить туда ",0x" Или если данные есть в бинарном файле просто прилинковать его к проекту. Ну собственно если 240*128/8 то получим как раз столько байтов. Это картинка, которую я хочу вывести на ЖК дисплей. С форматом BMP уже разобрался, думаю действительно надо будет писать свою прогу под это дело. А вот по поводу линковки по подробнее пожалуйста. Есть бинарный файл, его надо прицепить в определённое место HEX файла проекта. Как это сделать? SasaVitebskСпасибо, работает. Единственный недостаток, это лишняя запятая в конце каждой строки, приходится её убирать вручную.
--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка." Ф.Дзержинский.
|
|
|
|
|
Mar 2 2008, 11:23
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Тю, я думал, оно исходно почему-то в таком текстовом виде. Если оно исходно бинарное - то гляньте на http://srecord.sourceforge.net/Конвертилка из многого количества форматов в ещё большее количество. Насколько помню - можно будет вообще прямо в hex проекта влить в нужные адреса bin-файл, ну а уж асм сгенерировать так точно можно Ну и тот же GNU as позволяет Код .text label: .incbin "tb.bin"; можно ещё через запятую стартовый адрес и длину (откуда из того фоайла взять и сколько)
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Mar 2 2008, 15:53
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Turnaev Sergey @ Mar 2 2008, 13:33)  Ну собственно если 240*128/8 то получим как раз столько байтов. Это картинка, которую я хочу вывести на ЖК дисплей. С форматом BMP уже разобрался, думаю действительно надо будет писать свою прогу под это дело. скорее всего придется, обычно биты приходится переставлять задом наперед, что бы удобнее было выводить (хотя для 8 битного процессора это все равно, сдвиг в другую сторону). Но у меня например есть дисплей у которого память на пикели ветикальными полосками отображается ( на матричный принтер похоже). Цитата(Turnaev Sergey @ Mar 2 2008, 13:33)  А вот по поводу линковки по подробнее пожалуйста. Есть бинарный файл, его надо прицепить в определённое место HEX файла проекта. Как это сделать? я честно говоря AvrStudio 100 лет не пользовался, а их ассемблером вообще, раньше помню там никакого линкера не было. Вам надо взять IAR или GCC и там и там есть возможность подключить бинаный файл к проекту причем в определенный сегмент (секцию). Тем боллее что AvrStudio вроде как поддерживает WinAvr
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|