Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/49: Рейтинг темы: голосов - 49, средняя оценка - 4.92
Dysosm
0 / 0 / 0
Регистрация: 15.02.2010
Сообщений: 16
1

использование регистров

18.02.2010, 22:36. Просмотров 9043. Ответов 10
Метки нет (Все метки)

Решил перейти с Си на ассемблер, столкнулся с проблемой использования регистров. Есть ли какие-нибудь стандарты или рекомендации по использованию регистров, чтоб одни функции не мешали другим, при этом как можно меньше использовали стек?
Для некоторых инструкций вроде ldi недоступны регистры r0-r15. У них есть какое-то специальное назначение?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2010, 22:36
Ответы с готовыми решениями:

Сложить содержание регистров R1 и R4 текущего банка регистров и отразить результат на статическом индикаторе
Сложить содержание регистров R1 и R4 текущего банка регистров и отразить результат на статическом...

Вывод двух регистров
Если нужно записать число 125 в регистр r5, то записав туда младший бит а в r21 старший, как...

ADuC842. Сравнение содержимого регистров
Ребят как сравнить содержимое регистров? Например R5 и R7? И если равны отправить в ОЗУ

Сравнение двух регистров (PIC16F877A)
Как сделать сравнение двух регистров и выбрать наименьший. Tо есть если к примеру значение регистра...

Семисегментный индикатор с применением сдвиговых регистров
Создал часы,работают,но есть проблема(каждую перерисовку моргают все индикаторы).Те что не должны...

10
swk
0 / 0 / 0
Регистрация: 22.10.2015
18.02.2010, 22:52 2
Цитата Сообщение от Dysasm
Решил перейти с Си на ассемблер, столкнулся с проблемой использования регистров. Есть ли какие-нибудь стандарты или рекомендации по использованию регистров, чтоб одни функции не мешали другим, при этом как можно меньше использовали стек?
Рекомендую попробовать поработать с PIC. Там все регистры равноправны, команды с ними работают одинаково, и в стек пихать и извлекать их не надо. Просто каждая функция может использовать свои. Мне, например, это нравится. Да и команд - то всего 33-35шт. Не нужно запоминать пару десятков команд, чтобы использовать одну из них для пересылки байта.
0
Otikro
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 442
18.02.2010, 23:12 3
<Для некоторых инструкций вроде ldi недоступны регистры r0-r15. У них есть какое-то специальное назначение?
Специального назначения нет, некоторые команды возвращают результат выполнения в R1:R0. Не надо хранить переменные в регистрах, для этого есть память. Начинаем процедуру (функцию) с загрузки в регистры переменных из ОЗУ, на выходе возвращаем значение, если это функция, из регистров в ОЗУ. Очень удобно передавать аргументы в функцию с помощью макросов.
0
zop
0 / 0 / 0
Регистрация: 03.05.2015
19.02.2010, 00:06 4
Несколько банков регистров на PIC это может и удобно для несложных микропрограмм, но как только алгоритм становится мало-мальски сложным начинаешь проклинать и жоска ограниченный хардверный стек, и напоминающее масадос структуру памяти в виде сегментов. Плюс к тому, это приводит к дико неэффективному использованию памяти - вместо того, чтобы сохранить ровно те регистры, которые нужны, "сохраняются" абсолютно все.

На AVR идеология программирования на асме ровно такая же, как на большинстве процессоров с не-Гарвардской архитектурой: во-первых, разделяем регистры на те, которые подпрограммы могут изменить и на те, которые подпрограммы изменить не могут (т.е. если они им таки понадобятся, подпрограмма обязана их сохранить и в конце восстановить).

В gcc распределение регистров следующее:

r0 - временный регистр для всякой фигни
r1 - всегда равен нулю (так проще компилятору)
r2-r17,r28,r29 - сохраняются подпрограммами
остальные - можно портить в подпрограммах, вызывающий код не расчитывает на сохранение их значений после вызова любой подпрограммы.

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

А чем вообще не угодил C? Хочется для тинек программировать или просто не получается? Всё-таки на C гораздо проще написать черновик программы, а в дальнейшем - оптимизировать узкие места, если вдруг упёрлись в них. Тем более, что в gcc имеется наимощнейшая система вставок на ассемблере, лучшая из всех компиляторов, которые я видел. Можно писать автоматически адаптирующиеся к окружающему коду вставки на ассемлере.
0
19.02.2010, 00:06
swk
0 / 0 / 0
Регистрация: 22.10.2015
19.02.2010, 00:42 5
Плюс к тому, это приводит к дико неэффективному использованию памяти - вместо того, чтобы сохранить ровно те регистры, которые нужны, "сохраняются" абсолютно все.
Так там вообще нет разделение на ОЗУ и регистры. Все едино. Работаем со всеми одинаково. Потому ничего и сохранять не надо. И стек поэтому не нужен, а адрес возврата там сохраняется автоматически. И 8 уровней вложения - за глаза. Например, у меня в ходовом контроллере робота программа на MikroPascale Pro, используется вся периферия и прерывания, и всего только 4 уровня вложения получилось.
На AVR идеология программирования на асме ровно такая же, как на большинстве процессоров с не-Гарвардской архитектурой: во-первых, разделяем регистры на те, которые подпрограммы могут изменить и на те, которые подпрограммы изменить не могут (т.е. если они им таки понадобятся, подпрограмма обязана их сохранить и в конце восстановить).
А вот это вообще изврат: в контроллере с чисто Гарвардской архитектурой с разделением потоков команд и данных тащить наследие Фон Неймана с больших машин - выделение "регистров общего назначения", ОЗУ (которое по сути - те же регистры, на том же кристалле), да еще обращаться к разным адресам единого пространства разными командами, выполняющими одну и ту же функцию.
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
19.02.2010, 01:19 6
PIC - ещё больший изврат. Вы, сэр, непрерывно за него агитируете. Но

