[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Возможно найдутся желающие полмать свои головы над решением следующей задачи, которая достаточн часто встречается в практике. Задача состоит в следующем:
Требуется организовать ветвление в программе на основании значения некоторой переменной (назовем ее Var). Стандартный прием заключается в последовательном сравнении данной переменной с набором констант и переход происходит при совпадении этой переменной с какой-то константой. При несовпадении - выполняется сравнение переменной со следующей костантой и т.д. Проблема заключается в том, что в PICах отсутствуют инструкции неразрушающего сравнения и последнее выполняется с помощью инструкции XORLW, при этом содержимое W регистра разрушается и для выполнения последущих проверок его необходимо каждый раз перезагружать. Код программы может быть примерно таким:
movwf Var ; Загрузить Var
xorlw 'A' ; Это символ A
bz Lab1 ; Переход если ДА
movwf Var ; Перезагрузка Var???????
xorlw '3' ; Это символ 3
bz Lab2 ; Переход если ДА
movwf Var ; Перезагрузка Var???????
xorlw 0x03 ; Это символ 3
bz Lab3 ; Переход если ДА
и т.д.
Весь фокус состоит в том, что инструкции перезагрузки совершенно ненужны и их можно исключить, если немножко модифицировать код. Как это сделать? Решение есть но только (повторяю) для сравнения с константами. Огранчений на величины констант и порядок сравнения нет. Если у кого-то уже есть решение - поделитесь, please.
E-mail: info@telesys.ru