Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: "asm" в GCC  (Прочитано 31028 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« : 22-09-2006 11:59 » 

Требуется написать макрос для загрузки 16-битного значения в регистры r26:r27.
Для 8-битного, проблем нет. Делаю так:
Код:
#define load_val(val)         \
    {                           \
        __asm__ __volatile__    \
        (                       \
            "ldi r26,%0 \n\t"   \
            : "M" (val)         \
        );                      \
    }

Думал, что для 16 такое прокатит:
Код:
#define load_val(val)         \
    {                           \
        __asm__ __volatile__    \
        (                       \
            "ldi r26,%A0 \n\t"  \
            "ldi r27,%B0 \n\t"  \
            : "M" (val)         \
        );                      \
    }

оказалось ошибаюсь.

Кто знает, подскажите как быть, а то уже крыша начинает съезжать.  С ума сойти...
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 25-09-2006 05:15 » 

Проблему решил следующим способом:
Код:
#define load_val(val)                              \
    {                                              \
        __asm__ __volatile__                       \
        (                                          \
            "ldi r26,%0 \n\t"                      \
            "ldi r27,%1 \n\t"                      \
            :: "M" ((uint8_t)((uint16_t)(val))),   \
               "M" ((uint8_t)((uint16_t)(val)>>8)) \
        );                                         \
    }
Теперь такое работает без проблем:
Код:
load_val(0x2345);
Записан
Daniloff
Помогающий

ru
Offline Offline

« Ответ #2 : 28-01-2007 17:14 » 

а что за асм такой?! Уж больно на AVR-овский смахивает... Улыбаюсь
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 28-01-2007 17:31 » 

Daniloff, а может ты для AVR использовал GCC?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Daniloff
Помогающий

ru
Offline Offline

« Ответ #4 : 28-01-2007 18:32 » 

а разве он не используется? Улыбаюсь
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 29-01-2007 04:56 » 

Daniloff, Ты прав, это ассемблер именно для AVR.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 29-01-2007 06:45 » 

Daniloff, я торможу Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Daniloff
Помогающий

ru
Offline Offline

« Ответ #7 : 30-01-2007 13:56 » 

Serg79, я под AVR пишу на асме, и подобных заморочек практически не возникает Улыбаюсь
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 31-01-2007 04:49 » 

Serg79, я под AVR пишу на асме, и подобных заморочек практически не возникает Улыбаюсь
Зачем писать на 'asm'-е когда язык 'C' есть? Улыбаюсь
« Последнее редактирование: 15-12-2007 18:44 от Алексей1153++ » Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #9 : 31-01-2007 05:15 » 

некоторые конструкции именно на астме легче реализовать чем на С
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 31-01-2007 05:24 » 

некоторые конструкции именно на астме легче реализовать чем на С
Например?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 31-01-2007 06:21 » 

Serg79, в С нет понятия флага переноса и закольцованного сдвига - при битовых манипуляциях иногда нужено. Ну, и критичные по времени алгоритмы порой можно на асме лучше написать, с учетом архитектурных особенностей процессора.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #12 : 31-01-2007 08:30 » new

кусок кода реализации я сейчас не приведу, но вот недавний случай. Есть такая программа CodeVision AVR, так вот в ней пишется код на С а в программе Win AVR эмулируется работа процессора и в ней же можно писать на asm, несколько дней назад у моего коллеги получалось так что CodeVision AVR компилировал исходник на С и в результате функции начинали выполняться не в своей очередности. Помучавшись с тим делом он плюнул и написал на asm в Win AVR.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Daniloff
Помогающий

ru
Offline Offline

« Ответ #13 : 31-01-2007 12:13 » 

Я люблю экономить байты.
Например, процедуру подсчета CRC16 впихнул в 9 слов.
И бит Т на С тяжело использовать, а он дюже экономить помогает! Улыбаюсь
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 01-02-2007 06:38 » 

Для последнего проекта который мы здали использовался контроллер atMega64. Чтобы было понятно, контроллер используется для связи с устройством по RS-232 и выполняет функции управления модулями устройства а также контролирует электрические параметры в контрольных точках узлов. Контроллер активно использует свои внутренние модули: ADC, USART, SPI, таймера и конечно же порты ввода/вывода.
Весь программный код на 'C' составил 3651 строку (где то 1/4 из кода составляют коментарии). Это не счетая еще функций и заголовочных файлов из библиотеки языка 'C'. Я не представляю сколько времени мне потребовалось на все это, если бы надо было писать все на 'asm', а потом бы еще встал вопрос все это тестировать, была бы полная жо...
Хочу заметить, что эти 3651 строчки заняли всего 9164 байта (14.0%) flash и 107 байт (2.6%) ОЗУ. Daniloff, а ты говоришь "Я люблю экономить байты", уж кто кто а компилятор умеет экономить байты. Когда меня спрашивают - "Как научиться хорошо писать на ассемблере?", я всегда отвечаю - "Лучший учитель это - компилятор языка 'C'".
Хотя от всего кода, где то 0.2% написано на 'asm' (это код тестирования АЛУ и ОЗУ вовремя простоя программы между запросами), я прежде чем что то писать на 'asm' смотрю как это же самое напишет компилятор и уже после него можно чтото подправить или оставить все так как он сделал.

McZim, ты наверно имел ввиду не Win AVR а AVR Studio. К CodeVision AVR я вообще серьезно не отношусь и им у нас не пользуються. Весь код у нас пишется в WinAVR это компилятор GCC для AVR, а погонять некие куски кода можно действительно в эмуляторе AVR Studio. Она также предназначена для написания кода на 'asm'.

RXL, на счет проверки флага ты не прав. Вот код проверяющий флаг переноса " SREG & (1<<SREG_C) " а компилятор сгенерит одно из двух: brcs или brcc взависимости от того что нужно сделать.

Если уж действительно надо какой то кусочек написать на 'asm', то я использую синтаксис предоставляемый GCC.
« Последнее редактирование: 15-12-2007 18:44 от Алексей1153++ » Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #15 : 01-02-2007 07:05 » 

Serg79, да AVR Studio.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 01-02-2007 07:42 » 

RXL, на счет проверки флага ты не прав. Вот код проверяющий флаг переноса " SREG & (1<<SREG_C) " а компилятор сгенерит одно из двух: brcs или brcc взависимости от того что нужно сделать.

Согласись, - это извращение. Попробуй нечто вроде написать для x86.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 01-02-2007 08:37 » 

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

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

Интересные данные по использованию машиннозависимых инструкций (ассемблера) от всего кода ядра в 4.4BSD, приведены в данной статье: http://www.freebsd.org.ua/doc/ru_RU.KOI8-R/books/design-44bsd/book.html#OVERVIEW-KERNEL-ORGANIZATION
Записан
Daniloff
Помогающий

ru
Offline Offline

« Ответ #18 : 03-02-2007 11:09 » 

Serg79, вот ты хвалишься, что код занял 9164 байт. А почему бы тогда не поставить мегу-16? Улыбаюсь
Мне дорогие камни не по карману, а потому пишу преимущественно под 1-2К кода.
А под такой камень тоже бы Си взял, или бейсик, или АлгоритмБилдер...

P.S. А ADC-то каким образом задействован? Просто интересно...
« Последнее редактирование: 03-02-2007 12:30 от Daniloff » Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 05-02-2007 10:26 » 

Serg79, вот ты хвалишься, что код занял 9164 байт. А почему бы тогда не поставить мегу-16? Улыбаюсь
Какой кристал был в перечне на изделие такой и поставили.

Как Ты не поймешь, если ты пишешь для себя, то ты можешь писать на чем угодно и как угодно, нет никакой разницы как и какой код мигает светодиодами на твоем слепыше.
А если после Тебя этот код еще через несколько рук должен пройти или в будушем понадобиться его портировать на другой кристал или даже друго тип МК, то о ассемблере не может идти даже речи.
Если тебе приходиться все таки использовать в каких то местах ассемблер, то Ты на эти пять строчек ассемблерного кода пол листа инфы (что, как, зачем это нужно...) напишешь.  Да-да
Записан
Daniloff
Помогающий

ru
Offline Offline

« Ответ #20 : 08-02-2007 08:58 » 

Тогда вопрос не по протоколу: где этот GCC скачать можно? Улыбаюсь
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 08-02-2007 09:11 » 

Тогда вопрос не по протоколу: где этот GCC скачать можно? Улыбаюсь
Смотри на http://winavr.sourceforge.net
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines