На то и стек - следить за содержимым надо в обязательном порядке.
А пересылку РСФ-регистр-память ОЗУ надо потом также и назад делать.
Что касательно SREG штука весьма избыточная (ибо надо также и указатель адреса хранить - то ли в явном виде как содержимое регистровой пары, то-ли в неявном в составе соответствующих команд).
Подбирается решение под конкретную программу с учетом всех за и против.
BOB51
Из выше изложенного, я мало чего понял (можно сказать вообще ничего)
1) "Сброс в ОЗУ для SREG это единственно возможный вариант "быстрого сохранения" (то ли командой IN/OUT, то ли через "отображение РСФ на память")" - РСФ это - регистр состояния флагов? != SREG?, и как понять "отображение РСФ на память"?
2) "Посему лучше создать область "теневого стека", которая при необходимости дублируется в штатном стеке" - что такое "теневой стек" - как он реализован?, еще и в штатном стеке?
3) "В тот "теневой стек" можно и иные регистры копипастить, а не только SREG - на то есть две вкусняшки - MOV r,r и MOW r,r" ("MOW r,r" -возможно очепятка?, имелось ввиду "MOVW r,r"?) - если "теневой стек" находится в SRAM-е (ОЗУ) - то каким боком "вкусняшки - mov(w) r,r" - это-же AVR - ?
РСФ - регистры специальных функций (порты, управление и прочие начиная с адреса 0x20 и до первых ячеек ОЗУ данных).
Они же (область РСФ) доступны также и как пространство ввода-вывода командами in и out.
К регистру управления можно обратится или как к УВВ (командами in и out) или как к области памяти командами работы с памятью LD/ST , но тогда к имени регистра добавляем 0x20 к примеру
in r16,portb = lds r16,(portb+0x20) /исправил
Как область памяти ОЗУ могут также адресоваться и регистры регистрового банка R0-R31.
Помимо того для регистров R0-R31 предусмотрены специальные скоростные пересылки регистр-регистр (mov r,r) и регистровая пара-регистровая пара (movw rp,rp), что весьма удобно при скоростном копировании блоков рабочих регистров.
Такой вариант - скоростное хранение выборочного количества данных и называется "теневым стеком" - правда само название позаимствовано у ПИКов - там это аппаратный модуль, работающий по прерываниям, но сам принцип ускоренного сохранения критических данных применим и в программной реализации для любого МК.
как пример...
в программе прерывания нужно сменить значение регистров-указателей, а затем восстановить.
Можно и через обычный стек, а можно и по иному (если есть запас "пустующих" регистров в младшей области регистрового файла)
movw r14,zl
movw r12,yl
movw r10,xl
собственно тело подпрограмы
movw xl,r10
movw yl,r12
movw zl,r14
ну и подобные операции в зависимости от расперделения ресурсов программы.
Последний раз редактировалось BOB51 Ср ноя 07, 2018 11:47:04, всего редактировалось 1 раз.
[uquote="BOB51",url="/forum/viewtopic.php?p=3499281#p3499281"]РСФ - регистры специальных функций (порты, управление и прочие начиная с адреса 0x20 и до первых ячеек ОЗУ данных).
Они же (область РСФ) доступны также и как пространство ввода-вывода командами in и out.
К регистру управления можно обратится или как к УВВ (командами in и out) или как к области памяти командами работы с памятью LD/ST , но тогда к имени регистра добавляем 0x20 к примеру
in r16,portb = ld r16,(portb+0x20)[/uquote]
Для команд IN OUT доступны адреса 0...0x3F. Адресное пространство ОЗУ у младшеньких AVR 0x60 или 0x100(0x200), которые постарше
Можно закоментировать в m8def.inc, а можно применить директиву .undef, но всё это не позволит пользоваться регистрами с XH по ZL.
Корректней использовать для своих целей другие регистры.
Добавлено after 3 minutes 55 seconds:
[uquote="akl",url="/forum/viewtopic.php?p=3525038#p3525038"]Это не ошибка, а предупреждение.[/uquote] Это предупреждение с точки зрения синтаксиса, но ошибка с точки зрения программирвания. ИМХО, варнинги нельзя игнорировать, я так когда-то делал и зря .
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Не получится...
Для регистров только через undef...
Другое дело, ежли регистр как ячейка памяти....
Однако проверять надо, и это несколько иной тип обращения, нежли к регистру должен будет применяться.
Что-то тут не так. 9RIK то не выложил код где он r26 переопределяет и я предположу, что он наверное перепутал местами левый и правый операнды директивы.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Не проходит.
Это ж не ячейка памяти, а регистр.
У них несколько иной смысл для дефайна.
Более оптимально заранее подготовить модель регистров и дальше в проекте уже ею руководствоваться.
С присвонеием имен ячейкам ОЗУ значительно проще. Хотя и там могут иметься неприятности.
Да делов-то... игнорируй это предупреждение. Всё будет хорошо, если ты не пользуешься регистрами X,Y,Z ведь ты можешь ненароком попортить указатели если они где-то используются глобально обращаясь к своим переменным... Лучше, конечно, этого не делать.
Можно убрать или сделать .undef для этих регистров, чтобы не ругалось, но тогда НЕЛЬЗЯ БУДЕТ обращаться к индексным регистрам - вы попортите свои переменные. Если у вас в программе не задействованы индексные регистры глобально - можно убрать соответствующие определения, а если используется временно и только по месту, то перед использованием обязательно сделать PUSH для пары регистров, а по окончанию POP чтобы не портить свои переменные.
Привет знатокам ассемблера.
Нигде не нашел, но может все таки что и пропустил: нужна директива препроцессора позволяющая вставить в программу группу строк n раз.
Сейчас необходимо для разработки шаблона программ быстрого умножения/деления больших чисел. Проблема там в том, что при организации циклом очень большие накладные расходы на сохранение флага C (он используется в многобайтных ADC, SBC, CPC, ROL/ROR и т.д., но при этом портится в DEC), поэтому перед DEC его нужно куда то сохранять, а после - восстанавливать.
Поэтому пришел к мысли развернуть циклы - и время сэкономлю и от геморроя избавлюсь. Но затруднился с автоматизацией разворачивания (пока сделал 8 операций умножения для вариантов {1-8} байт на оператор), хочется написать что нибудь вроде
.macro zzz
LD R1,X
ROL R1
ST X+,R1
.endm
.cycle zzz(5)
чтобы сгенерить сдвиг для пяти байт.
Кто нибудь может подсказать: возможно ли такое?
Спасибо.
средствами avr-assembler из "студии" от Atmel такое невозможно.
а вот средствами GNU AS - легко, вот небольшая моя статья об этом: https://simple-devices.ru/articles/7-so ... ler-reviev (правда, по ссылке поменялся движок сайта и врезки кода стали уродскими... я не виноват)
работать с этим ассемблером посложнее будет, чем со "студийным"
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Угу, спасибо.
Вдогонку:
WinAVR это интегрированная среда разработки со своими отладчиком, симуляторами и т.д.?
Или после препроцессинга результат грузится в студию и допиливается там? Просто никогда дела с ним не имел.