Обучение : Программирование на Ассемблере для PIC


Команды сложения и вычитания регистров

Итак, рассмотрим конструкцию XXXXX F,D   , где

XXXXX  слово команды + пробел;

 имя или адрес какого-либо регистра, с которым будет работать команда + символ запятой;

 так называемый селектор, который может быть равен 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

 

Команда ВЫЧИТАНИЯ (FW) в общем виде выглядит как SUBWF F,D

 

Внимание: вычитание строго из FW; других вариантов нет!

 

Для удобства значениям селектора сопоставляются имена, а именно "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-й ножке будет установлен низкий уровень сигнала.


<<< назад далее >>>

Просмотров: 63874

 








 
 
 

В русском Интернете бестолку защищать свои права. Хотите использовать материалы - используйте,
но с письменного согласия авторов. В противном случае будут высланы соответствующие письма
в поисковые системы об ограничении индексации ваших сайтов. Не доводите до греха.