Прежде чем задавать "странные", мягко говоря, вопросы, изучите архитектуру МК. Книга Вольфганг Трамперт AVR-RISC микроконтроллеры фирмы ATMEL. Во-первых сами разберетесь, и не будете доставать на форумах людей своими глупыми вопросами. Повторяю еще раз. Флаги SREG выставляются после каждой команды-операции над регистрами.
subi r16, 15 // В SREG будет результат операции над регистром r16. Что здесь непонятного?!
А как эти флаги выставляются аппаратно, нужно изучать схемотехнику цифровых устройств. Гуглите АЛУ. Там будут схемы и вы примерно будете представлять, как выставляются флаги SREG.
Все, отстаньте с глупыми вопросами, пока не прочитаете книгу, которую я вам назвал.
SatinS писал(а):как происходит механизм запоминания, к какому именно регистру относится флаг, и сколько регистров с флагами можно обрабатывать
Статусный регистр один. Механизма "привязки" в АЛУ никакого нет .
Флаги в статусном регистре относятся к последней выполненной команде, которая их (флаги) меняла. Всё.
Дальше можно логически получать разные следствия из предыдущего утверждения. Например, что флаги относятся к тем регистрам общего назначения, над которыми выполнялась та последняя команда, которая меняла соответствующие флаги.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Есть вот команды sbrc и cbrc которые проверяют n бит байта, sbrc r16, n. То есть работают с константой, а как мне сделать чтобы n задавать в программе, допустим инкрементировать ее ? Например я хочу проверить каждый бит байта.
Учтите, вы должны проверять значение номера бита на выход за предел 7 (0-7 биты). И учитывайте, что машинный счет начинается с нуля. То есть, декрементируйте номер бита. То есть, если нам нужно проверить 1 бит, то индекс должен быть 0.
Последний раз редактировалось Demiurg Вс апр 24, 2016 10:07:02, всего редактировалось 2 раза.
alex38779 писал(а):Например я хочу проверить каждый бит байта.
Какой контроллер? Не важно.
Табличный метод хорош. Стабилен по времени выполнения и компактен.
Можно маску получать с помощью цикла со сдвигом. Может быть будет чуть меньше занимать в памяти, но время выполнения будет разное для разных битов.
Последний раз редактировалось Kavka Вс апр 24, 2016 06:20:28, всего редактировалось 1 раз.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
ldi R16,0x55 //тестируемый регистр
ldi R17,8 //количество циклов
push r16 //сохранить значение регистра (если надо)
povtor:
lsl R16 //сдвиг влево регистра, старший бит во флаг С
brcs Propusk //пропустить сколкьо надо команд если установлен флаг С
nop //что то когда флаг С сброшен
nop
nop
nop
nop
nop
nop
nop
nop
Propusk:
dec R17 //уменьшаем счечтик циклов и если не ноль то повторяем
brne povtor
pop r16 //восстановить R16
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
alex38779 писал(а):Есть вот команды sbrc и cbrc которые проверяют n бит байта, sbrc r16, n. То есть работают с константой...
Замечу. Команды SBRS и SBRC работают с 1 битом! SBRCThis instruction tests a single bit in a register and skips the next instruction if the bit is cleared. SBRSThis instruction tests a single bit in a register and skips the next instruction if the bit is set.
Для проверки n-бит есть прекрасная команда CPSEThis instruction performs a compare between two registers Rd and Rr, and skips the next instruction if Rd = Rr.
alex38779 писал(а):Есть вот команды sbrc и cbrc которые проверяют n бит байта, sbrc r16, n. То есть работают с константой...
SBRS и SBRC работают с 1 битом!
Об этом все знают. Перечитайте еще раз цитату, которую сами привели: ТС сетует, что эти команды работают с константой, и ему хочется проверять произвольный бит, который задан в переменной.
Почитайте про стек и его указатель. Значение указателя стека перед выходом из подпрограммы должно быть тем же что на входе в подпрограмму, только тогда указатель стека будет указывать на память в которой хранится адрес возврата. Если Вы что-то скинули на стек в подпрограмме, то перед выходом из нее должны столько же раз считать.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
NekayaPodprogramma:
push r16
push r17
push r18
push r19
push r20
push r21
push r22
push r23
push r24
push r25
push r26
push r27
push r28
push r29
push r30
push r31
pop r31
pop r30
pop r29
pop r28
pop r27
pop r26
pop r25
pop r24
pop r23
pop r22
pop r21
pop r20
pop r19
pop r18
pop r17
pop r17
ret
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Z_h_e писал(а):Z_h_e писал(а):
Почитайте про стек и его указатель.
Не хотите читать, выполняйте программу по шагам в симуляторе и поглядите как изменяется указатель стека при входе в подпрограмму, при выходе из нее и при выполнение команд PUSH и POP.
Мне нужно сохранить данные, выполнить действия, и снова восстановить данные.
Используйте команды ST и LD. Только помните что регистры X, Y, Z - это R26-R31. Что у Вас за задача такая, что надо сохранять почти все регистры? Ну или выполните действия в той подпрограмме что я Вам показал между блоков PUSH и POP команд.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.