Система команд 16-разрядного процессора первого поколения

 

Система команд ВМ86 состоит из 91 мнемокоманд и позволяет совершать операции над байтами, двухбайтовыми символами, отдельными битами, а также цепочками байтов и слов.

По функциональному признаку система команд МП 8086 разбивается на 6 групп:

1) Пересылка данных;

2) Арифметические операции;

3) Логические операции и сдвиги;

4) Передача управления;

5) Обработка цепочек;

6) Управление процессором.

 

Команды пересылки данныхсоставляют 4 подгруппы:

1) общие;

2) обращение к стеку;

3) ввода-вывода;

4) пересылка цепочек.

Эти команды, за исключением РОРF и SAHF, не влияют на флаги. Команда MOV осуществляет пересылку содержимого источника src в получатель dst.

Команда MOV r1/m, r2/m обеспечивает пересылки регистр-регистр/память-память при использовании любого общего регистра и любого способа адресации.

Команда MOV r/m, d позволяет передать непосредственные данные в общий регистр или ячейку памяти.

MOV sr, r/m и MOV r/m, sr осуществляют пересылки между сегментным регистром и регистром или памятью. При этом передаются только слова, а ячейка памяти может быть определена с помощью любого допустимого способа адресации.

MOV ас, mи MOV m, ас предназначены для загрузки и запоминания содержимого аккумуляторов AL и AХ при использовании прямой адресации.

Обращение производится к текущему сегменту данных, и адрес, указанный в команде, представляет смещение в этом сегменте. Если пересылаются два байта, то младший располагается по указанному адресу, а старший – по следующему. Так как не существует непосредственной загрузки сегментных регистров, то команда MOV sr, r/m используется для инициализации регистров SS, DS и ES, т.е. для определения соответствующих сегментов памяти. Если, например, в регистр DS необходимо загрузить число 8000, то используют две команды:

MOV АХ, 8000Н

MOV DS, АХ

При этом в качестве промежуточного регистра обычно используют АХ, т.к. команда MOVас, d короче более общей команды MOV m/r, d.

Возможна также инициализация сегментных регистров из программной памяти при использовании префикса замены сегмента для замены DS на СS при вычислении адреса ЕА в следующих командах с прямой адресацией. При замене сегмента новый сегментный регистр указывается явно.

MOV DS, СS : АDS; Инициализация DS

MOV ЕS, СS : АЕS; инициализация ЕS

MOV SS, СS : АSS; инициализация SS

Следует помнить, что в МП ВМ86 обеспечивается защита процесса инициализации регистров SS и SР, состоящего из двух команд, от прерываний, чтобы гарантировать правильную работу стека.

MOV SS, СS : АSS

MOV SР, СS : АSР

Операнды АDS, АЕS, АSS, АSР обозначают адреса ячеек памяти, в которых хранятся базовые адреса соответствующих сегментов.

Команда

XCHG dst, sre; dst «sre

 

осуществляет обмен данными между источником и получателем и имеет два формата. Общий формат позволяет произвести обмен содержимым любой пары общих регистров, а также между общим регистром и ячейкой памяти при любом допустимом способе адресации. Указанный формат осуществляет обмен любого РОН и аккумулятора АХ.

Команда XCHG АХ,АХ, код которой 90Н, используется как команда операции NOP, обеспечивающая задержку на время 3Т.

Однобайтная команда XLAT c кодом операции D7 предназначена для быстрого преобразования кодов и заменяет содержимое AL на байт из 256-байтовой таблицы, начальный базовый адрес которой содержится в регистре ВХ, т.е. содержимое AL используется как индекс таблицы, находящейся в сегменте данных и адресуемой регистром ВХ. При выполнении этой команды, к содержимому ВХ прибавляется содержимое AL, а полученный результат используется как смещение относительно DS. Адресуемый таким образом байт из памяти пересылается в AL.

