- •Микроконтроллеры семейства mcs-196 методические указания
- •1. Цель работы
- •2. Теоретические сведения
- •2.1. Архитектура семейства mcs-196
- •2.1.1 Центральный процессор (cpu)
- •2.1.2. Периферийные устройства 8xc196kc и 8xc196kd
- •2.2. Прерывания
- •2.2.1. Модификация приоритетов прерываний
- •2.2.2. Подпрограммы обработки прерывания
- •2.3. Регистры специальных функций
- •2.3.1. Карта памяти
- •2.3.2. Специальные функциональные регистры (sfr)
- •2.3.3. Горизонтальные окна
- •VWindow7
- •2.3.4 Вертикальные окна
- •2.4. Порты ввода/вывода
- •2.5. Сервер периферийного обмена (pts)
- •2.6. Система команд и способы адресации
- •2.7. Работа с пакетом pds
- •2.8. Работа с программой pds2com
- •3. Задание на лабораторную работу
- •4. Требования к отчету
- •5. Контрольные вопросы
- •Применение 87c196kc для ввода/вывода и обработки дискретной и аналоговой информации.
- •1 Цель работы
- •2 Теоретические сведения. Описание лабораторного стенда
- •3. Задание и порядок выполнения работы
- •4. Требования к отчету
- •5 Контрольные вопросы
- •Регистр Управления ацп (ad_command) (Адрес 02h,Горизонтальное окно 0 (Запись) Горизонтальное окно 15 (Чтение)).
- •Регистр Результата ацп (ad_result)
2.6. Система команд и способы адресации
MCS-96 содержит полный набор команд, включающий операции с битами, байтами, словами, двойными словами (беззнаковые 32 бит), длинные операции (32 бит со знаком), работу с флагами, а также переходы и вызовы подпрограмм. Все стандартные логические и арифметические команды работают как с байтами, так и со словами. Команды перехода по установке бита (Jump Bit Set) и очистке бита (Jump Bit Clear) могут работать с каким-либо регистром SFR или с другими байтами регистрового файла. Эти быстрые битовые операции позволяют ускорить функции ввода/вывода.
Операции над байтами и словами составляют основу системы команд. Ассемблер ASM-96 использует суффикс "В" в мнемонике для операций над байтами, иначе мнемоника относится к операциям над словами.
Длинные и двухсловные операции включают операции сдвигов, нормализацию, умножение и деление. В операции Деление делится 32-битное число на 16-битное число, что порождает 16-битное частное и 16-битный остаток. В операции Умножение умножается 16-битное на 16-битное число с образованием 32-битного результата. Обе операции могут выполняться с числами со знаком или без знака. Команды нормализации и соответствующий флаг обеспечивает аппаратную поддержку пакета программ для выполнения операций над числами с плавающей запятой.
Для доступа к операндам внутри адресного пространства 8XC196KC/KD
используется шесть основных режимов адресации:
прямая регистровая адресация;
косвенная;
косвенная с автоинкрементом;
непосредственная;
короткая индексная;
длинная индексная.
Два других используемых режима - адресация с использованием нулевого регистра (Zero Register) и адресация с использованием регистра указателя стека (Stack Pointer Register). Адресация с использованием нулевого регистра объединяет адресацию через нулевой регистр ZERO_REG с длинной индексной адресацией, позволяющей непосредственно обращаться к любой области памяти. Адресация с использованием регистра указателя стека объединяет адресацию через SP (указатель стека) с косвенной адресацией для доступа к вершине стека и с короткой индексной адресацией для доступа к данным внутри стека. В этом разделе описаны способы адресации и их аппаратная реализация. Понимание этих деталей поможет программисту полностью использовать возможности архитектуры. Язык Ассемблера скрывает некоторые из деталей работы этих способов адресации.
Прямая регистровая адресация. Режим прямой регистровой адресации служит для прямого доступа к 256 байтам нижнего регистрового файла (Register File). С использованием режима окон в этом режиме адресации можно организовать непосредственный доступ к дополнительным SFR или байтам верхнего регистрового файла. Регистр выбирается как 8-битное поле внутри команды, и адрес регистра должен соответствовать правилам выравнивания для типов операндов. В вычислениях, в зависимости от команды, могут принимать участие до трёх регистров.
Пример:
ADD AX, BX, CX ; AX <-- BX + CX (ADD_3op)
MUL AX, BX ; AX <-- AX * BX (MUL_2op)
INCB CL ; CL <-- CL + 1
Рабочие регистры :
AX, BX, CX - 16-битные регистры;
CL - младший байт регистра CX.
Косвенная адресация. Косвенная адресация осуществляет доступ к операнду, адрес которого размещен в переменной типа WORD регистрового файла. Вычисляемый адрес должен соответствовать правилам выравнивания. Заметим, что косвенная адресация позволяет обращаться к операнду в любом месте адресного пространства MCS-96, включая регистровый файл. 8-битное поле внутри команды выбирает регистр, который содержит косвенный адрес. Команда может содержать только одну косвенную ссылку, обращение к добавочным операндам осуществляется с помощью прямой регистровой адресации.
Пример:
LD AX, [AX] ; AX <-- MEM_WORD(AX)
ADDB AL, BL, [CX] ; AL <-- BL + MEM_BYTE(CX) (ADDB_3op)
POP [AX] ; MEM_WORD(AX) <-- MEM_WORD(SP)
; SP <-- SP + 2
Рабочие регистры:
AX, CX -16-битные регистры;
AL ,SL - младшие байты регистров AX, BX.
Косвенная адресация c автоинкрементом. Косвенная адресация с автоинкрементом - это то же самое, что и косвенная адресация, но в дополнение переменная типа WORD, содержащая косвенный адрес, инкрементируется после использования для адресации операнда. Младший значащий бит регистра типа WORD по разному интерпретируется в зависимости от наличия или отсутствия автоинкремента в косвенной адресации. Если команда работает с переменными типа BYTE или SHORT-INTEGER, адрес инкрементируется на 1, а если команда работает с переменными типа WORD или INTEGER, то адрес инкрементируется на 2.
Пример:
LD AX, [BX]+ ; AX <-- MEM_WORD(BX) ; BX <-- BX + 2
ADDB AL, BL, [CX]+ ; AL <-- BL + MEM_BYTE(CX)
; CX <-- CX + 1 (ADDB_3op)
PUSH [AX]+ ; SP <-- SP - 2
; MEM_WORD(SP) <-- MEM_WORD(AX)
; AX <-- AX + 2
Рабочие регистры:
AX, BX, CX - 16-битные регистры;
AL, BL - младшие байты регистров AX, BX.
Непосредственная адресация. Непосредственная адресация позволяет брать операнд непосредственно из поля команды. Для операций с переменными типа BYTE или SHORT-INTEGER это будет 8-разрядное поле. Для операций с переменными типа WORD или INTEGER - 16-разрядное поле. Команда может содержать только один непосредственный операнд; для других операндов необходимо использовать Прямую Регистровую Адресацию.
Пример:
ADD AX, #340 ; AX <-- AX + 340 (ADD)
PUSH #1234h ; SP <-- SP - 2
; MEM_WORD(SP) <-- 1234h
DIVB AX, #10 ; AL <-- AX/10
; AH <-- AX MOD 10
Рабочие регистры:
AX - 16-и битный регистр;
AL - младший байт регистра AX;
AH - старший байт регистра AX.
Короткая индексная адресация. При короткой индексной адресации адрес одного из операндов вычисляется с помощью двух 8-битных полей. Одно 8-битное поле выбирает переменую типа WORD в регистровом файле, которая содержит адрес. Второе 8-битное поле в команде имеет знаковое расширение и суммируется с переменной типа WORD для формирования исполнительного адреса операнда. Исполнительный адрес может быть на 128 байт впереди от текущего адреса переменной типа WORD и на 127 байт после него. Команда может содержать только один такой операнд, другие операнды задаются с помощью прямой регистровой адресации.
Пример:
LD AX, 12[BX] ; AX <-- MEM_WORD(BX+12)
MULB AX, BL, 3[CX] ; AX <-- BL * MEM_BYTE(CX+3)
; (MULB_3op)
Рабочие регистры:
AX, BX, CX - 16-и битные регистры;
BL - младший байт регистра BX.
Длинная индексная адресация. Длинная индексная адресация похожа на короткую индексную адресацию за исключением того, что 16-битное поле берётся из команды и добавляется к переменной типа WORD для формирования адреса операнда. Нет необходимости в знаковом расширении. Такая адресация может применятся только для одного операнда в команде, для других операндов необходимо использовать Прямую Регистровую адресацию.
Пример:
AND AX, BX, TABLE[CX] ; AX <-- BX AND MEM_WORD(TABLE+CX)
; (AND_3op)
ST AX, TABLE[BX] ; MEM_WORD(TABLE_BX) <-- AX
ADDB AL, BL, LOOKUP[CX] ; AL <-- BL + MEM_BYTE(LOOKUP+CX)
; (ADDB_3op)
Рабочие регистры:
AX, BX, CX - 16-и битные регистры;
AL, BL - младшие байты регистров AX, BX.
Имеются также еще некоторые другие виды адресации, например, адресация с использованием нулевого регистра и адресация с использованием указателя стека, но они в рамках данного методического пособия не рассматриваются.
Систему команд MCS-196 условно можно разбить на 5 групп: арифметические команды, логические команды, команды передачи данных, команды ветвления программы, а также некоторые специальные команды. Рассмотрим особенности каждой группы команд в отдельности.
В приведенных ниже таблицах вводятся следующие обозначения:
wreg – любой двухбайтный регистр, но не ячейка верхней памяти;
breg – любой однобайтный регистр, но не ячейка верхней памяти;
lreg – любой четырехбайтный регистр (по сути – кусок ОЗУ процессора);
waop - операнд – слово, включая регистры, конкретные числа или ячейки из верхней памяти;
baop – то же, что и waop, но размером в байт;
laop – то же, что и waop, но размером в длинное слово;
(high) – старшая половина операнда (например, старшее слово для двойного слова);
(low) – младшая половина операнда;
sadr – адресное смещение – обычно вычисляется при компиляции и представляет собой разницу между текущим адресом и адресом метки, на которую выполняется переход;
& - знак логического побитного умножения;
OR – знак логического побитного сложения;
XOR – знак побитной операции “искл. ИЛИ”;
с – флаг C (carry) – переноса;
Арифметические команды
Микропроцессор MCS-196 может выполнять следующие операции, которые можно отнести к арифметическим:
сложение: с двумя операндами, с тремя операндами, с учетом флага переноса;
вычитание: с двумя операндами, с тремя операндами, с учетом флага переноса;
умножение: также с двумя или тремя операндами, может быть знаковое или беззнаковое, в операции могут участвовать как байты, так и 16-битные слова;
деление: аналогично умножению;
инкремент байта или слова;
декремент байта или слова;
очистка регистра размером в слово или байт;
сравнение двух операндов – слов, байтов или длинных слов;
знаковое расширение байта и слова.
изменение знака операнда.
Таблица ХХХХХХ
Название
Мнемоника команды |
Действие команды |
ADD wreg,waop |
wreg:=wreg+waop |
ADD wreg,waop1,waop2 |
wreg:=waop1+waop2 |
ADDB breg,baop |
breg:=breg+baop |
ADDB breg,baop1,baop2 |
breg:=baop1+baop2 |
ADDC wreg,waop |
wreg:=wreg+waop+c |
ADDC wreg,waop1,waop2 |
wreg:=waop1+waop2+c |
ADDCB breg,baop |
breg:=breg+baop+c |
ADDCB breg,baop1,baop2 |
breg:=baop1+baop2+c |
SUB wreg,waop |
wreg:=wreg-waop |
SUB wreg,waop1,waop2 |
wreg:=waop1-waop2 |
SUBB breg,baop |
breg:=breg-baop |
SUBB breg,baop1,baop2 |
breg:=baop1-baop2 |
SUBC wreg,waop |
wreg:=wreg-waop-c |
SUBC wreg,waop1,waop2 |
wreg:=waop1-waop2-c |
SUBCB breg,baop |
breg:=breg-baop-c |
SUBCB breg,baop1,baop2 |
breg:=baop1-baop2-c |
MUL lreg,waop |
lreg:=lreg*waop (знаковое) |
MUL lreg,waop1,waop2 |
lreg:=waop1*waop2 (знаковое) |
MULB wreg,baop |
wreg:=wreg*baop (знаковое) |
MULB wreg,baop1,baop2 |
wreg:=baop1*baop2 (знаковое) |
MULU lreg,waop |
lreg:=lreg*waop (беззнаковое) |
MULU lreg,waop1,waop2 |
lreg:=waop1*waop2 (беззнаковое) |
MULUB wreg,baop |
wreg:=wreg*baop (беззнаковое) |
MULUB wreg,baop1,baop2 |
wreg:=baop1*baop2 (беззнаковое) |
DIV lreg,waop |
(low)lreg:=lreg/waop (знаковое) (high)lreg:=lreg mod waop |
DIVB wreg,baop |
(low)wreg:=wreg/baop (знаковое) (high)wreg:=wreg mod baop |
DIVU lreg,waop |
(low)lreg:=lreg/waop (беззнаковое) (high)lreg:=lreg mod waop |
DIVUB wreg,baop |
(low)wreg:=wreg/baop (беззнаковое) (high)wreg:=wreg mod baop |
DEC wreg |
wreg:=wreg-1 |
DECB breg |
breg:=breg-1 |
INC wreg |
wreg:=wreg+1 |
INCB breg |
breg:=breg+1 |
CLR wreg |
wreg:=0 |
CLR breg |
breg:=0 |
CMP wreg,waop |
wreg-waop ? |
CMPB breg,baop |
breg-baop ? |
CMPL lreg,laop |
lreg-laop ? |
EXT lreg |
Знаковое расширение слова до двойного слова |
EXTB wreg |
Знаковое расширение байта до слова |
NEG wreg |
Изменение знака wreg |
NEGB breg |
Изменение знака breg |
Логические команды
Микропроцессор может выполнять следующие логические операции:
логическое умножение (с двумя или тремя байтовыми или словными операндами);
логическое сложение (с двумя или тремя байтовыми или словными операндами);
логическое исключающее ИЛИ (с двумя или тремя байтовыми или словными операндами);
логические сдвиги разных типов;
логическое дополнение.
ТаблицаХХХХХХХ
Название
Мнемоника команды |
Действие команды |
AND wreg,waop |
wreg:=wreg&waop |
AND wreg,waop1,waop2 |
wreg:=waop1&waop2 |
ANDB breg,baop |
breg:=breg&baop |
ANDB breg,baop1,baop2 |
breg:=baop1&baop2 |
OR wreg,waop |
wreg:=wreg OR waop |
ORB breg,baop |
breg:=breg OR baop |
XOR wreg,waop |
wreg:=wreg XOR waop |
XORB breg,baop |
breg:=breg XOR baop |
SHL wreg,baop |
Сдвиг wreg влево baop раз. Новые разряды заполняются нулями, число baop = 0..15, сдвиг происходит через флаг переноса |
SHLB breg,baop |
Сдвиг breg влево baop раз. Новые разряды заполняются нулями, число baop = 0..7, сдвиг происходит через флаг переноса |
SHLL lreg,baop |
Сдвиг lreg влево baop раз. Новые разряды заполняются нулями, число baop = 0..31, сдвиг происходит через флаг переноса |
SHR wreg,baop |
Сдвиг wreg вправо baop раз. Новые разряды заполняются нулями, число baop = 0..15, сдвиг происходит через флаг переноса |
SHRA wreg,baop |
Арифметический сдвиг wreg вправо baop раз. Заполнение появляющейся слева области зависит от знака первоначального числа. Смещение производится через флаг переноса. |
SHRAB breg,baop |
Арифетический сдвиг breg вправо baop раз. Заполнение появляющейся слева области зависит от знака первоначального числа. Смещение производится через флаг переноса. |
SHRAL lreg,baop |
Арифетический сдвиг lreg вправо baop раз. Заполнение появляющейся слева области зависит от знака первоначального числа. Смещение производится через флаг переноса |
SHRB breg,baop |
Сдвиг breg вправо baop раз. Новые разряды заполняются нулями, число baop = 0..15, сдвиг происходит через флаг переноса |
SHRL lreg,baop |
Сдвиг lreg вправо baop раз. Новые разряды заполняются нулями, число baop = 0..15, сдвиг происходит через флаг переноса |
NOT wreg |
Логическая инверсия wreg. Каждый бит операнда инвертируется |
NOTB breg |
Логическая инверсия breg. Каждый бит операнда инвертируется |
Команды передачи данных
Архитектура MCS-196 предусматривает применение различных мнемоник в случае передачи слов информации разной длины, а также, если приемник и источник имеют различную природу.
Поскольку передача данных может производится из регистровой памяти во внешнюю, и наоборот, а также внутри регистровой памяти и внутри внешней памяти, то возникают следующие мнемоники (таблица ХХХ).
ТаблицаХХХХ
Мнемоника команды |
Действие команды |
BMOV lreg,wreg |
Быстрое перемещение блока информации. В соседних регистрах lreg находятся указатели на источник и приемник, а в wreg-количество перемещаемых слов. Предупреждение: эта команда может выполнятся долго, так как она не прерывается |
BMOVI lreg,wreg |
По существу, тоже самое, что и BMOV, лишь с той разницей, что эта команда прерывается любым разрешенным прерыванием, а после возврата оттуда продолжается до конца. В связи с этим возникает необходимость перегружать счетчик, так как в этой команде он изменяется |
ST wreg,waop |
waop:=wreg Прямая пересылка информации. Подходит для копирования слова из регистра в ОЗУ |
STB breg,baop |
baop:=breg Прямая пересылка информации. Подходит для копирования байта из регистра в ОЗУ |
LD wreg,waop |
wreg:=waop Прямая пересылка информации. Подходит для копирования слова из ОЗУ в регистр, а также используется для пересылки между регистрами |
LDB breg,baop |
breg:=baop Прямая пересылка информации. Подходит для копирования байта из ОЗУ в регистр, а также используется для пересылки между регистрами |
LDBSE wreg,baop |
wreg:=baop Ввод байта из ячейки памяти в регистр-слово со знаковым расширением. Если принимаемый байт отрицателен, то слово дополняется единицами, если нет – то нулями. |
LDBZE wreg,baop |
wreg:=baop&00FFh Ввод байта из ячейки памяти в младший байт регистра. Старшая часть дополняется нулями |
Команды ветвления
У процессора MCS-196 очень развитая система команд ветвления. В наличии имеются 6 флагов, по каждому из которых может быть осуществлен переход. Переходы, к тому же, могут быть как близкие, так и дальние, а также прямые и косвенные.
Таблица ХХХХХ
Мнемоника команды |
Действие команды |
DJNZ breg,sadr |
Декрементируется breg. Если результат не нулевой, то выполняется короткий относительный переход на величину sadr |
DJNZW wreg,sadr |
Декрементируется wreg. Если результат не нулевой, то выполняется короткий относительный переход на величину sadr |
JBC breg,bitno,sadr |
Проверяется бит с номером bitno в регистре breg. Если бит сброшен, то выполняется короткий переход на sadr |
JBS breg,bitno,sadr |
Проверяется бит с номером bitno в регистре breg. Если бит установлен, то выполняется короткий переход на sadr |
JC sadr |
Выполняется короткий переход на sadr, если флаг C установлен |
JE sadr |
Выполняется короткий переход на sadr, если флаг Z (флаг нуля) установлен |
JGE sadr |
Переход, если знаковое больше либо равно |
JGT sadr |
Переход, если знаковое больше |
JH sadr |
Переход, если беззнаковое больше |
JLE sadr |
Переход, если знаковое меньше или равно |
JLT sadr |
Переход, если знаковое меньше |
JNC sadr |
Переход, если не было переноса (флаг C чист) |
JNE sadr |
Переход, если флаг Z равен 0 (получился ненулевой результат) |
JNH sadr |
Переход, если беззнаковое не больше |
JNST sadr |
Переход, если флаг ST не установлен |
JNV sadr |
Переход, если флаг V (переполнения) сброшен |
JNVT sadr |
Переход, если флаг VT чист |
JST sadr |
Переход, если флаг ST установлен |
JV sadr |
Переход, если флаг V установлен |
JVT sadr |
Переход, если флаг VT установлен |
LCALL wadr |
Выполняется длинный переход на подпрограмму без условий. На стек заносится текущее PC, и выполняется переход на адрес, равный wadr+PC |
LJMP wadr |
Выполняется длинный переход в точку памяти с адресом wadr+PC. Без условий |
RET |
Возврат из подпрограммы. Со стека снимается верхнее слово и выполняется переход по полученному адресу |
RST |
Сброс системы. Устанавливает PSW = 0, PC= 2080h, на ножке RESET появляется 0 в течении 16 тактов |
SCALL sadr |
Как и в LCALL, происходит переход на подпрограмму. В качестве смещения для расчета адреса используется число от 1024 до –1023 |
SJMP sadr |
Аналогично LJMP – переход по указанному адресу. Смещение в диапазоне от –1023 до +1024. ВНИМАНИЕ! В связи с ошибкой компилятора в прилагаемой версии PDS (читайте ниже) команда SJMP не будет работать на реальном процессоре. И использовать ее НЕЛЬЗЯ!!! |
Специальные команды.
Процессоры 8xc196KC и 8xc196KD располагают некоторым набором специфических команд. Их нельзя отнести ни к одному из вышеприведенных типов команд, поэтому они сведены в таблицу ХХХХ.
ТаблицаХХХХХ
Мнемоник команды |
Действие команды |
DI |
Запрещает прерывания. Запросы на прерывания не удовлетворяются после этой команды |
EI |
Разрешает прерывания, запрещенные ранее командой DI |
DPTS |
Блокирует вызов сервера периферийного обмена (PTS) |
EPTS |
Разблокирует вызов сервера периферийного обмена (PTS) |
NOP |
Однобайтная команда, которая ничего не делает |
SKIP |
Еще одна команда, которая не производит никаких действий. Отличается от NOP тем, что занимает 2 байта |
PUSH waop |
Запись слова waop в стек |
POP waop |
Снимает слово со стека и помещает его в waop |
PUSHF |
Записывает содержимое регистра PSW в стек |
POPF |
Снимает слово PSW со стека |
XCH wreg,waop |
Обменивает информацией wreg и waop |
XCHB breg,baop |
Вариант предыдущей команды для байтовых переменных |