реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Добавление строки байтов в область памяти, Не ASCII символы, а именно HEX
Turnaev Sergey
сообщение Mar 1 2008, 18:11
Сообщение #1


Знающий
****

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



Требуется загнать во флешь по нужному адресу HEX байты, но ассемблер упорно пишет вместо этих байтов их ASCII коды.
Делал так:
Код
.org 1000
.db "0000000001C0C07E0100000001C63019839FE00001C0000"


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

Просмотрел много похожих тем, но нужной мне информации не нашёл.


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 1 2008, 18:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Код
.db 0x00, 0x00, 0x00...


Тут не темы, а документацию смотреть нужно.
Go to the top of the page
 
+Quote Post
Turnaev Sergey
сообщение Mar 1 2008, 18:15
Сообщение #3


Знающий
****

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



А если байтов всего 3840, то как?
Так же? biggrin.gif


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 1 2008, 18:22
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А что Вас смущает?
Ну, напишите для компьютера программку для преобразования bin в текст - дело на 5 минут.
Go to the top of the page
 
+Quote Post
Turnaev Sergey
сообщение Mar 1 2008, 18:43
Сообщение #5


Знающий
****

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



Собственно интересуют встроенные в язык функции.
Если они есть, то зачем морочить себе голову, написанием дополнительных программ.

А вот если таких функций нет, тогда действительно придётся Си вспоминать.


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 1 2008, 18:49
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Turnaev Sergey @ Mar 1 2008, 21:43) *
Собственно интересуют встроенные в язык функции.

Встроенные в язык (какой, кстати?) функции описаны в его документации. Из Вашего первого поста совершенно невозможно понять, что требуется подключить бинарный файл, а не "записать HEX в память".
Go to the top of the page
 
+Quote Post
Turnaev Sergey
сообщение Mar 1 2008, 18:55
Сообщение #7


Знающий
****

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



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

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

Документацию естественно смотрел, но нужного мне не нашёл.


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Mar 1 2008, 19:28
Сообщение #8


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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

Аналогично можно слепить макрос генерации чего угодно, хоть таблиц "данных в инактивированном формате" имени Амброзио.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Turnaev Sergey
сообщение Mar 1 2008, 20:52
Сообщение #9


Знающий
****

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



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?


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 1 2008, 21:12
Сообщение #10


Профессионал
*****

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



Цитата(Turnaev Sergey @ Mar 1 2008, 21:15) *
А если байтов всего 3840, то как?
Так же? biggrin.gif

А откуда вы берете столько данных, в таком довольно экзотичном виде?
Если их генерит программа не проще ли сразу вставить туда ",0x"
Или если данные есть в бинарном файле просто прилинковать его к проекту.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 1 2008, 21:29
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Делал для себя. Особо не вылизывал. Можно из бинарника в любой файл преобразовать. В том числе и в asm.
Прикрепленные файлы
Прикрепленный файл  BinToC.zip ( 210.18 килобайт ) Кол-во скачиваний: 39
 
Go to the top of the page
 
+Quote Post
ReAl
сообщение Mar 1 2008, 22:38
Сообщение #12


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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 тоже очень неплох. Причём он когда-то даже бесплатным был, с сайта атмел скачивался - ассемблер и линкер командной строки, маленький аккуратный архив.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Turnaev Sergey
сообщение Mar 2 2008, 10:33
Сообщение #13


Знающий
****

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



Цитата(KRS @ Mar 2 2008, 03:12) *
А откуда вы берете столько данных, в таком довольно экзотичном виде?
Если их генерит программа не проще ли сразу вставить туда ",0x"
Или если данные есть в бинарном файле просто прилинковать его к проекту.

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

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

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


--------------------
"Отсутствие вашей судимости - это не ваша заслуга, а наша недоработка."
Ф.Дзержинский.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Mar 2 2008, 11:23
Сообщение #14


Нечётный пользователь.
******

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



Тю, я думал, оно исходно почему-то в таком текстовом виде.

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

Ну и тот же GNU as позволяет
Код
    .text
label:
    .incbin "tb.bin"; можно ещё через запятую стартовый адрес и длину (откуда из того фоайла взять и сколько)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 2 2008, 15:53
Сообщение #15


Профессионал
*****

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



Цитата(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
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01535 секунд с 7
ELECTRONIX ©2004-2016