Easyelectronics.ru

Электроника для всех
Текущее время: 26 фев 2021, 03:00

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: использование регистров
СообщениеДобавлено: 19 фев 2010, 23:23 
Только пришел

Зарегистрирован: 17 фев 2010, 16:14
Сообщения: 16
Решил перейти с Си на ассемблер, столкнулся с проблемой использования регистров. Есть ли какие-нибудь стандарты или рекомендации по использованию регистров, чтоб одни функции не мешали другим, при этом как можно меньше использовали стек?
Для некоторых инструкций вроде ldi недоступны регистры r0-r15. У них есть какое-то специальное назначение?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: использование регистров
СообщениеДобавлено: 19 фев 2010, 23:39 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:08
Сообщения: 7549
Откуда: Алма-ата
Disasm писал(а):
Решил перейти с Си на ассемблер, столкнулся с проблемой использования регистров. Есть ли какие-нибудь стандарты или рекомендации по использованию регистров, чтоб одни функции не мешали другим, при этом как можно меньше использовали стек?

Рекомендую попробовать поработать с PIC. Там все регистры равноправны, команды с ними работают одинаково, и в стек пихать и извлекать их не надо. Просто каждая функция может использовать свои. Мне, например, это нравится. Да и команд - то всего 33-35шт. Не нужно запоминать пару десятков команд, чтобы использовать одну из них для пересылки байта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: использование регистров
СообщениеДобавлено: 19 фев 2010, 23:59 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 12:39
Сообщения: 690
Откуда: г. Симферополь
<Для некоторых инструкций вроде ldi недоступны регистры r0-r15. У них есть какое-то специальное назначение?
Специального назначения нет, некоторые команды возвращают результат выполнения в R1:R0. Не надо хранить переменные в регистрах, для этого есть память. Начинаем процедуру (функцию) с загрузки в регистры переменных из ОЗУ, на выходе возвращаем значение, если это функция, из регистров в ОЗУ. Очень удобно передавать аргументы в функцию с помощью макросов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: использование регистров
СообщениеДобавлено: 20 фев 2010, 00:53 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 янв 2010, 19:29
Сообщения: 35
Несколько банков регистров на PIC это может и удобно для несложных микропрограмм, но как только алгоритм становится мало-мальски сложным начинаешь проклинать и жоска ограниченный хардверный стек, и напоминающее масадос структуру памяти в виде 'сегментов'. Плюс к тому, это приводит к дико неэффективному использованию памяти - вместо того, чтобы сохранить ровно те регистры, которые нужны, "сохраняются" абсолютно все.

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

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

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

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

А чем вообще не угодил C? Хочется для тинек программировать или просто 'не получается'? Всё-таки на C гораздо проще написать черновик программы, а в дальнейшем - оптимизировать узкие места, если вдруг упёрлись в них. Тем более, что в gcc имеется наимощнейшая система вставок на ассемблере, лучшая из всех компиляторов, которые я видел. Можно писать автоматически адаптирующиеся к окружающему коду вставки на ассемлере.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: использование регистров
СообщениеДобавлено: 20 фев 2010, 01:29 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:08
Сообщения: 7549
Откуда: Алма-ата
Цитата:
Плюс к тому, это приводит к дико неэффективному использованию памяти - вместо того, чтобы сохранить ровно те регистры, которые нужны, "сохраняются" абсолютно все.

Так там вообще нет разделение на ОЗУ и регистры. Все едино. Работаем со всеми одинаково. Потому ничего и сохранять не надо. И стек поэтому не нужен, а адрес возврата там сохраняется автоматически. И 8 уровней вложения - за глаза. Например, у меня в ходовом контроллере робота программа на MikroPascale Pro, используется вся периферия и прерывания, и всего только 4 уровня вложения получилось.
Цитата:
На AVR идеология программирования на асме ровно такая же, как на большинстве процессоров с не-Гарвардской архитектурой: во-первых, разделяем регистры на те, которые подпрограммы могут изменить и на те, которые подпрограммы изменить не могут (т.е. если они им таки понадобятся, подпрограмма обязана их сохранить и в конце восстановить).

