Rd7 Rd7 • Rr7 • R7 ¯ + Rd7 ¯ • Rr7 ¯ • R7
Set if two's complement overflow resulted from the operation; cleared otherwise
как понимать два одинаковых значения в булевой формуле Rd7*Rd7
Например для флага H:
Rd3 • Rr3 + Rr3 • R3 ¯ + R3 ¯ • Rd3
Set if there was a carry from bit 3; cleared otherwise
всё просто - выставляется если Rd3(1)*Rr3(1) или Rr3(1)*R3(0) или R3(0)*Rd3(1) - в скобках установленные (1) или сброшенные (0) биты
Но зачем в формуле для V флага два регистра Rd7 - ума не хватает...
И сильно сомневаюсь, что опечатка...
Никогда не использовал данный флаг, интересную задачку Вы задали. Посидел часочек, поморщил череп. Если я не ошибся, то логика установки флага V получилась такая Rd7• (Rd7 • Rr7¯ • R7 ¯ + Rd7 ¯ • Rr7 • R7). У Вас опечатка еще, инверсию Rr7 не там поставили. Вот таблица истинности, где R7=A, Rd7=D, Rr7=R.
В Атмел Студио вроде как подтвердилось, само-собой не проверял все варианты. Включается флаг тогда, когда вы сравниваете отрицательное число с положительным, а результат положительный, т.е. когда (+)= (–) - (+) .
Пока думал над Вашей задачей, понял что не знал одну крайне важную вещь. Оказывается команды типа SBC, CPC сбрасывают Z если результат не равен нулю (логично), а если результат нулевой, то флаг Z НЕ меняется. . Видимо никогда не использовал эти команды для проверки на ноль, надеюсь, очень надеюсь . Смотрел обычно в даташит Insruction Set Summary, там указано что команды изменяют флаг Z, даже мыслей не было что Z устанавливается несколько необычно.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Есть две степени не компетенции.
1. Что-то не знаешь и ты знаешь что-то не знаешь. Это легко исправляется, берешь книгу и читаешь буквы.
2. Что-то знаешь, но не правильно, а думаешь что правильно. Тут уже случай потяжелее, будешь ходить по коровьему пастбищу уверенный что все хорошо, пока не вляпаешься. А ходить можно долго и можно сразу и не заметить что уже вляпался.
Я вспомнил один из вариантов использования мной данной конструкции, будучи уверенным что команды sub sbc одинаково изменяют Z . Она получилась несколько длиннее и по несчастливой случайности работает.
Спасибо за отзывчивость Z_h_e. Спустя 3 недели начал разбираться дальше.
Формула на мой примитивный взгляд не правильна.
Z_h_e писал(а): Rd7• (Rd7 • Rr7¯ • R7 ¯ + Rd7 ¯ • Rr7 • R7). У Вас опечатка еще, инверсию Rr7 не там поставили. Вот таблица истинности, где R7=A, Rd7=D, Rr7=R.
Из неё следует, что когда 7 бит первого сравниваемого числа равен 0 - флаг V НИКОГДА НЕ БУДЕТ ВЫСТАВЛЕН! однако к примеру сравнение командой cpc a,b, где а=0b01111000, b=0x10001110 выставляет флаг V.
В первом посте дал маху ошибочно указав ссылку на описание команды ADC, нужно было CPC http://www.atmel.com/webdoc/avrassemble ... b_CPC.html
Не могу успокоится и поверить, что в справочнике от ATMEL для флага V команды СРС опечатка. Более того, в командах СР и SUB также формула
V:
Rd7 Rd7 • Rr7 ¯ • R7 ¯ + Rd7 ¯ • Rr7 • R7
Set if two's complement overflow resulted from the operation; cleared otherwise.
В команда ADD и ADC формула другая, но похожее начало Rd7 Rd7
shevelev_es писал(а):Формула на мой примитивный взгляд не правильна
Действительно. Вообще чего было изобретать? Это я про себя.
Глядим:
CP........Rd7 Rd7 • Rr7 ¯ • R7 ¯ + Rd7 ¯ • Rr7 • R7
CPC..... Rd7 Rd7 • Rr7 ¯ • R7 ¯ + Rd7 ¯ • Rr7 • R7
CPI.......Rd7 Rd7 • K7 ¯ • R7 ¯ + Rd7 ¯ • K7 • R7
Смотрим ту же таблицу истинности, но только вторую справа колонку, она будет соответствовать официальной формуле. Получается, что флаг V выставится когда (+)= (–) - (+) и (-)= (+) - (-) . Это ж совсем логично, чем я насочинял.
В команда ADD и ADC формула другая, но похожее начало Rd7 Rd7
Ну и команды другие же.
Может Rd7 Rd7 указаны в формуле, потому что реально АЛУ так делает, смысла вроде нет, но по каким-то причинам так получилось при разработке камня.
Вывод: производителю надо верить, но знак • между Rd7 Rd7 могли бы и поставить .
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.