Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ptr128 »

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

Я же про то речь и веду, что если все тело функции на C будет состоять из одного оператора asm, то не только регистры автоматически будут сохранены, но и для нужд функции регистры можно выделить компилятором не задумываясь о том, какие из них использовать оптимальней.

Например:

Код: Выделить всё

static inline void st7735_spi_tft_read_cs_strobe(void)
{
  uint8_t counter, status;

  asm volatile ( ";                 \n\t \
  ldi   %[status],%[TX_Disable]     \n\t \
  sts   %[UCSRnB_addr], %[status]   \n\t \
  sbi   %[cs_port],%[cs_pin]        \n\t \
  ldi   %[counter], %[delay]  ;1    \n   \
WAIT_LOOP%=:                        \n\t \
  dec   %[counter]            ;1    \n\t \
  brne  WAIT_LOOP%=           ;1/2  \n\t \
  cbi   %[cs_port],%[cs_pin]  ;2    \n\t \
  ldi   %[status],%[TX_Enable]      \n\t \
  sts   %[UCSRnB_addr], %[status]   \n   \
  "
  : [counter] "=d" (counter), [status] "=d" (status)
  : [delay] "I" (_ST7735_SPI_RAMRD_DELAY_CYCLES_/3+1),
    [UCSRnB_addr] "M" (_ST7735_SPI_UCSRnB_ADDRESS_),
    [TX_Enable] "M" ((0<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(0<<RXEN0)|(1<<TXEN0)),
    [TX_Disable] "M" ((0<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(0<<RXEN0)|(0<<TXEN0)),
    [cs_port] "I" (PIN_TO_PORTn_OFFSET(ST7735_CHIPSELECT_PIN)),
    [cs_pin] "I" (PIN_TO_PINn_BIT(ST7735_CHIPSELECT_PIN))
  : "cc" );
}
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ptr128 »

ARV, понимаю. Сам не могу на офисных машинах с АКПП ездить. Особенно по трассе, когда обгоны. Но люди же как то ездят и даже на ручку отказываются пересаживаться? )))
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

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

стремление лететь впереди всех с возрастом проходит, и на первое место всплывает желание ехать как можно комфортнее. в итоге при выборе машины смортришь не на мощность движка и скоростные характеристики, а чтобы база подлиннее, кондей помощнее, автомат и сиденья помякше :)))

то же самое и с ассемблерными вставками: покуда они являются неизбежным злом, я с ними мирюсь. но как только можно обойтись без них - ни секунды не жду, а тут же отказываюсь от них. равно как и от модулей на ассемблере...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ptr128 »

Возраст - это не количество лет, а состояние души. Я полтинник уже разменял и великолепно себя чуствую на, вроде бы не комфортном, рамном пикапе L200 с ручкой )

А в моем примере надо было строб выдать длительностью в 350нс. Без ассемблера я что-то побоялся такое делать.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

С ума ты сходишь от Берлина,
Мне ж больше нравится Медынь.
Тебе, дружок, и горький хрен - малина,
А мне и бланманже полынь
© К.Прутков

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

Мой уютный бложик... заходите!
dimmer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение dimmer »

ptr128, Баба Яга это шутка, но видимо неудачная. У меня нет цели убедить всех, что мой размер обуви самый лучший.
ARV, спасибо за информацию, пойду познакомлюсь поближе...
trofim2
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение trofim2 »

Можно-ли посмотреть примеры макросов ENTER и LEAVE?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

trofim2 писал(а):Можно-ли посмотреть примеры макросов ENTER и LEAVE?
можно

Код: Выделить всё

.macro ENTER    arg:vararg // макрос имеет переменное число параметров
.set    selector, 0 // в этой переменной будем отмечать нужные регистры
   push   r0      // всегда сохраняем r0
   in     r0, _SFR_IO_ADDR(SREG) // извлекаем значение SREG
   push   r0      // сохраняем его в стеке
// тут надо перебрать аргументы и отметить их битами в selector
.set    i, 1
.irp    p, r1, r2, r3 ... r30, r31 // надо перечислить все регистры по порядку!!!
   .if p == \reg // если регистр совпадает с аргументом макроса
      .set    selector, selector | (1 << i) // сделаем отметку в нужном бите
   .endif
   .set    i, i+1 // и продолжим счет
