выставление флага V в команде cpc

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 11
Зарегистрирован: Пт апр 01, 2016 11:31:24

Сообщение shevelev_es »

на сайте Atmel http://www.atmel.com/webdoc/avrassemble ... b_ADC.html в описании команды СРС указана логика выставления флага V:

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 - ума не хватает...
И сильно сомневаюсь, что опечатка...
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Никогда не использовал данный флаг, интересную задачку Вы задали. Посидел часочек, поморщил череп. Если я не ошибся, то логика установки флага V получилась такая Rd7• (Rd7 • Rr7¯ • R7 ¯ + Rd7 ¯ • Rr7 • R7). У Вас опечатка еще, инверсию Rr7 не там поставили. Вот таблица истинности, где R7=A, Rd7=D, Rr7=R.
В Атмел Студио вроде как подтвердилось, само-собой не проверял все варианты. Включается флаг тогда, когда вы сравниваете отрицательное число с положительным, а результат положительный, т.е. когда (+)= (–) - (+) .

Пока думал над Вашей задачей, понял что не знал одну крайне важную вещь. Оказывается команды типа SBC, CPC сбрасывают Z если результат не равен нулю (логично), а если результат нулевой, то флаг Z НЕ меняется. :shock: . Видимо никогда не использовал эти команды для проверки на ноль, надеюсь, очень надеюсь :facepalm:. Смотрел обычно в даташит Insruction Set Summary, там указано что команды изменяют флаг Z, даже мыслей не было что Z устанавливается несколько необычно.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Потому что это не первые команды в цепочке. Первые - sub, cp/cpi, вот эти меняют Z-флаг как положено, иначе можно посчитать 0xAA55 - 0xAA11

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

;X = 0xAA55
;Y = 0xAA11
sub XL, YL ;Z=0
sbc ZH, YH ;вот тут Z не должен измениться
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Есть две степени не компетенции.
1. Что-то не знаешь и ты знаешь что-то не знаешь. Это легко исправляется, берешь книгу и читаешь буквы.
2. Что-то знаешь, но не правильно, а думаешь что правильно. Тут уже случай потяжелее, будешь ходить по коровьему пастбищу уверенный что все хорошо, пока не вляпаешься. А ходить можно долго и можно сразу и не заметить что уже вляпался.

Я вспомнил один из вариантов использования мной данной конструкции, будучи уверенным что команды sub sbc одинаково изменяют Z :facepalm: . Она получилась несколько длиннее и по несчастливой случайности работает.

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

;X = 0xAA55
;Y = 0xAA11
sub XL, YL ;
brne JumpNeRavno
sbc XH, YH ;
brne JumpNeRavno
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 11
Зарегистрирован: Пт апр 01, 2016 11:31:24

Сообщение shevelev_es »

Спасибо за отзывчивость 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

И еще кто не знаком наткнулся на интересную статью по флагам V и C http://www.wasm.ru/article/261
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

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 могли бы и поставить :) .
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Ответить

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