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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> надо в ассемблере в таблице организовать базу данных
Yuriy_AVR
сообщение Sep 20 2007, 07:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 12-01-07
Из: Крым
Пользователь №: 24 378



Всем Привет !
Есть малюсенькая задачка - Прикрепленный файл  _____________________.doc ( 20.5 килобайт ) Кол-во скачиваний: 267
надо в ассемблере в таблице организовать базу данных для сегментовПрикрепленный файл  _____________________.doc ( 20.5 килобайт ) Кол-во скачиваний: 267
в виде , показанном в приложении.
Суть проблемы - каждая цифра должна быть записана в ассемблере на своей строчке ( иначе получается очень длинная запись , и не видна по ширине экрана . Но при записи .db надо сразу записывать 2 байта ( через запятую ) . Теоретически после записи первого байта можно поставить \n
и перейти на следующую строку и всё должно быть хорошо , но ассемблер ругается :

error: syntax error, unexpected '('

с уазанием на ошибку во втором байте ( почему не отрабатывает \n ? или я чтото не так делаю ?

Если кто знает как решить проблему , помогите плиз . 07.gif
Прикрепленный файл  _____________________.doc ( 20.5 килобайт ) Кол-во скачиваний: 267
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 20 2007, 08:08
Сообщение #2


Гуру
******

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



А почему обязательно в ассемблере?
Go to the top of the page
 
+Quote Post
Yuriy_AVR
сообщение Sep 20 2007, 08:29
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 12-01-07
Из: Крым
Пользователь №: 24 378



Цитата(SasaVitebsk @ Sep 20 2007, 12:08) *
А почему обязательно в ассемблере?


Программа на писана на ассме .
Тем более что мне ассм больше нравится - каждому своё .
Go to the top of the page
 
+Quote Post
Wild007
сообщение Sep 20 2007, 10:00
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Для большей читабельности програим надо вводить дополнительные переменные с помощью .equ, например:
Код
.equ S1 = (Seg_On<<D7)+(Seg_On<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_Off<<D2)+(Seg_On<<D1)+(Seg_Off<<D0)

.equ S2 = (Seg_On<<D7)+(Seg_On<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_Off<<D2)+(Seg_On<<D1)+(Seg_Off<<D0)


а в .db уже использовать их названия, например:
Код
.DB S1,S2,.........


Сочетание '\n' компилятор воспринимает не как перевод строки, а присваивает ему значение Newline (ASCII LF 0x0a) (см. хелп по Студии).


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
=GM=
сообщение Sep 20 2007, 10:01
Сообщение #5


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Yuriy_AVR @ Sep 20 2007, 07:29) *
Программа написана на ассме

Или так
Код
.DB (On<<D7)+(On<<D6)+(On<<D5)+(On<<D4)+(On<<D3)+(Of<<D2)+(On<<D1)+(Of<<D0);0
.DB (Of<<D7)+(Of<<D6)+(Of<<D5)+(Of<<D4)+(On<<D3)+(Of<<D2)+(On<<D1)+(Of<<D0);1
.DB (On<<D7)+(On<<D6)+(Of<<D5)+(On<<D4)+(On<<D3)+(On<<D2)+(Of<<D1)+(Of<<D0);2
. . . . .
.DB (On<<D7)+(Of<<D6)+(On<<D5)+(On<<D4)+(On<<D3)+(On<<D2)+(On<<D1)+(Of<<D0);9


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Yuriy_AVR
сообщение Sep 20 2007, 11:10
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 12-01-07
Из: Крым
Пользователь №: 24 378



Цитата(=GM= @ Sep 20 2007, 14:01) *
Или так
Код
.DB (On<<D7)+(On<<D6)+(On<<D5)+(On<<D4)+(On<<D3)+(Of<<D2)+(On<<D1)+(Of<<D0);0
.DB (Of<<D7)+(Of<<D6)+(Of<<D5)+(Of<<D4)+(On<<D3)+(Of<<D2)+(On<<D1)+(Of<<D0);1
.DB (On<<D7)+(On<<D6)+(Of<<D5)+(On<<D4)+(On<<D3)+(On<<D2)+(Of<<D1)+(Of<<D0);2
. . . . .
.DB (On<<D7)+(Of<<D6)+(On<<D5)+(On<<D4)+(On<<D3)+(On<<D2)+(On<<D1)+(Of<<D0);9


Да понятно что так можно сделать , но при таком подходе памяти для таблицы будет ровно в 2 раза больше расходоваться . . .

Цитата(Wild007 @ Sep 20 2007, 14:00) *
Для большей читабельности програим надо вводить дополнительные переменные с помощью .equ, например:
Код
.equ S1 = (Seg_On<<D7)+(Seg_On<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_Off<<D2)+(Seg_On<<D1)+(Seg_Off<<D0)

.equ S2 = (Seg_On<<D7)+(Seg_On<<D6)+(Seg_On<<D5)+(Seg_On<<D4)+(Seg_On<<D3)+(Seg_Off<<D2)+(Seg_On<<D1)+(Seg_Off<<D0)


а в .db уже использовать их названия, например:
Код
.DB S1,S2,.........


Сочетание '\n' компилятор воспринимает не как перевод строки, а присваивает ему значение Newline (ASCII LF 0x0a) (см. хелп по Студии).

Да наверное это выход . . .
Странно как я ненодумался до такого простого переопределения . Большое спасибо
Go to the top of the page
 
+Quote Post
=GM=
сообщение Sep 20 2007, 16:13
Сообщение #7


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Yuriy_AVR @ Sep 20 2007, 10:10) *
Да понятно что так можно сделать , но при таком подходе памяти для таблицы будет ровно в 2 раза больше расходоваться . . .