.endr
// затем надо перебрать биты selector от МЛАДШЕГО к старшему и сохранить нужные регистры
.set    i, 1
.rept   31
   .ifne selector & (1<< i)
      push    i
   .endif
   .set    i, i+1
.endr
.endm

.macro LEAVE
.set    i, 31
.rept   31
   .ifne   (1<< i)
   // если бит в маске установлен - регистр извлекается из стека
   pop i
   .endif
   // перебор битов ведется в обратном порядке!!!
   .set    i, i - 1
.endr
// всегда восстанавливаем SREG и R0
   pop     r0
   out     _SFR_IO_ADDR(SREG), r0
   pop     r0
.endm
если вас интересует, как именно и почему созданы макросы, а так же желаете немного больше узнать о потенциальных возможностях макростроения GAS (GNU Assembler), могу порекомендовать мою статью, посвященную этому: А у нас в проектах GAS. А у вас?

P.S. давненько не брал я в руки шашек... при внимательном просмотре вышеописанного макроса ENTER я увидел 2 ошибки... так что макрос не сработает, по-моему. но можно исправить: не хватает еще одного irp reg, \arg для перебора передаваемых в аргументах регисторов ну и соответствующего endr тоже не хватает...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Z_h_e »

Интересненькая вещь.
ARV писал(а):P.S. давненько не брал я в руки шашек...
Вы это сразу дописали? Или я как обычно невнимательно пост прочитал? Тупил, тупил с параметром reg. Хотел вопрос дописать по нему, а Вас тут шашки. Тогда другой вопрос, а если дописать не так как Вы указали, а исправить if p == \reg на .if p == \arg ?

На сайте, что Вы указали .set selector, 0 находится вне макроса, что наверное ограничит макрос однократным применением.

Добавлено after 8 minutes 27 seconds:
А с LEAVE, вообще ничего не понял.
Selector же там должен участвовать и как pop i заменится на pop Rn.

Что-то здесь не так. Надо будет попробовать и добить макрос если что. Так то "индейка" :idea: замечательная.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ptr128 »

Если так хочется развитые макросы и препроцессор, то может проще тогда к Atmel Asm просто m4 прикрутить?
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Z_h_e »

Первое, что я могу сказать: ARV, Вы негодяй! :))) Вместо того, чтобы сладко спать, я до сего времени пытался запустить Ваш макрос. Запустил я его в нижеследующем тексте.
Спойлер

Код: Выделить всё

#define SREG   0x3f

.macro ENTER    arg:vararg // макрос имеет переменное число параметров
.set    selector, 0 // в этой переменной будем отмечать нужные регистры
   push   r0      // всегда сохраняем r0
   in     r0, SREG//_SFR_IO_ADDR(SREG) // извлекаем значение SREG
   push   r0      // сохраняем его в стеке
// тут надо перебрать аргументы и отметить их битами в selector

.irp    reg,\arg
.set    i, 1
.irp    p, r1, r2, r3,r4, r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30,r31 // надо перечислить все регистры по порядку!!!
   .if (\p == \reg) // если регистр совпадает с аргументом макроса
      .set    selector ,(selector | (1 << i)) // сделаем отметку в нужном бите
   .endif
   .set    i, i+1 // и продолжим счет
.endr
.endr

// затем надо перебрать биты selector от МЛАДШЕГО к старшему и сохранить нужные регистры
.set    i, 1
.irp    p, r1, r2, r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30,r31
   .ifne (selector & (1<< i))
      push    \p
   .endif
   .set    i, i+1
.endr



.endm
//----------
.macro LEAVE
.set    i, 31
.irp    p, r31, r30, r29,r28,r27,r26,r25,r24,r23,r22,r21,r20,r19,r18,r17,r16,r15,r14,r13,r12,r11,r10,r9,r8,r7,r6,r5,r4,r3,r2,r1
   .ifne   selector &(1<< i)
   // если бит в маске установлен - регистр извлекается из стека
   pop \p
   .endif
   // перебор битов ведется в обратном порядке!!!
   .set    i, i - 1
.endr
// всегда восстанавливаем SREG и R0
   pop     r0
   out     SREG, r0
   pop     r0
.endm
//****************************************************************************


Следующее что я хочу сказать.
1. Если создать проект в ассемблере, то эти директивы не работают. Именно при написании программы на ассеблере, часто приходится сохранять регистры в стек. Т.е. тут бы это макрос как нужен. Ну или я не знаю как сделать, чтобы заработали. :dont_know:
2. При написании программы на Си. Вряд ли часто нужно будет писать ассемблерные вставки, чтобы так страдать с написанием такого макроса. Не стоит по-моему тут день терять, чтобы за час долететь.
3. Данный макрос коварен. :) Если Вы напишите PUSH Я1, то компилятор выдаст ошибку, а если ENTER Я1, то компилятор это проглотит и регистр не будет сохранен. Так что тут проще вляпаться, чем перечислять ПушиПопы.

----------

У меня к Вам есть вопрос, ARV. Наверняка Вы знаете. Ну или к тому, кто знает. Как в проекте на Си, написать обработчик прерывания на ассме? Я имею ввиду не вставить в ISR. А написать полностью самому. Функции на ассме я делал, с передачей параметров через регистры. Т.е. надо написать подобную функцию, но чтобы как-то компилятор догадался установить на нее вектор. Спасибо.

З.Ы. Не очень в удачном месте задал этот вопрос, продублирую в правильной ветке.
Последний раз редактировалось Z_h_e Вт окт 25, 2016 22:51:22, всего редактировалось 2 раза.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ptr128 »

Z_h_e: Компилятор никогда не догадается, что на функцию надо установить какой-то вектор. Это Вы должны явно сделать сами. Либо явно записав указатель на функцию в таблицу векторов прерываний, либо воспользовавшись готовым макросом или функцией для установки этого вектора.
А компилятору достаточно только сообщить, что данная функция будет обработчиком прерывания. Вот так:
https://gcc.gnu.org/onlinedocs/gcc/AVR- ... butes.html
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Z_h_e »

По-моему это не то, что я имел ввиду. Но давайте это обсудим в правильном топике, говорю ж не в удачном месте задал, удалять конечно уже не буду.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

Z_h_e писал(а):Первое, что я могу сказать: ARV, Вы негодяй!
да, я такой. просто старею - память не та уже... хорошо хоть заметил ошибку и указал на нее, на сайте-то своем я так и не замечал до сих пор...

но главное - вы разобрались :)))

Добавлено after 9 minutes 38 seconds:
Z_h_e писал(а):Данный макрос коварен. Если Вы напишите PUSH Я1, то компилятор выдаст ошибку, а если ENTER Я1, то компилятор это проглотит и регистр не будет сохранен.
при наличии таких мощных макросов слабО сделать так, чтобы эта ситуация обрабатывалась? ;)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Z_h_e »

ARV писал(а):при наличии таких мощных макросов слабО сделать так
Так тут уже три дня надо будет потерять ))
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

Z_h_e писал(а):Так тут уже три дня надо будет потерять ))
лучше три дня потерять, зато потом за полчаса долететь! :)))

Добавлено after 2 minutes 52 seconds:
основная мысль, которую я хотел донести, познакомив всех с GNU-AS, заключается в том, что ассемблер - это язык программирования, а не только мнемоника машинных кодов. соответственно пользоваться им можно (и нужно) именно как языком, используя богатые (ну, относительно) возможности для написания программ.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Z_h_e »

К сожалению проект на асме не знает таких директив.

Добавлено after 2 minutes 11 seconds:
ARV писал(а):лучше три дня потерять, зато потом за полчаса долететь!
Зависимость то не линейная пошла :) и не в нашу пользу )).
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

Z_h_e писал(а):К сожалению проект на асме не знает таких директив.
что значит "проект на асме"? на том убогом асме, что позволяет AVR Studio? само собой, это очевидно. чтобы работать "с ассмом" по-нормальному, надо забыть про студию и ориентироваться на GCC.

чтобы создать проект "на ассме" вы должны создать файлик *.S, в котором описать глобальную метку main - вот и все! вместо таблицы векторов - глобальные метки. если кроме ассемблера исходников на Си не будет - это все, что вы должны сделать. и будет вам счастье.

но, я ранее писал, и это наиболее актуально:
ARV писал(а):avr-as предназначен (и наиболее удобен) именно как средство расширения проектов Си/С++, а не как средство разработки проектов на ассемблере целиком (хотя можно и это, разумеется).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ILYAUL »

У IAR неплохой asm . Позволяет делать локальные метки и главное понимает.
Ответить

Вернуться в «AVR»