А вот это вообще изврат: в контроллере с чисто Гарвардской архитектурой с разделением потоков команд и данных тащить наследие Фон Неймана с больших машин - выделение "регистров общего назначения", ОЗУ (которое по сути - те же регистры, на том же кристалле), да еще обращаться к разным адресам единого пространства разными командами, выполняющими одну и ту же функцию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: использование регистров
СообщениеДобавлено: 20 фев 2010, 02:06 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2010, 12:18
Сообщения: 1259
Откуда: Moscow
PIC - ещё больший изврат. Вы, сэр, непрерывно за него агитируете. Но

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

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

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

А разные команды АВРа для доступа в память - это тот-же банкинг, только с человеческим лицом (ошибиться невозможно), запихнутый в команду.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: использование регистров
СообщениеДобавлено: 20 фев 2010, 02:23 
Супермодератор
Аватара пользователя

Зарегистрирован: 28 янв 2010, 05:47
Сообщения: 1027
Откуда: Винница
8051 рулит. Не то, чтобы я так считаю, просто вношу свою лепту в наметившийся срач

_________________
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: использование регистров
СообщениеДобавлено: 20 фев 2010, 02:33 
Только пришел

Зарегистрирован: 17 фев 2010, 16:14
Сообщения: 16
zap писал(а):
В gcc распределение регистров следующее:

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

Спасибо! Что-то такое и хотел услышать.

zap писал(а):
А чем вообще не угодил C? Хочется для тинек программировать или просто 'не получается'? Всё-таки на C гораздо проще написать черновик программы, а в дальнейшем - оптимизировать узкие места, если вдруг упёрлись в них. Тем более, что в gcc имеется наимощнейшая система вставок на ассемблере, лучшая из всех компиляторов, которые я видел. Можно писать автоматически адаптирующиеся к окружающему коду вставки на ассемлере.

В общем-то С мне нравится, на ассемблере решил попрогать лишь для восполнения утерянных навыков.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: использование регистров
СообщениеДобавлено: 20 фев 2010, 03:10 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:08
Сообщения: 7549
Откуда: Алма-ата
Цитата:
- PIC - 2 регистра (W и FSR) остальное - память. С мелким отличием, что с памятью можно делать INC и DEC

Не забывайте, еще очень мощный набор битовых операций, которые в практике применения контроллеров часто важнее арифметики и здорово упрощают многие вещи. PIC может проверить или модифицировать бит любого регистра.
А регистр - аккумулятор в явном или неявном виде присутствует в любом контроллере. Куда уж без него... И у PIC есть хороший выбор, сохранять результат операции в W или регистре. Часто бывает очень удобно, и сокращает число пересылок.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: использование регистров
СообщениеДобавлено: 20 фев 2010, 09:37 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5600
Откуда: Уругвайская АССР
xrayman писал(а):
8051 рулит. Не то, чтобы я так считаю, просто вношу свою лепту в наметившийся срач
Что уж там, i80386 - рулит форэва. Это я к тому, что некорректно сравнивать RISС и CISС архитектуры.

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: использование регистров
СообщениеДобавлено: 20 фев 2010, 23:16 
Старожил

Зарегистрирован: 27 янв 2010, 12:28
Сообщения: 446
Откуда: Харьков
Тогда уж, для полноты картины - а какая разница, что за контроллер или проц, какая разница в архитектурах?
Как по мне, так должно быть глубоко все равно, что программировать. Главное - знать, что хочется получить и основные навыки программирования. А всё остальное - архитектура, языки, банки-склянки, регистры.... какая в... общем разница %)
Лучше выбирать что-то наиболее подходящее к конкретной задаче (периферия, частота, архитектура), затем - на чем писать. А спорить что лучше, что хуже.... Это надо рассматривать конкретную задачу, а не сраться о том, в какой цвет выкрасить гриву сферического коня в ваккууме ;)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB