Ассемблер (ASM) для AVR в вопросах и ответах
Команды меняют! все флаги (кроме DEC и INC не трогающих C)
- Реклама
Вот на CP. Для каждого флага есть булево выражение, чему будет он равен после выполнения команды.
Почти все команды меняющие флаг, его меняют всегда. Но не все.
Команда CPC, может не изменить флаг Z. В зависимости от его состояния перед командой и результатом команды. ADC такая же, SUBC или как там она пишется. Может еще есть.
---------------
UPD: Скорректировал вторую ссылку, а то чего то я там напутал.
Почти все команды меняющие флаг, его меняют всегда. Но не все.
Команда CPC, может не изменить флаг Z. В зависимости от его состояния перед командой и результатом команды. ADC такая же, SUBC или как там она пишется. Может еще есть.
---------------
UPD: Скорректировал вторую ссылку, а то чего то я там напутал.
Последний раз редактировалось Z_h_e Вс окт 16, 2016 15:00:26, всего редактировалось 1 раз.
Нет, всегда устанавливается, если равно.Z_h_e писал(а):Команда CPI, может не изменить флаг Z.
Только что исправил ссылку. Думал одно, писал другое.
Да, я понял о чем разговор, если сравнение с переносом и уже сам нашел эту команду в левом списке (содержании) АВР.
Даже сравнивал их. Честно, не очень с английским. Да и с булевой алгеброй тоже.
Но более или менее можно разобраться.
Короче, сделал вывод. Если написано, что команда ставит флаги, то она не ставит их, а ВЛИЯЕТ на них, т.е. Ставит или Снимает в зависимости от результата операции.
Т.е. Если флаг и был установлен ранее (любой другой операцией или командой), то после того же CPI (например), этот флаг может быть сброшен.
Спасибо. Поубирал лишние строки.
Даже сравнивал их. Честно, не очень с английским. Да и с булевой алгеброй тоже.
Короче, сделал вывод. Если написано, что команда ставит флаги, то она не ставит их, а ВЛИЯЕТ на них, т.е. Ставит или Снимает в зависимости от результата операции.
Т.е. Если флаг и был установлен ранее (любой другой операцией или командой), то после того же CPI (например), этот флаг может быть сброшен.
Спасибо. Поубирал лишние строки.
Станислав
- Реклама
Вот я тоже так думал и успешно пользовалсяСКАЗОЧНИК писал(а):Если написано, что команда ставит флаги, то она не ставит их, а ВЛИЯЕТ на них, т.е. Ставит или Снимает в зависимости от результата операции.
Да, есть команды, работающие с С-флагом предыдущей операции. ADC, SBC, SBCI, CPC
Вы меня не поняли. Предыдущее состояние флага С для этих команд влияет на результат. Но предыдущее состояние флага Z влияет на сам флаг Z и он может быть не изменен.
А как же пришло понимание, что НЕ ВСЕГДА?Z_h_e писал(а):Вот я тоже так думал.... CPC, там указано что изменяет флаг Z, а оказывается не всегда.
Станислав
Совершенно случайно. У меня даже граблей не было с этим. А оказалось "вот оно чё".
Где доходчиво почитать про то, как рисовать таблицы истинности и Булеву алгебру? Чтобы шарить, а не поверхностно знать?
есть у меня методичка с ТУСУРа прислали, по ней разбирался, но тяжко и кратко описано. Всякие карты Карно (если память не изменяет)... Дизъюнкции, конъюнкции...
Хочу соображать также, чтобы понятны были те формулы.
есть у меня методичка с ТУСУРа прислали, по ней разбирался, но тяжко и кратко описано. Всякие карты Карно (если память не изменяет)... Дизъюнкции, конъюнкции...
Хочу соображать также, чтобы понятны были те формулы.
Станислав
Где почитать не скажу. Учебник какой-нибудь, я это очень давно изучал (алгебра логики). Но это не так уже и сложно. Когда разберетесь, обязательно почитайте и про карту Карно.
Как это флаг может влиять сам на себя? На флаг влияет результат операции.Z_h_e писал(а):... Но предыдущее состояние флага Z влияет на сам флаг Z и он может быть не изменен.
Я же давал ссылку на описание команды CPC.zero648 писал(а):Как это флаг может влиять сам на себя?
Вот логическое выражение по которому устанавливается флаг Z для данной команды.
Z= R7 ¯ • R6 ¯ • R5 ¯ • R4 ¯• R3 ¯ • R2 ¯ • R1 ¯ • R0 ¯ • Z
Если Вы внимательно поглядите, то увидите флаг в правой части, который естественно влияет на результат, т.е. сам на себя.
Смысл данного выражения в том, что команды типа SBC, CPC сбрасывают Z, если результат не равен нулю, а если результат нулевой, то во флаг Z будет записано его предыдущее состояние.
Т.е. получается, чтобы мне сделать какой-то условный переход, который будет зависеть от флага "нуля", Я должен буду еще учитывать его предыдущее состояние и рачситывать эти формулы? Нахрена?
По той же ссылке указан пример применения данной команды. Вот он
По незнанию, мне приходилось сравнивать 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.
И что тут необычного, если 16-битные регистры равны, то в итоге флаг нуля установится в единицу, иначе он будет сброшен, зачем мне знать что с ним (Z) было до этого?
Так нет в AVR 16 битных регистров, ибо шина 8ми битная.
Попробуйте написать код сравнения чисел (т.е. из первого вычесть второе) , пускай будут они равны 0x0100 и 0x0001 и сделать переход по неравенству. Сколько у Вас будет команд, если флаг Z меняется "классически" не только для CP, но и CPC?
Попробуйте написать код сравнения чисел (т.е. из первого вычесть второе) , пускай будут они равны 0x0100 и 0x0001 и сделать переход по неравенству. Сколько у Вас будет команд, если флаг Z меняется "классически" не только для CP, но и CPC?
Сколько угодно, пока регистров хватит. Когда не хватит привлечь память
Код: Выделить всё
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 у команды CPC изменялся также как и у CP,т.е. всегда.akl писал(а):Сколько угодно, пока регистров хватит.
То весь Ваш код был бы не рабочим.



