Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микроконтроллеры семейства MCS-196.DOC
Скачиваний:
67
Добавлен:
02.05.2014
Размер:
1.09 Mб
Скачать

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

Вариант предыдущей команды для байтовых переменных