Ассемблер (ASM) для AVR в вопросах и ответах
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
dymon писал(а):Было бы хорошо узнать подробности)
Читайте документацию, пробуйте... Проблема в том, что метода программирования, принятая на ПК, многих, так сказать, развратила. Например, любая интегрированная среда (Visual Studio, Delphi) позволяет ввести исходный текст программы на соответствующем языке (каком -- неважно) и получить на выходе готовый исполняемый файл (exe в случае Винды), при этом программисту не приходится задумываться, а как же этот файл был получен -- и многие в результате понятия не имеют, что же там происходит. Ну а на самом деле процесс, если не углубляться в детали, таков:
1) Создаются файлы с исходными текстами программы. В простом проекте, написанном на одном языке, файл обычно всего один, но в сложных их могут быть тысячи и больше, причём на разных языках.
2) Каждый файл с исходным текстом транслируется с помощью соответствующего транслятора (Си, ассемблер, Паскаль -- в принципе, неважно). На выходе, если трансляция прошла успешно (не обнаружено ошибок), получаются так называемые объектные файлы -- т.е. машинный код программы, но ещё не готовый для немедленного исполнения.
3) С помощью компоновщика (редактора связей; по-буржуйски linkage editor или linker, почему на жаргоне его часто линкером кличут) все объектные файлы объединяются в один исполняемый файл.
Для того, чтобы компоновщик мог связать разные модули, необходимо объявления переменных и подпрограмм, которые должны быть видны не только в том модуле, где они объявлены, обозначить как глобальные или публичные (в разных языках разные средства для этого; на ассемблере обычно директива PUBLIC, GLOBAL или что-то в этом роде), ну а в тех модулях, где эти переменные и подпрограммы используются, но где они не объявлены, нужно указать имена этих переменных и подпрограмм в директиве EXTERN или подобной ей. Но как точно это делается применительно к AVR, я не знаю, поскольку никогда использовать эту возможность не приходилось (пишу исключительно на ассемблере, ну а скромные возможности этих однокристаллок не позволяют реализовать на них что-нибудь настолько крутое, что потребовало бы разделения программы на множество модулей).
- AndyWorld
- Прорезались зубы
- Сообщения: 209
- Зарегистрирован: Вт сен 30, 2008 09:23:14
- Откуда: Краснодарский край
Добрый день! Такой вопрос: При вызове подпрограммы или при прерывании адрес того места где программа находилась помещается в стек. Мне нужно до момента выхода из подрограммы или прерывания поместить в стек еще 2 значения и извлечь их после выхода. Не помешает ли это возврату? Или после команды ret или reti из стека выхватится последнее значение?
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
очень часто при входе в ПП или прерывание приходится сохранять значения регистров для этого есть спец команды:
PUSH - сохранить в стеке, которая ОБЯЗАТЕЛЬНО должна иметь комплементарную команду POP - извлечь из стека перед выходом.
и стек будет в порядке
Просю пардону, не понял вопроса
можно сделать так:
вроде так
PUSH - сохранить в стеке, которая ОБЯЗАТЕЛЬНО должна иметь комплементарную команду POP - извлечь из стека перед выходом.
и стек будет в порядке
Просю пардону, не понял вопроса
можно сделать так:
Код: Выделить всё
pop temp0 ; извлекаем адрес возврата
pop temp1 ; если адрес возврата 2х байтовый
push x ; загружаем в стек данные
push y
push temp1 ; восстанавливаем адрес возврата
push temp0
ret (reti)
.
.
.
; после выхода указатель стека на Y
pop y
pop x
.вроде так
- AndyWorld
- Прорезались зубы
- Сообщения: 209
- Зарегистрирован: Вт сен 30, 2008 09:23:14
- Откуда: Краснодарский край
Хммм. Так это понятно... Фишка в том, что я нахожусь в неком цикле в котором возникает прерывание таймера0, в нем же нюхаю кнопку по котрой я смогу вырваться из цикла и еще две кнопки которые задают значение таймеру (+,-). Так вот в какой момент сработает прерывание я не знаю. Поэтому и заморочился со стеком..))
- AndyWorld
- Прорезались зубы
- Сообщения: 209
- Зарегистрирован: Вт сен 30, 2008 09:23:14
- Откуда: Краснодарский край
Да вот и я тоже думаю, что алгоритм у меня кривоват. Надо по другому все сделать.
Есть еще вопрос. У меня МЕга 16 и я использую rjmp и rcall. Все пока работает, видимо потому то я еще больше 8К программу не написал. Когда я перешагну этот предел придется переписывать на jmp и call?
Не пойму как происходит трансляция адресов при таком ветвлении.
Есть еще вопрос. У меня МЕга 16 и я использую rjmp и rcall. Все пока работает, видимо потому то я еще больше 8К программу не написал. Когда я перешагну этот предел придется переписывать на jmp и call?
Не пойму как происходит трансляция адресов при таком ветвлении.
