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

Обсуждаем контроллеры компании Atmel.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 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
Друг Кота
Сообщения: 4453
Зарегистрирован: Пт мар 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,т.е. всегда.
То весь Ваш код был бы не рабочим.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

Сообщение Andrew Martin »

Дело в том, что CPC практически не используется без CP. Если бы флаг Z у CPC изменялся всегда, то нельзя бы было эту инструкцию использовать по прямому назначению для сравнения чисел большой разрядности. Например, сравните 0x5000 0x5050. Сначала СР сравним младшие байты, Z=0, а потом СРС сравним старшие. Если бы CPC выдавала зеро флаг только основываясь на текущем результате, то мы бы имели Z=1, что означало бы равенство неравных 16-битных чисел, а так Z=0*Z = 0*1 = 0, и это правильно.
По-моему всё очевидно и давно разжевано.
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Z_h_e писал(а):Так нет в AVR 16 битных регистров, ибо шина 8ми битная.

Попробуйте написать код сравнения чисел (т.е. из первого вычесть второе) , пускай будут они равны 0x0100 и 0x0001 и сделать переход по неравенству. Сколько у Вас будет команд, если флаг Z меняется "классически" не только для CP, но и CPC?
Понятно, что шина 8 битная, но в примере сравнивается 16 битное число, ну это в принципе не важно, пусть будет сколько угодно команд сравнения n-битного числа, решающая команда все равно последняя, последняя это та, после которой вы собираетесь что-то сделать по условию, именно последняя команда устанавливает результирующие флаги. Можно проверить сбросив или установив флаг нуля, т.к. про него разговор, перед последней командой сравнения, результат на выходе будет одинаковый.
Для примера: в первом и втором случае на выходе ничего не изменится, в данном случае нельзя трогать только флаг переноса.

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

; Compare r3:r2 with r1:r0
cp r2,r0 ; Compare low byte
clz
cpc r3,r1 ; Compare high byte
brne noteq ; Branch if not equal

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

; Compare r3:r2 with r1:r0
cp r2,r0 ; Compare low byte
sez
cpc r3,r1 ; Compare high byte
brne noteq ; Branch if not equal
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Я Вам же не зря предложил сравнить два числа. 0x0100 и 0x0001.

Предположим команды СP и CPC устанавливают флаг одинаково и всегда.
Напишу код сравнения, но без регистров, а сразу значение из них.

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

CP 0x00,0x01
CPC 0x01,0x00
breq RAVNO
Результат первой команды: Z=0,C=1
Результат второй, которая почему то решила устанавливать флаги так же как первая: Z=1, C=0
Результат третей, это прыжок , как будто бы 16ти битные числа равны, а они не равны.

Вот потому команда CPC умеет только сбрасывать Z если не равно, и оставлять его предыдущим значением если равно. Это и позволяет сравнивать большие числа малым числом команд.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Z_h_e писал(а):Если бы флаг Z у команды CPC изменялся также как и у CP,т.е. всегда.
То весь Ваш код был бы не рабочим.
Ну почему же? Как бы ни менялся этот флаг у этих команд, он на их результаты никак не влияет. CPC при выполнении учитывает только флаг С, ну а то, что она ещё и на Z влияет, не важно, т.к. его для вычислений не использует.

P.S. Тут лучше, конечно, BRCC/BRCS использовать вместо BREQ/BRNE, вообще игнорируя Z, который при сравнении многобайтовых слов, в принципе, не нужен.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

:kill: Я не знаю что ответить.
Только повторить написанное.

Вот так устанавливает флаг Z команда CPC
Z= R7 ¯ • R6 ¯ • R5 ¯ • R4 ¯• R3 ¯ • R2 ¯ • R1 ¯ • R0 ¯ • Z
Z_h_e писал(а):Смысл данного выражения в том, что команды типа SBC, CPC сбрасывают Z, если результат не равен нулю, а если результат нулевой, то во флаг Z будет записано его предыдущее состояние.
Если бы флаг Z устанавливался всегда командой CPC, без учета его предыдущего значения флага Z, то связка

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

СP
CPC 
CPC
...
не работала бы.
Я даже привел пример с конкретным числом.
P.S. Тут лучше, конечно, BRCC/BRCS использовать вместо BREQ/BRNE, вообще игнорируя Z, который при сравнении многобайтовых слов, в принципе, не нужен.
Как на равенство проверять с помощью флага С?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

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

Сообщение Z_h_e »

А до этого что было нелогично?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

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