- арифметика только с W
- банки. Привыкнуть можно, пользоваться в сложной программе...
- 1 индексный регистр
- доступ к памяти программ...

А ненужность стека... Хм. А рекурсивные процедуры?

Если уж проводить аналогии
- PIC - 2 регистра (W и FSR) остальное - память. С мелким отличием, что с памятью можно делать INC и DEC
- AVR - 32 регистра (правда не все равнозначные, но 16 старших легко приравнять по функционалу к W, а 3 пары - к FSR но с декрементом и инкрементом) и память.

А разные команды АВРа для доступа в память - это тот-же банкинг, только с человеческим лицом (ошибиться невозможно), запихнутый в команду.
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
19.02.2010, 01:36 7
8051 рулит. Не то, чтобы я так считаю, просто вношу свою лепту в наметившийся срач
0
Dysosm
0 / 0 / 0
Регистрация: 15.02.2010
Сообщений: 16
19.02.2010, 01:46 8
Цитата Сообщение от zop
В gcc распределение регистров следующее:

r0 - временный регистр для всякой фигни
r1 - всегда равен нулю (так проще компилятору)
r2-r17,r28,r29 - сохраняются подпрограммами
остальные - можно портить в подпрограммах, вызывающий код не расчитывает на сохранение их значений после вызова любой подпрограммы.
Спасибо! Что-то такое и хотел услышать.

Цитата Сообщение от zop
А чем вообще не угодил C? Хочется для тинек программировать или просто не получается? Всё-таки на C гораздо проще написать черновик программы, а в дальнейшем - оптимизировать узкие места, если вдруг упёрлись в них. Тем более, что в gcc имеется наимощнейшая система вставок на ассемблере, лучшая из всех компиляторов, которые я видел. Можно писать автоматически адаптирующиеся к окружающему коду вставки на ассемлере.
В общем-то С мне нравится, на ассемблере решил попрогать лишь для восполнения утерянных навыков.
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
19.02.2010, 02:23 9
- PIC - 2 регистра (W и FSR) остальное - память. С мелким отличием, что с памятью можно делать INC и DEC
Не забывайте, еще очень мощный набор битовых операций, которые в практике применения контроллеров часто важнее арифметики и здорово упрощают многие вещи. PIC может проверить или модифицировать бит любого регистра.
А регистр - аккумулятор в явном или неявном виде присутствует в любом контроллере. Куда уж без него... И у PIC есть хороший выбор, сохранять результат операции в W или регистре. Часто бывает очень удобно, и сокращает число пересылок.
0
Гарнист
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
19.02.2010, 08:50 10
Цитата Сообщение от xroymom
8051 рулит. Не то, чтобы я так считаю, просто вношу свою лепту в наметившийся срач
Что уж там, i80386 - рулит форэва. Это я к тому, что некорректно сравнивать RISС и CISС архитектуры.
0
Vid_kh
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 297
19.02.2010, 22:29 11
Тогда уж, для полноты картины - а какая разница, что за контроллер или проц, какая разница в архитектурах?
Как по мне, так должно быть глубоко все равно, что программировать. Главное - знать, что хочется получить и основные навыки программирования. А всё остальное - архитектура, языки, банки-склянки, регистры.... какая в... общем разница %)
Лучше выбирать что-то наиболее подходящее к конкретной задаче (периферия, частота, архитектура), затем - на чем писать. А спорить что лучше, что хуже.... Это надо рассматривать конкретную задачу, а не сраться о том, в какой цвет выкрасить гриву сферического коня в ваккууме ;)
0
19.02.2010, 22:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2010, 22:29

Очистка регистров и ОЗУ при инициализации
Доброго дня. Неоднократно встречал в примерах код чистящий регистры и ОЗУ после сброса. Вопрос...

Отключение выгрузки регистров в стек (CVAVR)
Камень: atmega88pa Компилятор: CVAVR Главная часть проекта - 8-канальный аппаратно-программный...

Иерархия регистров и битов для периферии
Можно ли сделать так сказать своеобразную табличку или блок схему где обозначит все общие названия...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru