Ассемблер (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По незнанию, мне приходилось сравнивать 16 битные числа на равенство в 4 команды.
А во со стороны 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 в вопросах и ответах
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- 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=0,C=1
Результат второй, которая почему то решила устанавливать флаги так же как первая: 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_h_e писал(а):Смысл данного выражения в том, что команды типа SBC, CPC сбрасывают Z, если результат не равен нулю, а если результат нулевой, то во флаг Z будет записано его предыдущее состояние.
Если бы флаг Z устанавливался всегда командой CPC, без учета его предыдущего значения флага 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 в вопросах и ответах
А до этого что было нелогично?