Команды LEA, LDS, LES отличаются от других команд пересылки тем, что при их выполнении в адресуемый регистр (регистры) передаются не собственно данные из памяти, а адреса. Основное назначение этих команд – инициализация регистров перед выполнением цепочечных команд, или перед вызовом подпрограммы.

LEA r,m обеспечивает вычисление эффективного адреса ЕА ячейки памяти в соответствии с указанным способом адресации и загрузку ЕА (а не содержимого адресуемой ячейки памяти) в указанный РОН. Такая операция может потребоваться, например, для загрузки начального адреса таблицы в регистр ВХ перед выполнением команды XLAT.

Стек, как обычно, организуется в ОЗУ и его положение определяется содержимым регистров SS и SР. Регистр SS хранит базовый адрес текущего сегмента стека, а регистр SР указывает на вершину стека в стековом сегменте. При каждом обращении к стеку пересылается одно слово, а содержимое SР модифицируется автоматически, при записи в стек оно уменьшается на 2, при чтении из стека – увеличивается на 2.

При всех достоинствах организации памяти ВМ86 она имеет некоторый недостаток, заключающийся в трудности манипуляции физическими адресами при необходимости их программной обработки.

Команды ввода-вывода.Ввод-вывод данных может осуществляться двумя способами: с использованием адресного пространства ввода-вывода и с использованием общего с памятью адресного пространства. При первом способе применяются команды IN, OUT, которые обеспечивают передачу данных между аккумуляторами AL или АХ и адресуемыми портами.

При выполнении этих команд вырабатывается сигнал M/IО=0, который вместе с сигналами WR и RD позволяет сформировать системные сигналы IWO и IOR для управления операциями записи данных в порт или чтения из порта.

Команды IN и OUT могут использовать прямую адресацию (аналог с ВМ80) и косвенную, когда адрес порта содержится в регистре DХ. В первом случае можно адресовать 256 портов. Во втором – до 64К 8-битовых или 32К 16-битовых портов. Косвенная адресация позволяет вычислять адреса портов при выполнении программы, и удобна при организации вычислительных циклов для обслуживания нескольких портов с помощью одной процедуры. Ячейки с адресами F8 – FF зарезервированы для системных целей, и использовать их в прикладных программах не рекомендуется.

При втором способе адресации обращение к портам не отличается от обращения к ячейкам памяти, т.е. для ввода-вывода можно использовать любую команду обращения к памяти при любом способе адресации. Однако следует учитывать, что команды обращения к памяти имеют больший формат и выполняются дольше, чем простые команды IN и OUT. Кроме того, усложняется декодирование 20-битового физического адреса порта и сокращается число адресов, которые могут использоваться для ячеек памяти.

МП может передавать по ШД байт или слово из ВУ. Чтобы слово передавалось за один цикл шины, адрес ВУ должен быть четным. Адрес байтового ВУ может быть четным или нечетным, и соответственно порты этих ВУ должны подключаться к линиям младшего и старшего байта ШД. Для раздельного обращения к этим портам дешифрирование адресов осуществляется с учетом сигналов на линиях ВНЕ и А0.

Цепочные команды (обработки строк).Под цепочкой (строкой) понимают последовательность любых контекстно-связанных байт или слов, находящихся в смежных ячейках памяти. В системе команд МП К1810ВМ86 имеется пять однобайтных команд, предназначенных для обработки одного элемента цепочки за прием. Цепочной команде может предшествовать специальный однобайтовый префикс повторения REP. Число повторений задается регистром СХ. Например, последовательность команд

MOV CX, 500

REP MOVS DST, SRC

заставит МП выполнять команду MOVS 500 раз, уменьшая значение регистра СХ после каждого повторения, до тех пор, пока <СХ> не станет равным 0.

Остальные префиксы повторения, решение о продолжении или прекращении повторений принимают в зависимости от значения флага ZF:

REPE (repeat while equal) пока равно;

REPZ (repeat while zero) повторять пока нуль;

REPNE

REPNZ

КомандаLODS (load string) пересылает операнд строка-источник, адресованный регистром SI, из сегмента данных в регистр АL или АХ, а затем изменяет SI так, чтобы он указывал на следующий элемент строки. Его значение увеличивается, если флаг направления DF равен 0, и уменьшается, если DF=1. Формат команды имеет вид

LODS SRC ; <AC><SRC>.

Допускается использование мнемокодов LODSВ и LODSW, указывающих тип строки (цепочки).

Пример:

Сравнить строки DSТ и SRC длиной 500 байтов каждая. В случае обнаружения первого несовпадения, элемент строки LODS загрузить в регистр АL.

CLD

LEA DI, ES : DST

LEA SI, SRC

MOV CX, 5000

REPE CMPSB

JCXZ M1 ; Выйти, если СХ=0, на метку М1

DEC SI ; Подправить регистр SI

LODS SRC ; считать элемент в АL

…………….

M1: ……………….

 

Команда сохранения строки STOS (stove string) служит для запоминания содержимого аккумулятора в элементе строки, адресуемом регистром DI. После выполнения команды содержимое DI увеличивается на 1. Формат команды

STOS DST ; DST:=<AC>

Сегментный адрес для этой команды всегда находится в сегменте ES, а префикс замены сегмента не используется. Тип элементов строки можно указывать с помощью мнемокодов STOSB и STOSW.

Пример: Просмотреть строку W_STRING длиной в 200 слов. Если обнаружен не нулевой элемент, то он и следующие за ним 5 слов обнуляются.

CLD

LEA DI, ES : W_STRING

MOV АX, 0

MOV CX, 2000

REPNE SCASW

JCXZ ALLO

SUB DI, 2

MOV CX, 6

REP STOS W_STRING

ALLO: ……………….

Команда пересылки строк MOVS используется для копирования байта или слова из одной части памяти в другую. Она имеет формат

MOVS DST, SRC ; DST:=< SRC>

Здесь строка-источник находится в сегменте данных DS, а строка приемник – в дополнительном сегменте ЕS. Байт или слово источника, адресуется регистром SI, а получатель DI. После выполнения команды значения SI и DI модифицируются для указания следующих элементов строк.

При флаге DF=0 осуществляется автоинкрементация, а при DF=1 – декрементация.

Пример: Скопировать 100 байтов из строки SRC в строку DST.

CLD ; Установить DF=0 для обработки строки слева направо

LEA SI, SRC ; Занести смещение адреса SRC в SI, а

LEA DI, ES: DST ; смещение адреса DST в DI

MOV CX, 100 ; Установить счетчик элементов

REP MOVS DST, SRC ; Скопировать байты.

Обычно ассемблер (в зависимости от версии) допускает использование для передачи цепочки мнемокоды MOVSВ (move byte string) или MOVSW (move word string), которые определяют тип элементов строки 8-байт w-слово. При этом операнды в команде могут отсутствовать.

Команды сравнения строк CMPS (compare string). Формат команды имеет вид:

CMPS SRC, SRC ; < SRC > = < DST > ?

Эта команда производит вычитание байта или слова строки DST, адресуемой регистром DI из байта или слова цепочки SRC, адресуемой регистром SI. В зависимости от результата вычитания устанавливаются флажки, но сами операнды не изменяются.

Когда перед CMPS находится префикс REPЕ или REPZ операция интерпретируется как «сравнивать, пока не достигнут конец строки», (или пока элементы строки не будут равны). При наличии префикса REPNЕ или REPNZ операция интерпретируется как «сравнивать, пока не достигнут конец строки» (или пока элементы строки будут равны).

Например, команды

CLD

MOV CX, 100

REPЕ СMРS DST, SRC

будут сравнивать до 100 пар элементов строк SRC - DST, пытаясь найти два несовпадающих элемента.

Команды

CLD

MOV CX, 100

REPNЕ СMРS DST, SRC

будут сравнивать до 100 пар элементов строк SRC и DST, пытаясь найти два совпадающих элемента. Для явного указания типа элементов строки обычно допускаются мнемокоды СMРS и СMРSW, при этом операнды в команде отсутствуют.

Команда сканирования SCASимеет формат:

SCAS DST ; <ac> - <dst>

По этой команде вычитается элемент строки DST (байт или слово), адресуемое регистром DI, из содержимого аккумулятора AL или АХ. В соответствии с полученной разностью устанавливаются флажки, но значение операндов не изменяется.

Для выполнения действий более чем над одним элементом строки, надо воспользоваться префиксами повторения REPЕ (REPZ) или REPNЕ (REPNZ).

Например, с помощью последовательности команд

CLD

LEA DI, ES: B_STRING

MOV AL,

MOV CX, 100

REPE SCAS B_STRING

можно просмотреть до 100 элементов строки байтов B_STRING в поисках элемента, отличного от пробела. Для явного указания типа элементов строки, обычно используются мнемокоды SCASВ и SCASW.

Команды безусловной и условной передачи управления.

Команды передачи управления используются в разветвляющихся и циклических программах, а также при вызове подпрограмм и возврате из них.

Сегментная организация памяти определяет два основных типа команд передачи управления: внутрисегментные NEAR (близкие) и межсегментные FAR (дальние). При выполнении команды типа NEAR модифицируется только регистр IP, и адрес переходов представляется одним словом и даже байтом, если используется короткий вариант перехода с ограниченным диапазоном адресов. При выполнении команды типа FAR изменяется содержимое регистров IP и CS и адрес перехода представляется двумя словами (сегмент:смещение), что позволяет перейти в любую точку адресного пространства памяти.

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

Команды безусловных переходов JMP производят модификацию регистра IP или регистров IP и CS без сохранения прежних значений этих регистров. Имеется три формата команды JMP типа NEAR, осуществляющих переход в пределах текущего кодового сегмента, и два формата типа FAR, осуществляющих переход в любую точку адресного пространства.

В двухбайтовой команде JMP dispL во втором байте содержится смещение, которое интерпретируется как знаковое целое. Это смещение добавляется (с предварительным расширением знака до 16 бит) к содержимому IP, которое соответствует адресу команды, находящейся после данной команды. Диапазон смещения dispL составляет от –128 до +127, причем при положительном смещении осуществляется переход вперед, а при отрицательном – назад. Данная команда реализует короткий переход, который в мнемоническом обозначении отмечается указателем SHORT (например, JMP SHORT COUNT – короткий переход к метке).

Трехбайтная команда JMP disp производит такое же действие, как и предыдущая команда, но содержит 16-битовое смещение (ассемблерный указатель NEAR PTR). Это смещение интерпретируется как знаковое число в диапазоне –32 768 до +32 767, что обеспечивает переход в любую точку кодового сегмента.

Команда JMP r/m осуществляет косвенный внутрисегментный переход (ассемблерный указатель WORD PTR), при котором в регистр загружается содержимое регистра или ячейки памяти.

Команда JMP m реализует косвенный межсегментный переход (ассемблерный указатель DWORD PTR) через содержимое двух ячеек памяти.

Команда JMP addr реализует прямой межсегментный переход (ассемблерный указатель FAR PTR) и содержит 4 байта адреса перехода: два байта сегментное смещение загружается в IP, а два байта – в регистр CS.

Команды вызова подпрограмм CALL имеют такие же форматы, как и команда JMP и выполняются аналогичным образом, за исключением того, что автоматически запоминается адрес возврата (т.е. адрес команды, следующий за командой CALL). С этой целью при внутрисегментных вызовах в стеке запоминается содержимое регистра IP, а при межсегментных вызовах – сначала содержимое IP, а затем CS.

Команды возвратов RET из подпрограмм возвращают управление программе, осуществившей вызов. Такая передача управления осуществляется путем извлечения из стека адреса возврата. Поэтому команды возврата не содержат никакой адресной информации.

Тип команды возврата выбирается в соответствии с типом команды CALL, осуществивший вызов данной подпрограммы. Каждая подпрограмма должна обязательно содержать команду возврата. Команды условных переходов осуществляют передачу управления в зависимости от значения флаговых регистров. Имеется 18 команд условных переходов, которые представлены единым двухбайтовым форматом, позволяющим осуществлять короткие (в пределах от –128 до +127) переходы относительно указателя команд IP.

 

 

6.6. Способы адресации памяти и устройств ввода/вывода

 

Команды микропроцессора Intel 8086 реализуют разнообразные способы адресации, что упрощает организацию и использование сложных структур данных, а также расширяет возможности отдельных команд и повышает гибкость их применения.

1. Регистровая адресация. Операнд находится в одном из общих регистров МП, а в некоторых командах в одном из сегментных регистров.

Примеры:

MOV AX, SI ; <SI>®<AX>

ADD DI, BX ; <BX>+<DI>

AND CL, AX ; Ошибка, несоответствия размеров регистров

XOR AL, AH ; XOR <AL> и <AH>.

2. Непосредственная адресация. Операнды представляют собой константы длиной 8 или 16 бит, содержащиеся в командах. В МП нет команд непосредственной загрузки регистров.

SUB AL, 30H ; <AL>- 48 (30H = 48D)

MOV CL, 10 ; (10®<CL>)

AND AX, 0F000H ; Выделить старших 4 бита в AX

XOR DH, 1 ; Инвертировать младший бит в DH

CMP BL,40H ; Сравнить содержимое BL с числом 64.

3. Прямая адресация. Эффективный адрес берется из поля смещения команды:

 

MOV AX, GAMMA ; В Акк АХ загружено содержимое ячеек памяти

; с адресом, полученным суммированием

; <DS> сдвинутого на 4 разряда с адресом

; переменной GAMMA, определенном в ячейке программы.

ADD TEMP, BL ; <BL>+ <<DS>­4+TEMP>

 

4. Косвенная регистровая. Эффективный адрес (ЕА) находится в одном из базовых или индексных регистров. В косвенной адресации могут использоваться только регистры ВХ, SI, DI. Косвенные регистровые операнды заключают в квадратные скобки.

ADD AX, [DI] ; К <AX> прибавляется содержимое ячейки памяти,

; адрес который находится в DI.

; исполнительный адрес: <DS>­4+ <DI>.

MOV [SI], CL ; <<SI>> < CL>

 

5. Базовая адресация (база + смещение). ЕА определяется суммой значения смещения, указанного в команде и содержимого регистров ВХ или ВР.

К операциям в памяти можно адресовать, указывая прямой адрес, т.е. называя имя соответствующей области памяти, либо косвенные - через регистры-указатели, или индексные регистры. При прямой адресации 16-ричное смещение автоматически складывается с базовым адресом соответствующего сегмента. При косвенном обращении участвуют один или два из четырех регистров. Они указываются в квадратных скобках [ ] – признак косвенной адресации ВХ, ВР, SI, DI. Если указывается переменная, за ее именем следует выражение в квадратных скобках, которое задает базовые или индексные регистры.

В случае косвенной адресации может быть указан либо только базовый регистр, либо только индексный, либо оба регистра и может быть также указано 8 или 16-битовое смещение.

MOV AX, [BX] ; переслать слово из памяти в АХ. Слово находится в сегменте

; данных, адрес этого сегмента в регистре DS, смещение

; относительно этого адреса в регистре ВХ.

К операндам, находящимся в памяти, можно обратиться одним из четырех способов:

Указанием прямого 16-разрядного смещения

 

MOV REPORT, AL ;в байт памяти с именем REPORT пересылается содержимое AL

; ([DS]­4+[REPORT])®AL

Использованием косвенного обращения через базовый регистр, содержимое которого суммируется с 8 или 16-разрядным смещением.

MOV ON[BX+2], AL

MOV BL, ON[BP]

Использованием косвенного обращения через индексный регистр, содержимое которого суммируется со смещением

MOV CL, ITEM[SI+1]

MOV ON[DI+1], CL

Использованием косвенного обращения через базовый и индексный регистры, содержимое которых суммируется со смещением

MOV AH, ITEM[BX+1] [SI+1]

MOV ON[BX+1][DI+1]

При определении ВР в качестве базового регистр обращение осуществляется к текущему сегменту стека SS (если нет префикса замены сегмента). Это делает базовую адресацию с регистром ВР очень удобным средством обращения к данных, находящимся в стеке. Обычно базовый регистр BREG указывает на начало структуры данных, а требуемый элемент адресуется с помощью смещения (расстояния) от базы.

Для обозначения базовой адресации используют два представления:

1) [BREG] DISP BREG – базовый регистр (ВХ или ВР)

2) [BREG+ DISP]

Пример записи команд с базовой адресацией:

MOV AX, [BP]10 ; Обе команды передают шестое слово массива, адресуемое ВР,

MOV AX, [BP+10] ; в Аккумулятор,

ADD [BX]TEMP,CX ; Прибавить <СХ> к слову ТЕМР в массиве, адресуемом ВХ.

6. Индексная адресация (смещенная база + индекс). Этот вид адресации называют адресацией с индексированием. Эффективный адрес вычисляется как сумма смещения, находящегося в команде, и содержимого индексного регистра DI или SI. Адресация удобна при доступе к элементам таблицы (массива), когда смещение указывает на начало таблицы (массива), а индекс – на элементы в таблице (массиве). По существу индексная и базовая адресация в МП К1810 аналогичны. Это объясняется тем, что базовые и индексные регистры имеют одинаковую длину. Индексная адресация обозначается в виде TABL[IREG]. Здесь TABL – 16-битовое смещение (адрес начала таблицы).

Примеры:

MOV ADRM [SI], AX ; Передать <АХ> в элемент массива с начальным

; адресом ADRM

ADD CX, MASS [DI] ; Прибавить к <СХ> элемент массива.

; MASS – смещение, указанное в команде.

Пример: Загрузить 3-й элемент массива в аккумулятор АL.

table DB 10, 20, 30, 40

MOV DI, 2 ; загрузить в индексный регистр номер выбираемого байта

; минус 1 (т.к. массив начинается с нулевого элемента)

MOV AL, TABLE [DI] ; загрузить 3-й байт таблицы в AL.

Примеры записи базового индекса адресации:

MOV AX, [BX+2+DI] ; Операнды можно заключать в скобки

MOV AX, [DI+BX+2] ; в любом порядке, а сдвиг можно

MOV AX, [BX+2][DI] ; сочетать с любым из регистров

MOV AX, [BX][DI+2]

7. Базово-индексная адресация (по базе с индексированием). Эффективный адрес равен сумме содержимого базового регистра, индексного регистра и, возможно, смещения, указанного в команде. Этот способ целесообразно использовать при работе с двумерными таблицами. В этом случае базовый регистр содержит начальный адрес массива, а значения смещения и индексного регистра является смещением по строке и столбцу. В ассемблере МП 1810ВМ86 базово-индексная адресация представляется в виде: [BREG]АDR16[IREG].

Пример: загрузить в АХ 16-разрядный элемент таблицы, состоящей из 4-х столбцов и 3-х строк, находящийся в третьей строке на третьей позиции (3,3) [а22, если в таблице считать 0-й столбец и 0-ю строку].








Дата добавления: 2016-02-09; просмотров: 2077;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.048 сек.