Да? Это почему же?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Yuriy_AVR
сообщение Sep 20 2007, 17:18
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 12-01-07
Из: Крым
Пользователь №: 24 378



Цитата(=GM= @ Sep 20 2007, 20:13) *
Да? Это почему же?

Да потому что у AVRа память программ организована не побайтно ( у AVRа команды то не байтовые ) , а пословно , т.е по 2 байта , а выборка производится побайтно ( именно по этой причине при указании адреса таблицы его необходимо умножать на 2 ) . Оператор .db указывает только на чёное значение адреса , а нечётное значение из Flash можно получить только с нечётным адресом ( т.е сделав указатель на Flash нечётным ). Иными словами , чтобы получить из таблицы байт по указанному адресу , необходимо сложить указатель со смещением . При указанном вами методе необходимо будет смещение умножать на 2 , и затем складывать с указателем . При ассемблировании нечётные ячейки будут пропущены , и фактически потеряны впустую .
Так что итоговый обьём будет равен обьём таблицы х2 .
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 20 2007, 19:03
Сообщение #9


Гуру
******

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



Цитата(Yuriy_AVR @ Sep 20 2007, 11:29) *
Программа на писана на ассме .
Тем более что мне ассм больше нравится - каждому своё .


Чтобы понять что больше нравится надо попробовать оба варианта. А так сложно сравнивать.

Как раз ваша задача отлично ложится на Си. Проблема которая у вас там возникла в Си просто бы не возникала. Если вы работаете в Си, то любую часть проекта (какая вам нравится) вы можете написать на ASMе.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Sep 20 2007, 22:31
Сообщение #10


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Yuriy_AVR @ Sep 20 2007, 16:18) *
Да потому что у AVRа память программ организована не побайтно ( у AVRа команды то не байтовые ) , а пословно , т.е по 2 байта , а выборка производится побайтно ( именно по этой причине при указании адреса таблицы его необходимо умножать на 2 ) . Оператор .db указывает только на чётное значение адреса , а нечётное значение из Flash можно получить только с нечётным адресом ( т.е сделав указатель на Flash нечётным ). Иными словами , чтобы получить из таблицы байт по указанному адресу , необходимо сложить указатель со смещением . При указанном вами методе необходимо будет смещение умножать на 2 , и затем складывать с указателем . При ассемблировании нечётные ячейки будут пропущены , и фактически потеряны впустую. Так что итоговый обьём будет равен обьём таблицы х2

