Так почему бы не сделать глобальный подстанов по всему листингу?
Наверное потому, что это вызовет оверхед. Совершенно нет никакой необходимости ставить banksel в цикле, например. Достаточно перед циклом. Так же нет никакой необходимости это делать там, где в коде нет смены банков. Например при работе с массивом, который весь расположен в одном банке. Так также нет смысла переключать банк для регистров расположенных в банк-независимой области. Ну и много когда еще. Проще отключить варнинги этого типа и следить за кодом самому.
нет никакой необходимости ставить banksel в цикле, например. Достаточно перед циклом. Так же нет никакой необходимости это делать там, где в коде нет смены банков. Например при работе с массивом, который весь расположен в одном банке. Так также нет смысла переключать банк для регистров расположенных в банк-независимой области. Ну и много когда еще.
А компилятор об этом может знать?
А ещё лучше возложить это на автоматику, в век цифровых технологий. Конечно, оверхед, если лепить везде, а если с умом, то. Лишний проход компилятора, как минимум, я так понимаю. А может и без него. Однозначно ведь можно вычислить, где нужна смена банков?
Однозначно ведь можно вычислить, где нужна смена банков?
Нет, невозможно. В общем случае. Потому что код при исполнении может ветвиться и совершенно непонятно где он окажется. Это зависит от условий возникающих из анализа данных в коде.
То есть ассtмблер, видя, например, var1, не может понять, что это - или регистр в ОЗУ или вообще левая переменная?
Вы вообще понимаете о чем я вам пишу? Еще раз. Нет никакого смысла в автоматическом добавлении banksel, ибо это тупой оверхед. В подавляющем количестве случаев обращение к ОЗУ делается так, чтобы не нужно было переключать регистры. То есть работают с одним банком. А потом в другом месте кода один раз переключают и работают уже с другим. А разбирать код, предсказывая его работу, Ассемблер не умеет. Линейный код - это частный случай. Чаще всего код ветвится и необходимость banksel является условной. И вообще, если вам хочется забыть про банки, пишите на С.
То есть ассtмблер, видя, например, var1, не может понять
а если ты например, видишь movlw 0x05 ... то что это? адрес, константа? ассtмблер не должен что-то там "видеть", да ещё и домысливать/корректировать/добавлять, упаси его ... было бы довольно странно, если некая автоматика вмешивалась в это ... в том то и смысл асма - тупо заменять написанное (в простых к запоминанию нам словах) на соответствующие числовое представление.
Наверное как минимум в 90% случаях ответы на твои вопросы есть на одной из первых десяти страниц даташита. Я понимаю там, когда вопрос касается нюансов той или иной реализации, методов оптимизации, вариантов организации ... того что не отражено напрямую в документации, но тут то ... основы же.
movlw 0x05 будет однозначно определяться как загрузка константы 0x05 в регистр w Что дальше с теми данными будет делаться для этой операции безразлично. Другое дело операции, где подразумевается загрузка регистра ОЗУ/РСФ - там значение проверяется согласно информации из служебных файлов в составе проекта (для мпасма в мплабе).
Заголовок сообщения: Re: Вопросы начинающих PIC ASM
Добавлено: Чт июл 04, 2024 19:26:08
Нашел транзистор. Понюхал.
Карма: 3
Рейтинг сообщений: 21
Зарегистрирован: Чт ноя 26, 2015 23:22:35 Сообщений: 158 Откуда: не с Уфы
Рейтинг сообщения:0
Это мы в этом видим ту или иную однозначность а по факту эту запись тупо превратят в соответствующий опкод и поместят по соответствующему адресу, и всего то
тупо превратят в соответствующий опкод и поместят по соответствующему адресу, и всего то
А могли бы проявить чуть побольше чуткости и предсказательности))
Добавлено after 1 hour 26 minutes 56 seconds: Есть способ из W вычесть число, в частности единицу? В 648 decf W не работает. И даже регистр из W не вычесть, только наоборот. Вот так аккумулято... От 8 цикл до нуля, чтобы лишний вспомогательный регистр не заводить.
При обработке мпасмом используется еще и линкер и два файла описания ресурсов *.inc и *_g.lkr - вот там все базовые параметры для вармингов и отработки ошибок искать надо (* - имя соответствующего МК). Ежли по *.inc все достаточно понятно, то по*_g.lkr желательно у КРАМ данные поспрошать... Я ими только пользуюсь в том виде, что в IDE задан... Насчет вычитания и работ с W у стандартных среднемладших таки малость не так, как у других (то же касается и флага С при вычитании) - но ЭТО ПИКи... И никто не запрещает: inc W -- addlw .1 dec w -- addlw 0xff setb W.n -- iorlw 1<<n clr W.n -- andlw 0xff-(0xff&(1<<n)) Старая шпора для "быстрых воспоминаний":
Инкремент-то понятно, и биты, а вот вычитание - прямо магия! addlw 0xff на флаг Z как надо подействует? То есть при нуле он 1? Ну и для общего развития, что с флагами С && DC? Через С вычитает?
Заголовок сообщения: Re: Вопросы начинающих PIC ASM
Добавлено: Пт июл 05, 2024 09:46:39
Друг Кота
Карма: 2
Рейтинг сообщений: 21
Зарегистрирован: Вс сен 17, 2017 17:44:21 Сообщений: 4812 Откуда: 51.7727, 55.0988. Высота над морем 107 м. До границы 161 км.
Рейтинг сообщения:0
Так из W можно только вычитать единицу, большее число никак? Это всё конечно хорошо, а секретной команды деления на ноль нигде не описано?
А кто мешает математику вычитания отрицательного числа из положительного заменить на сложение положительного числа с отрицательным? Единственно что для однобайтовых ограничение диапазона от +127 до -127... У стандартных среднемладших команд поддержки умножения/деления нету. За исключением общего для практически всех МК умножения/деления на 2 (и степени двойки) сдвигами влево/вправо.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 90
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения