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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

организуй регист в котором на каждом шаге перемещай 1 по разрядам, затем с помощью лог. операци меняеш соответствующий разряд в регистре флагов.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

GP1 писал(а):организуй регист ... на каждом шаге перемещай 1 по разрядам, затем ...меняеш соответствующий разряд в регистре флагов.

Ну может и так.
Спасибо :))
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

найдеш решение лучше - поделись :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

GP1 писал(а):найдеш решение лучше - поделись :wink:

Найду - поделюсь. Не найду буду пользовать твое:)
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
dymon
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн сен 07, 2009 18:49:16

Сообщение dymon »

Как в ассемблерный код внедрить сишный код? Причем сишный код находится в другом файле. То что будет использоваться директива ".include" это понятно. AVRStudio вставит куда надо сишный код, но не понимает, что это язык Си и ругается мол "не знаю такую команду".
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

Их надо транслировать независимо (ассемблерный -- транслятором ассемблера, сишный -- транслятором Си), а потом собирать в единый выполняемый модуль компоновщиком. Детали не подскажу -- самому на AVR делать не приходилось.
dymon
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн сен 07, 2009 18:49:16

Сообщение dymon »

Было бы хорошо узнать подробности)
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

dymon писал(а):Как в ассемблерный код внедрить сишный код? ... То что будет использоваться директива ".include" это понятно.
Интересная техника и, судя по всему, совершенно недокументированная - где почитать об ассемблерах, компилирующих Си?
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

dymon писал(а):Было бы хорошо узнать подробности)


Читайте документацию, пробуйте... Проблема в том, что метода программирования, принятая на ПК, многих, так сказать, развратила. Например, любая интегрированная среда (Visual Studio, Delphi) позволяет ввести исходный текст программы на соответствующем языке (каком -- неважно) и получить на выходе готовый исполняемый файл (exe в случае Винды), при этом программисту не приходится задумываться, а как же этот файл был получен -- и многие в результате понятия не имеют, что же там происходит. Ну а на самом деле процесс, если не углубляться в детали, таков:

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

2) Каждый файл с исходным текстом транслируется с помощью соответствующего транслятора (Си, ассемблер, Паскаль -- в принципе, неважно). На выходе, если трансляция прошла успешно (не обнаружено ошибок), получаются так называемые объектные файлы -- т.е. машинный код программы, но ещё не готовый для немедленного исполнения.

3) С помощью компоновщика (редактора связей; по-буржуйски linkage editor или linker, почему на жаргоне его часто линкером кличут) все объектные файлы объединяются в один исполняемый файл.

Для того, чтобы компоновщик мог связать разные модули, необходимо объявления переменных и подпрограмм, которые должны быть видны не только в том модуле, где они объявлены, обозначить как глобальные или публичные (в разных языках разные средства для этого; на ассемблере обычно директива PUBLIC, GLOBAL или что-то в этом роде), ну а в тех модулях, где эти переменные и подпрограммы используются, но где они не объявлены, нужно указать имена этих переменных и подпрограмм в директиве EXTERN или подобной ей. Но как точно это делается применительно к AVR, я не знаю, поскольку никогда использовать эту возможность не приходилось (пишу исключительно на ассемблере, ну а скромные возможности этих однокристаллок не позволяют реализовать на них что-нибудь настолько крутое, что потребовало бы разделения программы на множество модулей).
Аватара пользователя
AndyWorld
Прорезались зубы
Сообщения: 209
Зарегистрирован: Вт сен 30, 2008 09:23:14
Откуда: Краснодарский край

Сообщение AndyWorld »

Добрый день! Такой вопрос: При вызове подпрограммы или при прерывании адрес того места где программа находилась помещается в стек. Мне нужно до момента выхода из подрограммы или прерывания поместить в стек еще 2 значения и извлечь их после выхода. Не помешает ли это возврату? Или после команды ret или reti из стека выхватится последнее значение?
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

очень часто при входе в ПП или прерывание приходится сохранять значения регистров для этого есть спец команды:
PUSH - сохранить в стеке, которая ОБЯЗАТЕЛЬНО должна иметь комплементарную команду POP - извлечь из стека перед выходом.
и стек будет в порядке :beer:

Просю пардону, не понял вопроса :oops:
можно сделать так:

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

pop temp0 ; извлекаем адрес возврата
pop temp1 ; если адрес возврата 2х байтовый

push x ; загружаем в стек данные
push y

push temp1 ; восстанавливаем адрес возврата
push temp0

ret (reti)
.
.
.
; после выхода указатель стека на Y
pop y
pop x

.


вроде так :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
AndyWorld
Прорезались зубы
Сообщения: 209
Зарегистрирован: Вт сен 30, 2008 09:23:14
Откуда: Краснодарский край

Сообщение AndyWorld »

Хммм. Так это понятно... Фишка в том, что я нахожусь в неком цикле в котором возникает прерывание таймера0, в нем же нюхаю кнопку по котрой я смогу вырваться из цикла и еще две кнопки которые задают значение таймеру (+,-). Так вот в какой момент сработает прерывание я не знаю. Поэтому и заморочился со стеком..))
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

методика решения мне не нравится ИМХО
я обычно в прерывании читаю PINx в какую-нибудь переменную, а уж в основной программе анализирую ее.
да и предложенный мной выше метод можно использовать только в ПП, т.е. где заранее известна точка входа и выхода.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
AndyWorld
Прорезались зубы
Сообщения: 209
Зарегистрирован: Вт сен 30, 2008 09:23:14
Откуда: Краснодарский край

Сообщение AndyWorld »

Да вот и я тоже думаю, что алгоритм у меня кривоват. Надо по другому все сделать.
Есть еще вопрос. У меня МЕга 16 и я использую rjmp и rcall. Все пока работает, видимо потому то я еще больше 8К программу не написал. Когда я перешагну этот предел придется переписывать на jmp и call?
Не пойму как происходит трансляция адресов при таком ветвлении.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

насчет call и jmp ты прав.
в командах rcall, rjmp прописывается 12 битный код смещения относительно РС, поэтому позволяют переходить на +-2048 адресов относительно текущего значения PC
а в командах call, jmp прописывается адрес вызова/перехода, т.е. тупо в PC грузится новый адрес и в путь.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
AndyWorld
Прорезались зубы
Сообщения: 209
Зарегистрирован: Вт сен 30, 2008 09:23:14
Откуда: Краснодарский край

Сообщение AndyWorld »

Мне нужно вывести на ЖК побитно содержимое порта или ячейки памяти. Как это сделать? Я имею ввиду считать каждый бит по отдельности. Для ЖК ясно, что к каждому биту я прибавлю $30 - и в путь.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

воспользуйся командами сдига через бит-СY
если CY=1 посылаеш на лсд 0х31, в противном случае 0х30
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
AndyWorld
Прорезались зубы
Сообщения: 209
Зарегистрирован: Вт сен 30, 2008 09:23:14
Откуда: Краснодарский край

Сообщение AndyWorld »

Я так понимаю, не важно в какую сторону мне двигать. Флаг переноса установится в любом направлении
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

lsr - двигает вправо
lsl - влево
какой выбереш, без разницы, главное обеспечить, чтобы на лсд ст.разряд был слева, а мл.разряд справа.
а то потом запутаешся :))
зы: но я бы двигал влево...
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
AndyWorld
Прорезались зубы
Сообщения: 209
Зарегистрирован: Вт сен 30, 2008 09:23:14
Откуда: Краснодарский край

Сообщение AndyWorld »

Я так понимаю, не важно в какую сторону мне двигать. Флаг переноса установится в любом направлении
Ответить

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