Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Команды меняют! все флаги (кроме DEC и INC не трогающих C)
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Вот на CP. Для каждого флага есть булево выражение, чему будет он равен после выполнения команды.

Почти все команды меняющие флаг, его меняют всегда. Но не все.

Команда CPC, может не изменить флаг Z. В зависимости от его состояния перед командой и результатом команды. ADC такая же, SUBC или как там она пишется. Может еще есть.
---------------
UPD: Скорректировал вторую ссылку, а то чего то я там напутал.
Последний раз редактировалось Z_h_e Вс окт 16, 2016 15:00:26, всего редактировалось 1 раз.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Z_h_e писал(а):Команда CPI, может не изменить флаг Z.
Нет, всегда устанавливается, если равно.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Только что исправил ссылку. Думал одно, писал другое.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

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

Короче, сделал вывод. Если написано, что команда ставит флаги, то она не ставит их, а ВЛИЯЕТ на них, т.е. Ставит или Снимает в зависимости от результата операции.

Т.е. Если флаг и был установлен ранее (любой другой операцией или командой), то после того же CPI (например), этот флаг может быть сброшен.

Спасибо. Поубирал лишние строки. :beer:
Станислав
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

СКАЗОЧНИК писал(а):Если написано, что команда ставит флаги, то она не ставит их, а ВЛИЯЕТ на них, т.е. Ставит или Снимает в зависимости от результата операции.
Вот я тоже так думал и успешно пользовался :facepalm: , глядя лишь лишь в ДШ на раздел инструкшион суммари. Все таже CPC, там указано что изменяет флаг Z, а оказывается не всегда.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Да, есть команды, работающие с С-флагом предыдущей операции. ADC, SBC, SBCI, CPC
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Вы меня не поняли. Предыдущее состояние флага С для этих команд влияет на результат. Но предыдущее состояние флага Z влияет на сам флаг Z и он может быть не изменен.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Z_h_e писал(а):Вот я тоже так думал.... CPC, там указано что изменяет флаг Z, а оказывается не всегда.
А как же пришло понимание, что НЕ ВСЕГДА?
Станислав
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Совершенно случайно. У меня даже граблей не было с этим. А оказалось "вот оно чё".
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Где доходчиво почитать про то, как рисовать таблицы истинности и Булеву алгебру? Чтобы шарить, а не поверхностно знать?
есть у меня методичка с ТУСУРа прислали, по ней разбирался, но тяжко и кратко описано. Всякие карты Карно (если память не изменяет)... Дизъюнкции, конъюнкции...

Хочу соображать также, чтобы понятны были те формулы. :roll:
Станислав
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Где почитать не скажу. Учебник какой-нибудь, я это очень давно изучал (алгебра логики). Но это не так уже и сложно. Когда разберетесь, обязательно почитайте и про карту Карно.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Z_h_e писал(а):... Но предыдущее состояние флага Z влияет на сам флаг Z и он может быть не изменен.
Как это флаг может влиять сам на себя? На флаг влияет результат операции.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

zero648 писал(а):Как это флаг может влиять сам на себя?
Я же давал ссылку на описание команды CPC.

Вот логическое выражение по которому устанавливается флаг Z для данной команды.
Z= R7 ¯ • R6 ¯ • R5 ¯ • R4 ¯• R3 ¯ • R2 ¯ • R1 ¯ • R0 ¯ • Z

Если Вы внимательно поглядите, то увидите флаг в правой части, который естественно влияет на результат, т.е. сам на себя.
Смысл данного выражения в том, что команды типа SBC, CPC сбрасывают Z, если результат не равен нулю, а если результат нулевой, то во флаг Z будет записано его предыдущее состояние.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Т.е. получается, чтобы мне сделать какой-то условный переход, который будет зависеть от флага "нуля", Я должен буду еще учитывать его предыдущее состояние и рачситывать эти формулы? Нахрена?
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

По той же ссылке указан пример применения данной команды. Вот он

Код: Выделить всё

; Compare r3:r2 with r1:r0
cp r2,r0 ; Compare low byte
cpc r3,r1 ; Compare high byte
brne noteq ; Branch if not equal
По незнанию, мне приходилось сравнивать 16 битные числа на равенство в 4 команды.

А во со стороны Atmel я вижу свинство, могли бы в ДШ хотя бы звездочку поставить на флаге z для подобных команд - таких команд не много. Я имею ввиду раздел Instruction set summary.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

И что тут необычного, если 16-битные регистры равны, то в итоге флаг нуля установится в единицу, иначе он будет сброшен, зачем мне знать что с ним (Z) было до этого?
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Так нет в AVR 16 битных регистров, ибо шина 8ми битная.

Попробуйте написать код сравнения чисел (т.е. из первого вычесть второе) , пускай будут они равны 0x0100 и 0x0001 и сделать переход по неравенству. Сколько у Вас будет команд, если флаг Z меняется "классически" не только для CP, но и CPC?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Сколько угодно, пока регистров хватит. Когда не хватит привлечь память

Код: Выделить всё

COMP_R9_R19:
	CP	R9,R19 ;сравнить младшие
	CPC	R8,R18
	CPC	R7,R17
	CPC	R6,R16
	CPC	R5,R15
	CPC	R4,R14
	CPC	R3,R13
	CPC	R2,R12
	BREQ *    ; если  равно
;если не равно
;
;
*
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

akl писал(а):Сколько угодно, пока регистров хватит.
Если бы флаг Z у команды CPC изменялся также как и у CP,т.е. всегда.
То весь Ваш код был бы не рабочим.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

Вернуться в «AVR»