Ассемблер (ASM) для AVR в вопросах и ответах
организуй регист в котором на каждом шаге перемещай 1 по разрядам, затем с помощью лог. операци меняеш соответствующий разряд в регистре флагов.
- Реклама
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Ну может и так.GP1 писал(а):организуй регист ... на каждом шаге перемещай 1 по разрядам, затем ...меняеш соответствующий разряд в регистре флагов.
Спасибо
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
найдеш решение лучше - поделись 
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Найду - поделюсь. Не найду буду пользовать твое:)GP1 писал(а):найдеш решение лучше - поделись
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- Сообщения: 24
- Зарегистрирован: Пн сен 07, 2009 18:49:16
- Реклама
- Сообщения: 24
- Зарегистрирован: Пн сен 07, 2009 18:49:16
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Читайте документацию, пробуйте... Проблема в том, что метода программирования, принятая на ПК, многих, так сказать, развратила. Например, любая интегрированная среда (Visual Studio, Delphi) позволяет ввести исходный текст программы на соответствующем языке (каком -- неважно) и получить на выходе готовый исполняемый файл (exe в случае Винды), при этом программисту не приходится задумываться, а как же этот файл был получен -- и многие в результате понятия не имеют, что же там происходит. Ну а на самом деле процесс, если не углубляться в детали, таков:dymon писал(а):Было бы хорошо узнать подробности)
1) Создаются файлы с исходными текстами программы. В простом проекте, написанном на одном языке, файл обычно всего один, но в сложных их могут быть тысячи и больше, причём на разных языках.
2) Каждый файл с исходным текстом транслируется с помощью соответствующего транслятора (Си, ассемблер, Паскаль -- в принципе, неважно). На выходе, если трансляция прошла успешно (не обнаружено ошибок), получаются так называемые объектные файлы -- т.е. машинный код программы, но ещё не готовый для немедленного исполнения.
3) С помощью компоновщика (редактора связей; по-буржуйски linkage editor или linker, почему на жаргоне его часто линкером кличут) все объектные файлы объединяются в один исполняемый файл.
Для того, чтобы компоновщик мог связать разные модули, необходимо объявления переменных и подпрограмм, которые должны быть видны не только в том модуле, где они объявлены, обозначить как глобальные или публичные (в разных языках разные средства для этого; на ассемблере обычно директива PUBLIC, GLOBAL или что-то в этом роде), ну а в тех модулях, где эти переменные и подпрограммы используются, но где они не объявлены, нужно указать имена этих переменных и подпрограмм в директиве EXTERN или подобной ей. Но как точно это делается применительно к AVR, я не знаю, поскольку никогда использовать эту возможность не приходилось (пишу исключительно на ассемблере, ну а скромные возможности этих однокристаллок не позволяют реализовать на них что-нибудь настолько крутое, что потребовало бы разделения программы на множество модулей).
Добрый день! Такой вопрос: При вызове подпрограммы или при прерывании адрес того места где программа находилась помещается в стек. Мне нужно до момента выхода из подрограммы или прерывания поместить в стек еще 2 значения и извлечь их после выхода. Не помешает ли это возврату? Или после команды ret или reti из стека выхватится последнее значение?
очень часто при входе в ПП или прерывание приходится сохранять значения регистров для этого есть спец команды:
PUSH - сохранить в стеке, которая ОБЯЗАТЕЛЬНО должна иметь комплементарную команду POP - извлечь из стека перед выходом.
и стек будет в порядке
Просю пардону, не понял вопроса
можно сделать так:
вроде так 
PUSH - сохранить в стеке, которая ОБЯЗАТЕЛЬНО должна иметь комплементарную команду POP - извлечь из стека перед выходом.
и стек будет в порядке
Просю пардону, не понял вопроса
можно сделать так:
Код: Выделить всё
pop temp0 ; извлекаем адрес возврата
pop temp1 ; если адрес возврата 2х байтовый
push x ; загружаем в стек данные
push y
push temp1 ; восстанавливаем адрес возврата
push temp0
ret (reti)
.
.
.
; после выхода указатель стека на Y
pop y
pop x
.Хммм. Так это понятно... Фишка в том, что я нахожусь в неком цикле в котором возникает прерывание таймера0, в нем же нюхаю кнопку по котрой я смогу вырваться из цикла и еще две кнопки которые задают значение таймеру (+,-). Так вот в какой момент сработает прерывание я не знаю. Поэтому и заморочился со стеком..))
методика решения мне не нравится ИМХО
я обычно в прерывании читаю PINx в какую-нибудь переменную, а уж в основной программе анализирую ее.
да и предложенный мной выше метод можно использовать только в ПП, т.е. где заранее известна точка входа и выхода.
я обычно в прерывании читаю PINx в какую-нибудь переменную, а уж в основной программе анализирую ее.
да и предложенный мной выше метод можно использовать только в ПП, т.е. где заранее известна точка входа и выхода.
Да вот и я тоже думаю, что алгоритм у меня кривоват. Надо по другому все сделать.
Есть еще вопрос. У меня МЕга 16 и я использую rjmp и rcall. Все пока работает, видимо потому то я еще больше 8К программу не написал. Когда я перешагну этот предел придется переписывать на jmp и call?
Не пойму как происходит трансляция адресов при таком ветвлении.
Есть еще вопрос. У меня МЕга 16 и я использую rjmp и rcall. Все пока работает, видимо потому то я еще больше 8К программу не написал. Когда я перешагну этот предел придется переписывать на jmp и call?
Не пойму как происходит трансляция адресов при таком ветвлении.
насчет call и jmp ты прав.
в командах rcall, rjmp прописывается 12 битный код смещения относительно РС, поэтому позволяют переходить на +-2048 адресов относительно текущего значения PC
а в командах call, jmp прописывается адрес вызова/перехода, т.е. тупо в PC грузится новый адрес и в путь.
в командах rcall, rjmp прописывается 12 битный код смещения относительно РС, поэтому позволяют переходить на +-2048 адресов относительно текущего значения PC
а в командах call, jmp прописывается адрес вызова/перехода, т.е. тупо в PC грузится новый адрес и в путь.
воспользуйся командами сдига через бит-СY
если CY=1 посылаеш на лсд 0х31, в противном случае 0х30
если CY=1 посылаеш на лсд 0х31, в противном случае 0х30
lsr - двигает вправо
lsl - влево
какой выбереш, без разницы, главное обеспечить, чтобы на лсд ст.разряд был слева, а мл.разряд справа.
а то потом запутаешся
зы: но я бы двигал влево...
lsl - влево
какой выбереш, без разницы, главное обеспечить, чтобы на лсд ст.разряд был слева, а мл.разряд справа.
а то потом запутаешся
зы: но я бы двигал влево...