Ну, а если так?
Код
      .db   0b11111010,0b00001010,0b11011100,0b10111110

По-моему, наглядность еще лучше будет


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
CDT
сообщение Sep 21 2007, 04:26
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 303
Регистрация: 3-03-05
Пользователь №: 3 044



Цитата(Yuriy_AVR @ Sep 20 2007, 10:09) *
Но при записи .db надо сразу записывать 2 байта ( через запятую ) . Теоретически после записи первого байта можно поставить \n

Ну, во первых не \n и не '\n', а просто \ , и то, если речь идет об Atmel AVR Assembler 2

Код
.db 12, 15, $fe,\
      $cd,255


Еще есть директива .dw


--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
Go to the top of the page
 
+Quote Post
Yuriy_AVR
сообщение Sep 21 2007, 06:06
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 12-01-07
Из: Крым
Пользователь №: 24 378



Цитата(=GM= @ Sep 21 2007, 02:31) *
Ну, а если так?
Код
      .db   0b11111010,0b00001010,0b11011100,0b10111110

По-моему, наглядность еще лучше будет

Наглядность чего ? чередования нулей и едениц ? При большой таблице ( у меня например 86 ) значений с большим кол-вом знаков вы запаритесь .
То , что у вас записано 0b11111010 , я записываю на мой взгляд гораздо наглядней ( и с меньшей вероятностью сделать ошибку ) как
(On<<Seg_A)+(On<<Seg_B)+(On<<Seg_C)+(On<<Seg_D)+(On<<Seg_E)+(Off<<Seg_F)+(On<<Seg_G)+(Off<<Seg_H).
Да , запись длиннее , но мне нет необходимости выискивать среди этих едениц и нулей нужный мне сегмент . Я просто его либо включил , либо выключил . К тому же , если например ( как произошло в моём случае ) возникает необходимость сделать инверсную таблицу ( т.е например 1 это выключенное состояние , 0 - включенное , то мне ручками переписывать всю таблицу ?). При моей записи достаточно просто переопределить значение On и Off ( поменять местами одну 1 и один 0 ) и перекомпилировать .
К тому - же , если меняется взаимное расположение сегментов ( в моей задачке и такое было ) , то опять ручками всю таблицу ? А сегмент А вполне может быть где- нибудь на месте D3 ли D5 . Вот тогда вы всё ручками да ручками , да без ручки с бумагой не обойтись . При моей записи вы просто переопределяете что .equ Seg_A=D5 .equ Seg_B=D7 , и т.д. И ненадо парится . Всё будет сделано за вас .
Машине - машинное ( рутинное ), - человеку- человечье ( творческое )
smile.gif

Цитата(SasaVitebsk @ Sep 20 2007, 23:03) *
Чтобы понять что больше нравится надо попробовать оба варианта. А так сложно сравнивать.

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

И на асме чудненько . . .
Да и у меня проблема то возникла из-за собственных тормозов . А тормоза могут включится при программировании на любом из языков , и сам язык тут непричём.
Я знаю вашу неприкрытую приверженность к Си , но тут каждому своё - я могу писать и на Си ( правда похуже чем на асме ) и на асме; как по мне , то мне больше нравится асм. Примерно как на самолёте летишь либо сам за штурвалом , либо самолёт ведёт автопилот , и что там у него в черепушке варится - один бог знает . К тому же , как и любая программа , Си имеет свои баги ( как говорит мой друг одессит - И оно мне надо ? ) Я и сам баги могу неплохо делать . . .
А если серьёзно , то большое спасибо человеку - подсказал что достаточно просто сделать переопределение . Иногда ( как в данном случае , например ) решение под ногами , ходишь вокруг , ходишь . . . а поднять неможешь . А всё достаточно банально . . .
Ещё раз большое спасибо Wild007

Цитата(CDT @ Sep 21 2007, 08:26) *
Ну, во первых не \n и не '\n', а просто \ , и то, если речь идет об Atmel AVR Assembler 2

Код
.db 12, 15, $fe,\
      $cd,255


Еще есть директива .dw


Самый большой прикол заключается как раз в том , что я как раз так и начинал делать ( просто \ ). Это ведь первое что приходит в голову , да это и логично . Это уже потом , от злости начал уже всякие другие варианты ( \n , '\n' и т.д. ) Но оно не работало wub.gif , я и немог понять почему - вроде всё делаешь правильно , но не работает . . . Проверял многократно . От отчаяния и написал в конфу .
А теперь собственно сам прикол - я сейчас опять откомпиллировал тот кусок и . . . - неповерил своим глазам - оно работает - а я ничего не менял ( 100 % ) . Разница лишь в том что после неудачных проб комп был перегружен . Но ведь это ахинея какая-то . В жизни никогда бы неповерил если бы сам не видел - мистика какая-то.
В любом случае большое спасибо всем кто попытался помочь . . .
a14.gif
Go to the top of the page
 
+Quote Post
Wild007
сообщение Sep 21 2007, 06:53
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Цитата(Yuriy_AVR @ Sep 21 2007, 09:06) *
Самый большой прикол заключается как раз в том , что я как раз так и начинал делать ( просто \ ). Это ведь первое что приходит в голову , да это и логично . Это уже потом , от злости начал уже всякие другие варианты ( \n , '\n' и т.д. ) Но оно не работало wub.gif , я и немог понять почему - вроде всё делаешь правильно , но не работает . . . Проверял многократно . От отчаяния и написал в конфу .
А теперь собственно сам прикол - я сейчас опять откомпиллировал тот кусок и . . . - неповерил своим глазам - оно работает - а я ничего не менял ( 100 % ) . Разница лишь в том что после неудачных проб комп был перегружен . Но ведь это ахинея какая-то . В жизни никогда бы неповерил если бы сам не видел - мистика какая-то


Проверьте в .lst файле, какие значения компилятор забросил в .DB и соответствуют ли они тому что вы хотели увидеть smile.gif .


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 21 2007, 07:51
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Yuriy_AVR @ Sep 21 2007, 09:06) *
К тому же , как и любая программа , Си имеет свои баги
. . .
А теперь собственно сам прикол - я сейчас опять откомпиллировал тот кусок и . . . - неповерил своим глазам - оно работает - а я ничего не менял ( 100 % ) . Разница лишь в том что после неудачных проб комп был перегружен . Но ведь это ахинея какая-то .
Улыбнуло smile.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Sep 21 2007, 08:17
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(Yuriy_AVR @ Sep 20 2007, 21:18) *
Да потому что у AVRа память программ организована не побайтно ( у AVRа команды то не байтовые ) , а пословно , т.е по 2 байта , а выборка производится побайтно ( именно по этой причине при указании адреса таблицы его необходимо умножать на 2 ) . Оператор .db указывает только на чёное значение адреса , а нечётное значение из Flash можно получить только с нечётным адресом ( т.е сделав указатель на Flash нечётным ). Иными словами , чтобы получить из таблицы байт по указанному адресу , необходимо сложить указатель со смещением . При указанном вами методе необходимо будет смещение умножать на 2 , и затем складывать с указателем . При ассемблировании нечётные ячейки будут пропущены , и фактически потеряны впустую .
Так что итоговый обьём будет равен обьём таблицы х2 .


07.gif Это всё Вы проверяли, или И ТАК знаете?
Прикрепленное изображение

чтение IDent32:
ldi Yh,high(IDent32)
ldi Yl,low(IDent32)
shl Yl
ror Yh

cyc: lmp r16,Y+
st X+,r16
CPI16 X,C_MsgTable
brlo cyc

(где CPI16 16-разрядное сравнение.)

Объясните, почему у меня это работает?

Сообщение отредактировал Maik-vs - Sep 21 2007, 08:27
Go to the top of the page
 
+Quote Post

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

 


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


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