При написании исходного текста программы на ассемблере в командах, оперирующих отдельными битами (bcf, bsf, btfsc, btfss и др.) приходится указывать не только имя регистра или переменной, но и, через запятую, номер бита, например: btfsc PORTA, 3 или btfsc PORTA,Snd (определив заранее как: Snd equ 3).
Однако, написание таких команд можно упростить, воспользовавшись директивой ассемблера замены текстовой последовательности #DEFINE. Вот пример ее использования:
; определение переменных, констант, регистров
PortSnd equ 0x05 ; определим порт вывода звука
#define Snd PortSnd, 3 ; определим Snd как третий бит PortSnd
; непосредственно текст программы
bsf Snd ; установим 3-й бит PortSnd в лог. "1"
movlw 0xF0 ; одна из многих команд
bcf Snd ; а теперь сбросим 3-й бит PortSnd
Синтаксис этой директивы: #define <name> [<string>]
Везде, где в тексте программы встретится надпись <name>, она будет заменена на <string>. Применение этой директивы без <string>, определит <name> для внутреннего использования при проверке директивой #IFDEF. Надо заметить, что просмотр в окне Watch Window, определенной таким образом переменной невозможен. В окне придется указывать имя регистра и номер бита.
И последнее, директива #DEFINE может начинаться с любой позиции в строке, кроме первой. Все, что начинается с первой позиции воспринимается при компилировании как метка. Если это команда, то выдается предупреждающее сообщение: найдена команда в первой позиции строки.