Команды сложения и вычитания регистровИтак, рассмотрим конструкцию XXXXX F,D , где
XXXXX – слово команды + пробел;
F – имя или адрес какого-либо регистра, с которым будет работать команда + символ запятой;
D – так называемый селектор, который может быть равен 0 или 1. Если D=1 то результат сохраняется в регистре F. Если D=0 , то результат сохраняется в регистре W. Внимание, если D не указано, то ассемблер по умолчанию предполагает, что D=1. Напоминаю – регистр F это ячейка оперативной памяти.
Регистр W – это так называемый рабочий регистр, который не имеет адреса; регистр W проще представить как "виртуальный" регистр, который в командах выступает посредником, через него или с помощью него выполняют те или иные операции с "реальными" регистрами. Иначе W называют аккумулятором.
Например, необходимо сложить два регистра F1 и F2 (F1 и F2 в этом примере имена регистров; могут быть другие имена, например, KLON и KLOP). Для этого содержимое F1 надо скопировать в аккумулятор W, затем сложить содержимое аккумулятора W с регистром F2 (работа с аккумулятором W рассмотрена ниже).
Команда СЛОЖЕНИЯ (F + W) в общем виде выглядит как ADDWF F,D
Команда ВЫЧИТАНИЯ (F – W) в общем виде выглядит как SUBWF F,D
Внимание: вычитание строго из F – W; других вариантов нет!
Для удобства значениям селектора сопоставляются имена, а именно "W это 0" и "F это 1" , это хорошо видно в примере сопоставления выше. Таким образом, команда ADDWF F2,1 может иметь вид ADDWF F2,F , а команда ADDWF F2,0 будет иметь вид ADDWF F2,W . Это означает, что если в селекторе указан символ W , то результат команды записывается в аккумулятотр W. Если в селекторе указан символ F – то результат команды записывается в регистр, который был указан в команде (перечитайте этот абзац ещё раз).
Продолжим пример, рассмотренный выше. Нам надо сложить содержимое регистра KLON с содержимым аккумулятора W и результат операции сложения поместить в регистр KLON (рекомендую команды именно таким образом проговаривать).
ADDWF KLON,F ; запись с сопоставленными именами
ADDWF H000C,0x1 ; тоже самое, но в числах
ADDWF H000C ; тоже самое, но с учетом умолчания
ADDWF H000C,DC ; тоже самое, но с приколом
А причем тут символы "DC" в строке? Ответ прост: символам "DC" в предыдущем примере мы сопоставили число 1. Здесь ошибки нет, но лучше так не прикалываться, чтобы самому не запутаться. Какую форму записи использовать – выбирать вам. Если в тексте программы регистр используется пару раз, можно его не сопоставлять с именем (не называть), а просто в строчке команды указать его адрес.
Примеры с вычитанием. Надо из содержимого регистра KLOP вычесть содержимое аккумулятора W и результат операции вычитания поместить в аккумулятор W.
SUBWF KLOP,W ; запись с использованием сопоставленных имен
SUBWF H000D,0 ; тоже самое, но в числах
SUBWF H000D,W ; тоже самое, но с использованием числа и имени
Таким образом, строчки программы представляет из себя команды, которые фактически обращаются к числам через имена.
Сопоставление номеров битов в регистре – также оправданная необходимость. Например, нам надо управлять 8-ю ножками, устанавливая на них +5В или 0В (напоминаю: +5В – это логическая единица; 0В – это логический ноль). Эти ножки – реальные выводы МК, они имеют нумерацию, например, с 1-го по 8-й вывод (или другую, сейчас это не важно). А вот в регистре, который управляет восемью ножками, биты пронумерованы от 0 до 7. Например, 0-й бит управляет 1-й ножкой, 1-й бит – 2-й ножкой и т.д. до 7-й бит – 8-й ножкой. Всё это заставляет сосредотачивать внимание и порой тратить время на перепроверку правильности записи.
Проще так – сопоставить реальные выводы МК с виртуальными битами.
NOGA1 EQU H0000
NOGA2 EQU H0001
...
NOGA8 EQU H0007
Просто, понятно, и даже немного вульгарно.
Напоминаю, что регистры нумеруются от нуля до семи, справа налево.
NOGA8
|
NOGA7
|
NOGA6
|
NOGA5
|
NOGA4
|
NOGA3
|
NOGA2
|
NOGA1
|
бит N7
|
бит N6
|
бит N5
|
бит N4
|
бит N3
|
бит N2
|
бит N1
|
бит N0
|
0
|
0
|
0
|
1
|
1
|
1
|
1
|
1
|
Например, запись числа 00011111 в регистр с названием PORTB означает, что на восьми ножках микросхемы, относящихся к "Порту Б" с 1-й по 5-ю ножку, будет установлен высокий уровень сигнала, а на остальных 6,7 и 8-й ножке будет установлен низкий уровень сигнала.
|