Ассемблер (ASM) для AVR в вопросах и ответах
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вы меня не поняли. Предыдущее состояние флага С для этих команд влияет на результат. Но предыдущее состояние флага Z влияет на сам флаг Z и он может быть не изменен.
- Реклама
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А как же пришло понимание, что НЕ ВСЕГДА?Z_h_e писал(а):Вот я тоже так думал.... CPC, там указано что изменяет флаг Z, а оказывается не всегда.
Станислав
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Совершенно случайно. У меня даже граблей не было с этим. А оказалось "вот оно чё".
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Где доходчиво почитать про то, как рисовать таблицы истинности и Булеву алгебру? Чтобы шарить, а не поверхностно знать?
есть у меня методичка с ТУСУРа прислали, по ней разбирался, но тяжко и кратко описано. Всякие карты Карно (если память не изменяет)... Дизъюнкции, конъюнкции...
Хочу соображать также, чтобы понятны были те формулы.
есть у меня методичка с ТУСУРа прислали, по ней разбирался, но тяжко и кратко описано. Всякие карты Карно (если память не изменяет)... Дизъюнкции, конъюнкции...
Хочу соображать также, чтобы понятны были те формулы.
Станислав
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Где почитать не скажу. Учебник какой-нибудь, я это очень давно изучал (алгебра логики). Но это не так уже и сложно. Когда разберетесь, обязательно почитайте и про карту Карно.
- Реклама
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Как это флаг может влиять сам на себя? На флаг влияет результат операции.Z_h_e писал(а):... Но предыдущее состояние флага Z влияет на сам флаг Z и он может быть не изменен.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я же давал ссылку на описание команды CPC.zero648 писал(а):Как это флаг может влиять сам на себя?
Вот логическое выражение по которому устанавливается флаг Z для данной команды.
Z= R7 ¯ • R6 ¯ • R5 ¯ • R4 ¯• R3 ¯ • R2 ¯ • R1 ¯ • R0 ¯ • Z
Если Вы внимательно поглядите, то увидите флаг в правой части, который естественно влияет на результат, т.е. сам на себя.
Смысл данного выражения в том, что команды типа SBC, CPC сбрасывают Z, если результат не равен нулю, а если результат нулевой, то во флаг Z будет записано его предыдущее состояние.
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Т.е. получается, чтобы мне сделать какой-то условный переход, который будет зависеть от флага "нуля", Я должен буду еще учитывать его предыдущее состояние и рачситывать эти формулы? Нахрена?
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
По той же ссылке указан пример применения данной команды. Вот он
По незнанию, мне приходилось сравнивать 16 битные числа на равенство в 4 команды.
А во со стороны Atmel я вижу свинство, могли бы в ДШ хотя бы звездочку поставить на флаге z для подобных команд - таких команд не много. Я имею ввиду раздел Instruction set summary.
Код: Выделить всё
; Compare r3:r2 with r1:r0
cp r2,r0 ; Compare low byte
cpc r3,r1 ; Compare high byte
brne noteq ; Branch if not equalА во со стороны Atmel я вижу свинство, могли бы в ДШ хотя бы звездочку поставить на флаге z для подобных команд - таких команд не много. Я имею ввиду раздел Instruction set summary.
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
И что тут необычного, если 16-битные регистры равны, то в итоге флаг нуля установится в единицу, иначе он будет сброшен, зачем мне знать что с ним (Z) было до этого?
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Так нет в AVR 16 битных регистров, ибо шина 8ми битная.
Попробуйте написать код сравнения чисел (т.е. из первого вычесть второе) , пускай будут они равны 0x0100 и 0x0001 и сделать переход по неравенству. Сколько у Вас будет команд, если флаг Z меняется "классически" не только для CP, но и CPC?
Попробуйте написать код сравнения чисел (т.е. из первого вычесть второе) , пускай будут они равны 0x0100 и 0x0001 и сделать переход по неравенству. Сколько у Вас будет команд, если флаг Z меняется "классически" не только для CP, но и CPC?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Сколько угодно, пока регистров хватит. Когда не хватит привлечь память
Код: Выделить всё
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 * ; если равно
;если не равно
;
;
*
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Если бы флаг Z у команды CPC изменялся также как и у CP,т.е. всегда.akl писал(а):Сколько угодно, пока регистров хватит.
То весь Ваш код был бы не рабочим.
- Andrew Martin
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Дело в том, что CPC практически не используется без CP. Если бы флаг Z у CPC изменялся всегда, то нельзя бы было эту инструкцию использовать по прямому назначению для сравнения чисел большой разрядности. Например, сравните 0x5000 0x5050. Сначала СР сравним младшие байты, Z=0, а потом СРС сравним старшие. Если бы CPC выдавала зеро флаг только основываясь на текущем результате, то мы бы имели Z=1, что означало бы равенство неравных 16-битных чисел, а так Z=0*Z = 0*1 = 0, и это правильно.
По-моему всё очевидно и давно разжевано.
По-моему всё очевидно и давно разжевано.
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Понятно, что шина 8 битная, но в примере сравнивается 16 битное число, ну это в принципе не важно, пусть будет сколько угодно команд сравнения n-битного числа, решающая команда все равно последняя, последняя это та, после которой вы собираетесь что-то сделать по условию, именно последняя команда устанавливает результирующие флаги. Можно проверить сбросив или установив флаг нуля, т.к. про него разговор, перед последней командой сравнения, результат на выходе будет одинаковый.Z_h_e писал(а):Так нет в AVR 16 битных регистров, ибо шина 8ми битная.
Попробуйте написать код сравнения чисел (т.е. из первого вычесть второе) , пускай будут они равны 0x0100 и 0x0001 и сделать переход по неравенству. Сколько у Вас будет команд, если флаг Z меняется "классически" не только для CP, но и CPC?
Для примера: в первом и втором случае на выходе ничего не изменится, в данном случае нельзя трогать только флаг переноса.
Код: Выделить всё
; 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- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я Вам же не зря предложил сравнить два числа. 0x0100 и 0x0001.
Предположим команды СP и CPC устанавливают флаг одинаково и всегда.
Напишу код сравнения, но без регистров, а сразу значение из них.
Результат первой команды: Z=0,C=1
Результат второй, которая почему то решила устанавливать флаги так же как первая: Z=1, C=0
Результат третей, это прыжок , как будто бы 16ти битные числа равны, а они не равны.
Вот потому команда CPC умеет только сбрасывать Z если не равно, и оставлять его предыдущим значением если равно. Это и позволяет сравнивать большие числа малым числом команд.
Предположим команды СP и CPC устанавливают флаг одинаково и всегда.
Напишу код сравнения, но без регистров, а сразу значение из них.
Код: Выделить всё
CP 0x00,0x01
CPC 0x01,0x00
breq RAVNOРезультат второй, которая почему то решила устанавливать флаги так же как первая: Z=1, C=0
Результат третей, это прыжок , как будто бы 16ти битные числа равны, а они не равны.
Вот потому команда CPC умеет только сбрасывать Z если не равно, и оставлять его предыдущим значением если равно. Это и позволяет сравнивать большие числа малым числом команд.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну почему же? Как бы ни менялся этот флаг у этих команд, он на их результаты никак не влияет. CPC при выполнении учитывает только флаг С, ну а то, что она ещё и на Z влияет, не важно, т.к. его для вычислений не использует.Z_h_e писал(а):Если бы флаг Z у команды CPC изменялся также как и у CP,т.е. всегда.
То весь Ваш код был бы не рабочим.
P.S. Тут лучше, конечно, BRCC/BRCS использовать вместо BREQ/BRNE, вообще игнорируя Z, который при сравнении многобайтовых слов, в принципе, не нужен.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Только повторить написанное.
Вот так устанавливает флаг Z команда CPC
Z= R7 ¯ • R6 ¯ • R5 ¯ • R4 ¯• R3 ¯ • R2 ¯ • R1 ¯ • R0 ¯ • Z
Если бы флаг Z устанавливался всегда командой CPC, без учета его предыдущего значения флага Z, то связкаZ_h_e писал(а):Смысл данного выражения в том, что команды типа SBC, CPC сбрасывают Z, если результат не равен нулю, а если результат нулевой, то во флаг Z будет записано его предыдущее состояние.
Код: Выделить всё
СP
CPC
CPC
...Я даже привел пример с конкретным числом.
Как на равенство проверять с помощью флага С?P.S. Тут лучше, конечно, BRCC/BRCS использовать вместо BREQ/BRNE, вообще игнорируя Z, который при сравнении многобайтовых слов, в принципе, не нужен.
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот так уже логично будет.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А до этого что было нелогично?



