Команды микропроцессорной техники

         

Команда MVI


Команда MVI отличается от команды MOV тем, что в качестве источника данных используется восьмиразрядная константа, которая следует непосредственно за кодом операции. Приемником данных является регистр r или ячейка памяти М.

MV1         С,data8;               data8>С

Команда LXI

Команда LXI может быть использована для загрузки регистровых пар (B-пары,

D-пары, H-пары) и указателя стека SР шестнадцатиразрядным числом, которое непосредственно следует за кодом операции.

LXI           D,data16;                      data16>( D,E )

Команды LDA, STA

По команде LDA в аккумулятор загружается содержимое ячейки памяти, адрес которой следует за кодом операции. По команде STA содержимое аккумулятора записывается в ячейку памяти, адрес которой следует за кодом операции.

LDA          addr16;             addr16 A

STA          addr16;                         A addr16

Команды LDA и STA являются трехбайтными. В первом байте содержится код операции, во втором байте

 - младший байт адреса ( addrмл ), а в третьем байте
 - старший байт адреса ( addrст ).

Команда LDAX.

По команде LDAX в аккумулятор загружается содержимое ячейки памяти, адресуемой регистровой парой (B,C) или (D,E). Команда STAX осуществляет передачу содержимого аккумулятора в ячейку памяти, адресуемой регистровой парой (B,C) или (D,E).



LDAX        В;                    косвенная адресация. Предварительно в В-пару загружается адрес ячейки, содержимое которой загружается в аккумулятор.

Операции с портом.

Команды IN и OUT управляют обменом информации между аккумулятором А и портами ввода-вывода. В команде IN (ввод) источником является порт ввода port, а приемником - аккумулятор А. В команде OUT (вывод) источником является аккумулятор А, а приемником порт вывода port. Адрес порта непосредственно следует за кодом операции IN или OUT.

IN             addrport;

OUT          addrport;

Работа со стеком.

Команда LXI

LXI           SР,data16;        data16 SР. С этого момента известно, где в памяти находится стек.

Команды пересылок PUSH (Поместить в стек) и РOP (Вытолкнуть из стека) всегда оперирует с регистровой парой (B,C), (D,E), (H,L) или парой регистров (А,РП), образующей слово состояния программы PSW.
Напомним, что указатель стека SP содержит адрес той ячейки в стеке, в которую в последний раз была записана информация, т.е адрес верха стека.

По команде PUSH (Поместить в стек) выполняются действия:

а) содержимое SP сначала уменьшается на 1 (декрементируется);

б) старший байт загружается в стек;

в) содержимое SP вновь декрементируется;

г) младший байт загружается в стек.

PUSH        В;        Записать в стек В-пары

По команде РОР (Вытолкнуть из стека) выполняются обратные действия. Сначала младший байт выталкивается из стека в МП и содержимое SP увеличивается на 1 (инкрементируется). Затем старший байт выталкивается из стека в МП и содержимое SP инкрементируется.

POP          В;        вытолкнуть из стека в В-пару

2) Арифметические команды.

Под управлением команд этой группы микропроцессор может выполнять в АЛУ арифметические операции. Напомним, что МП I8080 выполняет только сложение и вычитание. Поскольку этот МП является одноадресным, то один из операндов в арифметических операциях всегда помещается в аккумулятор, неявно адресуемый самим кодом операции. Вслед за кодом операции необходимо указывать местонахождение второго операнда. Результат (сумма или разность) помещается в аккумулятор. Операнд, который перед арифметической операцией находился в аккумуляторе, после выполнения операции уничтожается.

Команда сложения ADD, ADC

ADD         r;         А+В>А

ADC         r;         А+В+CY>A

Команда ADC является разновидностью команды ADD. По команде ADC происходит не только сложение двух операндов, но и сложение с признаком переноса CY, оставшимся от предыдущей операции. Результат сохраняется в аккумуляторе.

Команда сложения ADI, AСI

Команда ADI осуществляет сложение операнда, который непосредственно следует за кодом операции, с содержимым аккумулятора. По команде AСI непосредственный операнд суммируется с содержимым аккумулятора и с признаком переноса CY

ADI           data8;   А+ data8 >А

ACI           data8;    А+ data8 +CY>A

Команда вычитания SUB, SBB



Команда SUB позволяет микропроцессору непосредственно вычесть содержимое одного из регистров общего назначения или ячейки памяти М из содержимого аккумулятора. Команда SBB является разновидностью команды SUB. По этой команде осуществляется вычитание с заемом.

SUB          r                                  A – r >A

SUB          M                                A – M >A

SBB          r                                   A – r - CY >A

SBB          M                                A – M - CY >A

Команда вычитания SUI, SBI

По команде SUI из содержимого аккумулятора вычитается операнд, который непосредственно следует за кодом операции. По команде SBI  из содержимого аккумулятора вычитается и непосредственный операнд, и признак заёма CY.

SUI           data8;   А+ data8 >А

SBI            data8;   А+ data8 +CY>A

Внимание!

Все описанные арифметические команды сложения  и вычитания изменяют (модифицируют) содержимое всех признаков регистра признаков.

Команды INR, DCR

Команда INR является разновидностью команды ADD. По этой команде МП увеличивает на 1 содержимое одного из регистров РОН, аккумулятора или ячейки памяти М. Команда DCR является разновидностью команды вычитания SUB. По этой команде МП уменьшает на 1 содержимое одного из регистров РОН, аккумулятора или ячейки памяти М.

INR           r                      r + 1 > r

INR           M                    M + 1 > M

DCR          r                      r – 1 > r

DCR          M                    M – 1 > M

Внимание!

Эти команды модифицируют все признаки за исключением признака переноса CY.

Команды INX, DCX

Команда инкремента INX и декремента DCX позволяют соответственно увеличить и уменьшить на 1 содержимое регистровых пар (B-, D- , H- пары) и указателя стека SP.

INX           rp;                   rp + 1 > r

DCX         rp;                   rp – 1 > r

Внимание!

Эти команды не модифицируют регистр признаков.

Команды DAD, DAA

Команда двойного сложения DAD суммирует содержимое регистровой пары (H,L) и адресуемой регистровой пары rp (rp это B-,D- H- пары, SP)



DAD         rp;                   (H,L) + rp > (H,L)

Внимание!

Эта команда модифицирует только признак переноса.

Команда десятичной коррекции аккумулятора DAA осуществляет перевод 8-разрядного двоичного числа в аккумуляторе в две цифры двоично-десятичного кода с правильной установкой признака переноса CY. При этом производятся следующие действия:

1. Если младшая тетрада содержит число, больше 910, или установлен признак вспомогательного переноса АС=1, то содержимое аккумулятора увеличивается на 610.

2. Если после этого старшая тетрада аккумулятора содержит число, большее 9, или установлен признак вспомогательного переноса CY=1, то в старшую тетраду прибавляется 610

Внимание!

При десятичной коррекции модифицируются все признаки регистра признаков.

3)     Логические команды и команды сдвига.

С помощью команд логических операций и сдвигов могут быть выполнены следующие действия:

                  - логические операции И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ (сложение по модулю 2) с использованием двух операндов. Один из операндов всегда размещается в аккумуляторе. Результат выполнения команды фиксируется в аккумуляторе.

Команда ANA

Команда ANA осуществляет логическую операцию И над содержимым аккумулятора и содержимым одного из регистров РОН, аккумулятора и ячейки М

ANA         r;                     A & r> A

ANA         M;                   A & M> А

Команда ORA

Команда ORA реализует логическую ИЛИ над содержимым аккумулятора и содержимым одного из регистров РОН, аккумулятора и ячейки М

ORA         r;                     A

r>A

ORA         M                    A
M>А

Команда XRA

Команда XRA осуществляет логическую операцию ИСКЛЮЧАЮЩЕЕ ИЛИ над содержимым аккумулятора и содержимым одного из регистров РОН, аккумулятора и ячейки М

XRA          r;                     A
 r> A

XRA          M;                   A
 M> А

Команды ANI, ORI, XRI

Эти команды отличаются от команд ANA, ORA, XRA тем, что второй операнд следует непосредственно за кодом операции.



ANI           data8;               A & data8> A

ORI           data8;               A
 data8> A

XRI           data8;               A
 data8> A

Команды CMP, CPI

Команда CMP используется для сравнения двух чисел, одно из которых находится в аккумуляторе, а другое в одном из регистров РОН, аккумуляторе или ячейке М. При сравнении одно из чисел вычитается из другого числа. В соответствии с результатом формируются признаки регистра признаков. Содержимое аккумулятора при этом не изменяется.

CMP         r;                                             A – r

CMP         M;                                           A – M

CPI           data8                            A – data8

Разница между командами CMP и SUB в том, что при выполнении команды CMP результат операции не фиксируется в аккумуляторе.

Внимание!

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

Команда CMA

Команда CMA используется для инвертирования содержимого аккумулятора.

CMA;                              
> А

Внимание!

Команда CMA не модифицирует регистр признаков.

Команды STC, CMC

SТС;                                                        1 > CY

CMC;                                                      
> CY

Команда STC устанавливает признак переноса CY. Команда CMC инвертирует признак переноса.

Команды сдвига RLC, RRC, RAL, RAR

Если надо произвести операции сдвига над данными, то их необходимо предварительно поместить в аккумулятор. Операндом однобайтных команд сдвига является содержимое аккумулятора, в котором формируется результат. Сдвиги выполняются влево (RLC, RAL) и вправо (RRC, RAR) только на один разряд. Выполнение команд сдвига поясняется на рисунке ниже.



Рис. Команды сдвига

4)     Команды управления.

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


Для этого достаточно загрузить в СК адрес новой ячейки, называемой адресом перехода. Такая процедура называется передачей управления, а команды, которыми она реализуется, называются командами передачи управления .

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

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

По команде условной передачи управления переход по программе осуществляется только при условии, что содержимое одного из признаков регистра признаков РП соответствует определенному условию. Если это условие не выполняется, то переход не осуществляется и программа выполняется в соответствии с командой, следующей за командой условной передачи управления.

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

JMP          addr     ;адрес addr известен

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

По признаку нуля:

JZ              addr;                Переход, если Z=1

JNZ           addr;    Переход, если Z=0

По признаку переноса CY:

JС             addr;                Переход, если CY=1

JNС addr  ;                       Переход, если CY=0

По признаку знака:

JМ             addr;                Переход, если S=1

JР              addr;                Переход, если S=0

По признаку паритета:

JРЕ            addr;                Переход, если Р=1

JРО           addr;                Переход, если Р=0

Особенной командой безусловной передачи управления без возврата оказывается команда PCHL; HL PC, в результате выполнения которой МП продолжает программу с адреса, загружаемого в счетчик команд РС из регистровой пары (H,L).

Команды вызова подпрограмм

Особая команда RST      n (n=0..7) вызова предназначена для обработки прерывания и введения контрольных точек (разрывов) при отладке программ. Она называется рестартом (повторным запуском). В коде операции рестарта 11ААА111(2) три разряда ААА формируется подсистемой прерываний (аппаратные прерывания) или указываются программистом (программные прерывания).

. Выполнение команды рестарта сводится к двум действиям:



- текущее содержимое счетчика команд РС загружается в стек;

- в счетчик РС подается код 00000000 00ААА000(2).

Следовательно, в зависимости от значения трех разрядов ААА МП переходит к одной из 8 ячеек: 000016, 000816, 001016 , 001816 , 002016 , 002816 , 003016 , 003816 .

CALL        addr;    команда вызывает подпрограмму, находящуюся по адресу addr. По этой команде выполняются действия, необходимые для возврата в основную программу:

1)                 в счетчике команд СК фиксируется адрес команды в основной программе, которая следует за командой вызова;

2)                 содержимое СК загружается в стек, а содержимое указателя стека уменьшается на 2;

3)                 в СК загружается адрес       addr, задаваемый командой вызова. После этого начинается выполнение подпрограммы.

5)     Команды возврата из подпрограммы.

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

1) счетчик команд получает из стека адрес той команды в основной программе, которая следует за командой вызова;

2) содержимое указателя стека соответственно модифицируется (т.е. увеличивается на два).

RET                                  ;[SP] > PCмл, [SP+1] > PCст

                                          ;SP + 2 > SP

Команды условного возврата имеют модификации по следующим признакам.

Мнемокод

Условия возврата

RC

C=1 по признаку переноса С

RNC

C=0 по признаку переноса С

RZ

Z=1 по признаку нуля

RNZ

Z=0 по признаку нуля

RM

S=1 по признаку знака

RP

S=0 по признаку знака

RPE

P=1 по признаку паритета

RPO

P=0 по признаку паритета




6)     Специальные команды

Каждый МП имеет ряд специальных команд. Эти команды не передают и не обрабатывают информацию, но они используются для управления работой микропроцессора.

Команда HLT

По команде HLT останавливается текущая программа до тех пор, пока не появится запрос прерывания или сигнала сброса.

      Команды DI, EI

Если МП получает команду DI, то он игнорирует запросы прерывания до тех пор, пока не поступит команда EI.

      Команда NOP

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

1.2.3.                 Способы адресации

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

Адресация бывает

-        прямая, когда информация об операнде находится в коде команды

-        косвенная, когда информация об операнде находится в в регистре.

Способы адресации делятся на

-        однокомпонентные, когда адрес находится в одном месте

-        многокомпонентные, когда адрес находится в нескольких местах.

Информация о способе адресации содержится в коде команды.

Рассмотрим однокомпонентные способы адресации.

1)    Регистровая. В качестве операнда используется содержимое адресуемого регистра. Это самый простой и наиболее быстрый способ адресации, не требующий обращения к памяти.



2)    Абсолютная.



3)Непосредственная. При непосредственной адресации операнд следует сразу же за кодом операции.



4) Регистровая косвенная. Содержимое адресуемого регистра используется как адрес операнда.





            5) Автоинкрементная. Содержимое адресуемого регистра является адресом операнда. После получения адреса содержимое регистра автоматически увеличивается на 1 при байтовых операциях и на 2 при операциях со словами. Этот способ адресации удобен при обработке таблиц (последовательно расположенных в памяти данных).



6) Автодекрементная. Содержимое регистра задает указатель адреса операнда, затем содержимое регистра увеличивается на 1 (2).

Многокомпонентная адресация.

1) Страничная. Вся память разбивается на определенное количество равных по размеру страниц. Например, память объемом 64Кбайт разбивается на 256 страниц. Объем одной страницы 256 байт. Шестнацатиразрядный адрес поделен на два элемента: номер страницы (для примера 8 разрядов), адрес на странице (для примера 8 разрядов) задает местоположение ячейки на странице



2)     С индексированием.



3)     По базе.



4)     По базе с индексированием.



5)     Относительная. Мы адресуемся относительно СчК.



1.2.4.     Программирование на языке ассемблера

В этом разделе приводится краткие сведения о языке ассемблера из книги Григорьева В.Л. Программное обеспечение микропроцессорных систем. – М.: Энергоатомиздат, 1983.

Язык ассемблера – это машинно-ориентированный язык (т.е. ориентированный на конкретную ЭВМ и в частности на конкретную МП-систему). Он должен соответствовать специфическим особенностям МП. Следовательно, программу необходимо писать на языке ассемблера для того типа МП, для которого она предназначена. При преобразовании исходной программы (на языке ассемблера) в объектную программу используемая программа трансляции также должна соответствовать этому типу МП. Однако это не означает, что трансляция должна выполняться на таком же МП. Трансляция может быть выполнена даже на большой ЭВМ, имеющей в составе программного обеспечения соответствующую ассемблирующую программу (кросс-ассемблер).


В этом случае кросс- ассемблер составлен на языке большой ЭВМ, но он оперирует с исходной программой, написанной на языке ассемблера данной МП-системы. Объектная программа также выдается на машинном языке МП-системы. Ниже рассматривается язык ассемблера МПК580ВМ80.

Структура команд языка ассемблера.

Ранее уже кратко излагалась структура команд языка ассемблера. Напомним ее. Команда, написанная на языке ассемблера, может быть разделена на следующие четыре части (поля).

МЕТКА                            ОПЕРАЦИЯ                          ОПЕРАНД(Ы)                                  КОММЕНТАРИЙ

                                                     (код операции)

Метка представляет собой символическое имя (символический адрес) такой ячейки памяти, которую для каких-то целей (например, для последующей адресации к ней) необходимо пометить. Метка всегда начинается с латинской буквы и может содержать не более шести алфавитно-цифровых символов. Она отделяется от следующего поля кода операции двоеточием.

Если ввод программы осуществляется с использованием ассемблера, то действительные адреса ячеек памяти определять не нужно. Ассемблер автоматически вычисляет адреса и ставит им в соответствие последовательность команд. Однако необходимо указывать ассемблеру адрес первого байта команды программы. Поскольку адрес не определяется самостоятельно, то можно записывать в командах символические адреса. Например, команда передачи управления JMP всегда содержит адрес перехода. Этот адрес надо явно указать. Это и обеспечивается присвоением адресу перехода собственного символического имени или метки. В командах передачи управления метка ставится после мнемокода операции перехода. Ассемблер в процессе трансляции заменяет метку соответствующим адресом.

Пример

МЕТКА                            КОД ОПЕРАЦИИ                ОПЕРАНД                             КОММЕНТАРИЙ

CIKL:                                                      MOV                                                  A, B                                                    ;B > A



                                                                 ADD                                                   C                                                                    ;A + C > A

  …                                                          …                                                                  

                                                                 JMP                                                    CIKL

Метка CIKL связана с командой MOV           A,B. Ассемблер следит за адресацией при трансляции программы. При трансляции команды JMP         CIKL ассемблер поставит действительное значение адреса вместо символического адреса CIKL в команду перехода.

Операция. В поле операции для записи кода операции применяется буквенный (символический) код, который обычно является аббревиатурой полного назначения операции.

Примеры

ADD         - сложить,                  SUB    - вычесть,                  JMP     - перейти.

Некоторые символические коды операций явно определяют функцию команды (PCHL – передача содержимого пары регистров HL в счетчик команд РС). Обычно длина поля кода операции не превышает четырех позиций, а между ним и соседом справа необходим минимум один пробел. Буквенные обозначения (мнемоники) кодов операций являются ключевыми словами ассемблера. Если содержимое поля кода операций не входит во множество допустимых обозначений, ассемблер выдает сообщение о недействительной команде.

Операнд. В поле операнда (наиболее сложном поле) определяются данные, являющиеся операндом (или операндами) команды. Содержимое поля операнда интерпретируется в соответствии с функцией команды. Некоторые команды, оперирующие с определенными внутренними регистрами, имеют пустое поле операнда.

Примеры

МЕТКА    КОД ОПЕРАЦИИ     ОПЕРАНД                 КОММЕНТАРИЙ

                                         CMA                                                                                                 ;Инвертирование аккумулятора

                                         RAL                                                                                                  ;Сдвиг влево через перенос



                                         XTHL                                                                                                ;Обмен (H,L) и верхушки стека

                                         NOP                                                                                                  ;Пустая команда

В качестве операндов могут фигурировать:

                  - адреса памяти;

                  - внутренние регистры МП;

                  - адреса портов ввода и вывода;

                  - числовые и символьные константы.

Рассмотрим способы определения перечисленных типов операндов.

Шестнадцатеричные данные. Содержащиеся в поле операнда 16-ричное число должно начинаться с цифр 0 - 9 и завершаться буквой H (Heх). Число, начинающееся с букв A – F, дополняется слева незначащим нулем.

Примеры

STORE:                STA                            8000H             ; Запоминание в ячейке 800016

                                         MVI                            C, 0AAH         ; Загрузка в регистр С кода 10101010 (А   А)

                                         ANI                            10H                 ; Выделение четвертого бита

COMP:                 CPI                             290H               ; Недопустимый операнд

Десятичные данные. Десятичное число в поле операнда заканчивается необязательной буквой D.

                                         MOV                          B,15                ; Загрузка в регистр В кода 00001111

                                         ANI                            64                               ; Выделение 6-го бита

                                         IN                                           32                               ; Ввод из порта с адресом 00100000

Восьмеричные данные. Восьмеричное число в поле операнда заканчивается  буквами О или Q (чаще).

                                         ORI                             200Q               ; Установка старшего бита



Двоичные данные. Двоичное число в поле операнда заканчивается буквой В.

                                         OUT                           1111B             ; Вывод в порт с адресом 15

                                         XRI                             10000000B; Инверсия знакового бита

                                         ANI                            11011111B; Сброс пятого бита

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

                                         MVI                            D, ‘T’              ; Загрузка кода буквы Т в регистр D

Идентификаторы внутренних регистров. В язык ассемблера МП К580 встроены идентификаторы внутренних регистров B, C, D, E, H, L, M, A с соответствующими двоичными значениями от 000 до 111.

                                         MOV                          A, E                 ; Передача из регистра Е в аккумулятор

                                         ADD                           L                                 ; Прибавление содержимого регистра L

                                         SUB                            M                                ; Вычитание содержимого ячейки, адресуемой

; регистрами (H, L)

Вместо идентификаторов внутренних регистров допускается применять их адреса в любой системе счисления.

                                         MOV                          A, B                ; Переслать из регистра В в регистр А

                                         MOV              7, 0                             ; Переслать из регистра В в регистр А

В командах, оперирующих 16-битными значениями, применяются идентификаторы внутренних 16-битных регистров.

                                         LXI                              H, 0FF00H; Инициализация регистров (H,L)

                                         INX                            SP                               ; Инкремент указателя стека



                                         PUSH                         PSW               ;Загрузка в стек содержимого А- и РП- регистров

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

                                         JMP                            DONE             ; Переход к метке DONE

                                         CALL                         SWAP             ; Вызов подпрограммы SWAP

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

GOTO:                  JMP                            ¤ + 20H         ; Переход по адресу GOTO + 20Н

MORE:                 JNZ                             ¤ - 80             ; Адрес перехода MORE-80 («назад»)

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

                                         MVI                            B, 30 + 40H/2; Загрузка числа 62

                                         SUI                             34, MOD3           ; Декремент аккумулятора

Выражения в операнде применяются редко.

Комментарии. Программист может использовать это поле для пояснения команды или фрагмента программы. Ассемблер игнорирует поле комментария в процессе трансляции. Поле комментария начинается с некоторого разделителя (точка с запятой).

Директивы ассемблера

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



Директивы подчиняются стандартному формату операторов ассемблера, но содержимое их полей имеет некоторые особенности. Например, в поле метки директив EQU и SET должно находиться символическое наименование, которое не имеет заключительного двоеточия. В остальных директивах в поле метки может находиться необязательная метка, аналогичная меткам машинных команд. Операнды директив необязательны.

Директива ORG (начало) имеет формат

[МЕТКА:]             ORG               < выражение >

[     ] – обозначает необязательный элемент.

Значением выражения директивы ORG является 16-битный адрес, определяющий ячейку памяти, в которую будет загружаться первый бит следующей команды. До новой директивы ORG команды и данные размещаются в смежных ячейках памяти. Если в самом начале программы директива ORG отсутствует, то по умолчанию подразумевается наличие директивы ORG с нулевым операндом. При необходимости в программе может быть несколько директив ORG.

                                         ORG                                       100H   ; Задается абсолютный адрес 0100Н

NEW:                               ORG                                       200H   ; Задается абсолютный адрес 0200Н

Директива ORG может выполнить функцию резервирования памяти.

                                         MOV                                      A,M

                                         RAL

                                         JMP                                        LOWER

                                         ORG                                       ¤ +20

LOWER:               ORA                                       A

Директива END

[МЕТКА:]             END

Эта директива информирует ассемблер о достижении физического конца входной программы.

Директива EQU (принять, присвоить - директива прямого присвоения)

МЕТКА                КОД                                       ОПЕРАНД

< имя >                EQU                                       < выражение >



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

MASK                              EQU                                       0FH     ; Значение MASK равно 15

…                                                 …

                                         ANI                                        MASK

…                                                 …

                                         MVI                                        MASK

В командах ANI, MVI вместо MASK будет фигурировать код 00001111. При программировании рекомендуется сгруппировать все директивы EQU в начале или в конце программы.

Директива SET (установить)

Имеет такой же формат, что и директива EQU. В отличие от директивы EQU, значение символического наименования допускается изменять с помощью новой директивы SET.

NAME                              SET                                        15                    ; Значение NAME равно 15

…                                                

                                         MVI                                        B, NAME

NAME                              SET                                        1FH     ; Значение NAME равно 31

…                                                

                                         ADI                                        NAME            ; Прибавление 31

…                                                

                                         CPI                                         NAME            ; Сравнение с 31

Директивы IF       ENDIF

Директивы условного ассемблирования IF (если) и ENDIF (конец если) применяются следующим образом:

МЕТКА                КОД                                       ОПЕРАНД                 КОММЕНТАРИЙ

[МЕТКА:]             IF                                                       < выражение >





                                                     ОПЕРАТОРЫ



[МЕТКА:]             ENDIF

В процессе ассемблирования вычисляется значение выражения из поля операнда директивы IF. Если оно равно нулю, операторы между директивами IF и ENDIF игнорируются и не включаются в объектную программу. Если значение выражения отлично от нуля, операторы программы ассемблируются, как будто директив IF и ENDIF нет.

Директива DB (определить байт)

Директива относится к группе директив определения, которые применяются для инициализации данных и резервирования памяти. Формат директивы DB

[МЕТКА:]             DB                                                      < список >

Операнд директивы DB может быть последовательностью выражений, разделенных запятыми и имеющих 8-битные значения, либо цепочкой символов, заключенных в апострофы. При выполнении директивы DB значения выражений или коды символов запоминаются в смежных ячейках (байтах) памяти, начинающихся после предыдущей команды.

ARRAY:               DB                                                      3,7,15,31         ; Запоминаются четыре значения

                                         DB                                                      ‘HELLO’         ; Запоминаются пять символов

COMP:                 DB                                                      -63                              ; Дополнительный код -63

Директива DW (определить слово – 2 байта)

Директива аналогична директиве DB, только здесь списком является последовательность выражений, имеющих 16-битные значения. Запоминается сначала младший байт по текущему адресу, а старший байт запоминается по адресу на 1 больше предыдущего.

ADDR:                  DW                                         0FF00H          ; (ADDR)=00H                       (ADDR+1)=FFH

Директива DS (определить память)

[МЕТКА:]             DS                                                      < выражение >

Вычисленное значение выражения из поля операнда определяет число ячеек (байт) памяти, резервируемых для запоминания данных.


Никакие значения в этих ячейках не запоминаются. Адрес следующего оператора равен сумме адреса оператора, находящегося перед директивой DS и значения выражения директивы DS.

ARRAY:               DS                                                      32        ; Резервируется 32 ячейки

Для улучшения внешнего вида и удобства документирования листинга в ассемблерах могут применяться директивы:

SPS – (пропуск строки), которая означает, что при печати листинга необходимо пропустить одну строку;

PAGE – (страница), которая при печати вызывает переход на следующую страницу;

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

Иногда возникает необходимость использовать определенную последовательность команд во многих частях программы. Для таких ситуаций макроассемблер позволяет программисту указывать в исходной программе вместо повторяющейся последовательности команд только макрокоманду (макрос), которая эквивалентна выделенной последовательности команд. Макрокоманда задается программистом в виде макроопределении, например, в начале программы.

Пример макроопределения.

SPDE        MACRO

                  XCHG             ; (HL) ßà (DE)

                  SPHL              ; (HL) ßà (SP)

                  XCHG             ; (HL) ßà (DE)

SPDE        ENDM

Во время трансляции макроассемблер заменяет в исходной программе строку SPDE (макровызов) заранее определенной в макроопределении последовательностью из трех строк (т.е. макрорасширением).

Макрокоманды могут быть с параметрами.

ЕХТ    MACRO  VAR

MVI  A,VAR                         ; VAR>A

MOV M,A

XRA A

INX H

MOV M,A

ЕХТ    ENDM

Процедура и макрокоманды  - это две альтернативы. Для экономии памяти лучше использовать процедуры, а для повышения быстродействия - макрокоманды.

1.2.5.                 Структурная схема и система команд микропроцессора I8086



Упрощенная структура МП представлена на рисунке ниже.



Регистры общего назначения.

    Помимо ячеек оперативной памяти для хранения данных (кратковременного) можно использовать и регистры, входящие в состав процессора  и доступные из машинной программы.  Доступ к регистрам осуществляется значительно быстрее, чем к ячейкам памяти, поэтому использование регистров заметно уменьшает время выполнения программ. Все регистры имеют размер слова (16 битов), за каждым из них закреплено определенное имя (AX, SP и т.п.). По назначению и способу использования регистры можно разбить на следующие группы:

    - регистры общего назначения (AX, BX, CX, DX, BP, SI, DI, SP);

    - сегментные регистры (CS, DS, SS, ES);

    - счетчик команд (IP);

    - регистр флагов (Flags).

Расшифровка этих названий следующая

A - accumulator, аккумулятор;

B  - base, база;

C - counter, счетчик;

D - data, данные;

BP - base pointer, указатель базы;

SI - source index, индекс источника;

DI  -  destination index,  индекс приемника;

SP  - stack pointer, указатель стека;

CS - code segment, сегмент команд;

DS - data segment, сегмент данных;

SS  -stack segment, сегмент стека;

ES - extra segment, дополнительный сегмент;

IP - instruction pointer, счетчик команд.

    Регистры общего назначения можно использовать во всех арифметических и логических командах. В то же время каждый их них имеет определенную специализацию (некоторые команды "работают" только с определенными регистрами). Например, команды умножения и деления требуют, чтобы один из операндов находился в регистре AX  или в регистрах AX и DX  (в зависимости от размера операнда),  а команды управления циклом используют регистр CX в качестве счетчика цикла. Регистры BX и BP очень часто используются как базовые регистры,  а SI и DI - как индексные. Регистр SP обычно указывает на вершину стека, аппаратно поддерживаемого в ПК.

 Регистры AX, BX, CX и DX конструктивно устроены так, что возможен независимый доступ к их старшей и младшей половинам; Каждый из этих регистров состоит из двух восьмиразрядных регистров, обозначаемых AH, AL, BH и т.д. (H - high, старший; L - low, младший):



Таким образом, с каждым из этих регистров можно работать как с единым целым, а можно работать и с его "половинками". Например, можно записать слово в AX, а затем считать только часть слова из регистра AH или заменить только часть в регистре AL и т.д. Такое устройство регистров позволяет использовать их для работы и с числами, и с символами.

Сегментные регистры CS, DS, SS и ES не могут быть операндами никаких команд, кроме команд пересылки и стековых команд. Эти регистры используются только для сегментирования адресов.

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

В этом МП этапы выполнения команд (извлечение кода и операндов команды, выполнение команды) реализуется в двух различных блоках:

-        блоке выполнения команд EU ( выполнение команды)

-        блоке сопряжения с магистралями BIU (извлечение кода и операндов, запись результата в память).

Блоки могут работать независимо друг от друга, поэтому процессы преобразования и передачи информации могут идти в них параллельно. Благодаря этому за одно и тоже время количество выполненных команд возрастает по сравнению с процессором I8080.

Блок выполнения команд EU. Блок не имеет связи с внешними магистралями МП. На АЛУ поступают коды команд из BIU. Если в результате дешифрации кода команд в АЛУ необходимо получение операндов по внешним магистралям МП, то блок EU запрашивает блок BIU на получение и размещение необходимых данных в BIU.

Блок сопряжения с магистралями BIU. Производит пересылки данных и кодов для блока EU. В то время как блок EU занят выполнением команды, блок BIU получает следующие в программе коды команд из памяти и сохраняет их в конвейере команд. Он выдает в EU извлеченные ранее из памяти коды команд по мере необходимости без загрузки внешних магистралей МП.


Блок BIU организует получение нового кода команды , как только 2 байта в конвейере команд будут использованы.

Особенности адресации.

В этом процессоре реализовано адресное пространство размером в 1 МБ, поэтому физический адрес представляется 20-разрядным числом. Любая ячейка памяти имеет два типа адресов

-        физический

-        логический

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

CS:

IP

база, в которой находится адрес сегмента (базы)

смещение относительно базы

16-тиразрядный

16-тиразрядный

20-тиразрядный

20-тиразрядный адрес осуществляется схемотехнически.



К 16-ти разрядам CS  добавляются 4 младших нулевых разряда.

А в счетчик инструкций  эти разряды добавляются слева. И мы  получаем 20-тиразрядный физический адрес.

Аналогично DS:BX, DS:SI, ES:DI, SS:SP.

Машинные программы обычно строятся так. Все команды программы размещаются в одном сегменте памяти, начало которого  заносится в регистр CS. Все данные размещаются в другом сегменте, начало которого заносится в регистр DS; если нужен стек, то под него отводится третий сегмент памяти, начало которого записывается в регистр SS. После этого практически во всех командах можно указывать не полные адресные пары, а лишь смещения, так как значения сегментных регистров в этих парах будут восстанавливаться автоматически. Ссылки на сегмент команд могут быть только в командах перехода, а ссылки практически во всех других командах (кроме строковых и стековых) - это ссылки на сегмент данных. Например, в команде пересылки

MOV AX,X

имя X воспринимается как ссылка на данное, а потому автоматически восстанавливается до адресной пары DS:X.  В команде же безусловного перехода по адресу, находящемуся в регистре BX,

      JMP BX

абсолютный адрес перехода определяется парой CS:[BX].



Итак, если в ссылке на какую- то ячейку памяти не указан явно сегментный регистр, то этот регистр берется по умолчанию. Явно же сегментные регистры надо указывать, только если по каким-то причинам регистр по умолчанию не подходит. Если, например, в команде пересылки надо сослаться на стек  (скажем, надо записать в регистр AH байт стека, помеченный именем X), тогда мы обязаны явно указать иной регистр - в нашем случае регистр SS, т.к. именно он указывает на стек:

         MOV     AH,SS:X

Перечень сигналов МП.

Перечень сигналов процессора I8086 (К1810ВМ86) приведен на рисунке ниже



Шина адреса (20-тиразрядная), поэтому она делиться на две части.16 младших адресов совмещают адресные цепи и цепи данных. Это значит что в какие-то моменты по этим линиям выставляются адреса, а какие-то - данные, т.е. сигналы разделены во времени. Это сделано для экономии выводов. Когда идет адрес, то он сопровождается сигналом о том, что идет адрес. Этот сигнал называется стробом адреса. По этому стробу адрес защелкивается в регистр адреса.

Есть два восьмиразрядных шинных формирователя, которые формируют 16-тиразрядную ШД. Существует специальный сигнал (OP/#IP), задающий направление обмена данными через шинный формирователь: от МП (высокий уровень сигнала) или к нему (низкий уровень).

Сигнал #DEN (Data Enable - разрешение данных) разрешает передаче данных через   шинный формирователь. МП может сам выдать сигнал.

Формирование ШУ.

-        Сигнал М/#IO, говорящий о работе либо с памятью (высокий уровень), либо с устройством ввода-вывода (низкий уровень);

-        сигналы записи (#W) (и чтения (#R)) данных в память или устройство ввода-вывода;

-        сигнал запроса прерывания INT;

-        сигнал подтверждения прерывания - INTA

-         сигнал немаскируемого запроса прерываний NMI. При подаче сигнала на этот вход всегда разрешаются прерывания;                  



-        сигнал разрешения старшего байта `#BНE. Позволяет организовать различные типы адресации: пословная (указание на слово) и побайтная ( указание на четный или нечетный байт );

-        ТИ тактовые импульсы, с помощью которых можно управлять работой МП;

-        сигнал, задающий режим работы МП - MN /#MX. Если задается высокий уровень (MN), то в системе имеется лишь один МП. Если задается низкий уровень (#MX), то в системе может быть несколько МП;

-        сигнал сброса - CLR. Устанавливает МП в начальное состояние - во всех регистрах нули, кроме CS. Туда заносится число 0FFFFh. Это связано с тем, что программа загрузки МП начинается со старших адресов;

-        сигнал готовности RDY. Без этого сигнала процессор приостанавливает свою работу;

-        запрос прямого доступа к памяти HLD. C помощью этого сигнала можно организовать прямой доступ к памяти, аналогичный реализованному в процессоре I8080$

-        проверка ( ТEST ). Существует специальная команда WAIT и если она встречается в программе, то МП переходит в состояние ожидания внешнего активного сигнала TEST.

Содержимое регистра признаков.

В ПК имеется особый регистр флагов ( или признаков ). Флаг - это бит, принимающий значение 1 ("флаг установлен"), если выполнено некоторое условие, и значение 0 ("флаг сброшен") в противном случае. В ПК используется 9 флагов, каждому из них присвоено определенное имя (ZF, CF и т.д.). Все они собраны в регистре флагов FLAGS.

Некоторые флаги принято называть флагами условий; они автоматически меняются при выполнении команд  и фиксируют те или иные свойства их результата (например, равен ли он нулю).  Другие флаги называются флагами состояний; они меняются из программы и оказывают влияние на дальнейшее поведение процессора (например, блокируют прерывания).





Флаги условий.

    CF (carry flag) - флаг переноса. Принимает значение 1, если при сложении целых чисел без знака появилась единица переноса, не "влезающая" в разрядную сетку, или если при вычитании чисел без знака первое из них было меньше второго.  В командах сдвига в CF заносится бит, вышедший за разрядную сетку.

    OF (overflow flag) - флаг переполнения. Устанавливается в 1, если при сложении или вычитании целых чисел со знаком  получился результат, выходящий за пределы заданного диапазона .

    ZF (zero flag) - флаг нуля.  Устанавливается в 1,  если  результат команды оказался равным 0.

    SF (sign flag) - флаг знака.  Устанавливается в 1, если в операции над знаковыми числами получился отрицательный результат.

    PF (parity flag) - флаг четности.  Равен 1, если результат очередной команды  содержит  четное количество двоичных единиц.  Учитывается обычно только при операциях ввода-вывода.

    AF (auxiliary carry flag) - флаг дополнительного переноса.  Фиксирует особенности выполнения операций над двоично-десятичными числами.

        Флаги состояний.

    DF (direction flag)  - флаг направления. Устанавливает направление изменения адреса данных в строковых командах: автоматическое увеличение (при DF=0) или уменьшение на 1 (2) адреса элемента массива (см. рис. ниже).



    IF (interrupt flag) - флаг прерываний. При IF=0 процессор перестает реагировать на поступающие к нему прерывания по входу INT, при IF=1  блокировка прерываний снимается.

    TF (trap flag) - флаг трассировки. При TF=1 после выполнения каждой команды процессор делает прерывание (с номером 1), чем можно воспользоваться при отладке программы для ее трассировки (пошаговый режим).

Временные диаграммы работы МП.



Адресация к памяти.

Память формируется в виде 2-х блоков: четных и нечетных байтов, причем один блок открывается сигналом #ВНЕ, а второй `А0. `А0 различает четный / нечетный или младший / старший байт.



ВНЕ- пассивен - старший байт не разрешен.


ВНЕ-активен - старший байт разрешен.

Пример. Поступают следующие сигналы:

`ВНЕ - пассивный

А0 - активный

Открывается блок четных адресов. Выбран младший(четный) байт

`ВНЕ - активный

`А0 - пассивный Открывается блок нечетных адресов. Выбран старший (нечетный) байт

`ВНЕ - активный

А0 -активный

Оба блока открыты. Выбрано слово.

Формат команды МП 8086.



Как уже говорилось выше, конвейер команд этого МП рассчитан на 6 байт, что связано с длиной команды (см. рис. ниже).

Таблица. Mode

Mode

Режим работы

Смещение

00

работа с памятью (операнд находится в памяти)

нулевое

01

8-миразрядное

10

16-тиразрядное

11

работа с регистром reg / mem

Таблица.Reg.

Reg

W=0 (байт)

W=1(слово)

Reg

W=0 (байт )

W=1 (слово)

000

AL

AX

100

AH

SP

001

CL

CX

101

CH

BP

010

DL

DX

110

DH

SI

011

BL

BX

111

BH

DI

Таблица Reg / mem.

Reg / mem

Исполнительный адрес (смещение относительно базы сегмента)

mode = 00

mode = 01

mode = 10

000

[BX+SI]

[BX+SI+data8]

[BX+SI+data16]

001

[BX+DI]

[BX+DI+data8]

[BX+DI+data16]

010

[BP+SI]

[BP+SI+ data8]

[BP+SI+ data16]

011

[BP+DI]

[BP+DI+ data8]

[BP+DI+ data16]

100

[SI]

[SI+ data8]

[SI+ data16]

101

[DI]

[DI+ data8]

[DI+ data16]

110

Непосредственная адресация

[BP+data8  ]

[BP+data16]

111

[BX]

[BX+data8 ]

[BX+data16]

Организация прерываний

В МП 8086 каждому прерыванию поставлен в соответствие код (от 0 до 255), который идентифицирует тип прерывания.

Прерывания могут вызываться:

            - внешними устройствами (внешние прерывания);

            - командами программных прерываний;

            - автоматически самим МП (внутренние прерывания).

Возможные источники показаны на рисунке ниже



Рис. Источники прерываний

Внешние прерывания

Запросы на внешние прерывания поступают в МП по двум входам INTR (маскируемые) и NMI (немаскируемые).



Запросы на маскируемые прерывания от внешних устройств обычно поступают на входы программируемого контроллера прерываний, который формирует сигнал, подаваемый на вход INTR микропроцессора. В ответ на этот сигнал МП (если разрешены внешние прерывания, т.е. если флаг IF=1) выдает последовательно два сигнала INTA1 и INTA2, по которым контроллер прерываний выдает команду INT n.

Запросы на немаскируемое прерывание поступают по входу NMI и обычно используются для прерывания работы МП при «катастрофических» событиях, требующих немедленной реакции (например, аварийное отключение питания, обнаружение ошибки памяти и т.д.). Немаскированному прерыванию присваивается фиксированный код типа 2, который формируется автоматически внутри МП.

Внутренние прерывания

Характеризуются типом прерывания, который либо предопределен, либо содержится в коде команды. Внутренние прерывания не могут быть запрещены (кроме пошагового прерывания).

Прерывание по ошибке деления (тип 0) генерируется микропроцессором после выполнения команд деления DIV и IDIV в случае деления на нуль.

Прерывание по переполнению (тип 4) генерируется по однобайтовой команде INTO, если установлен флаг OF.

Пошаговое прерывание (тип 1) вырабатывается автоматически при TF=1 после выполнения каждой команды.

Процедура обслуживания прерываний

Связь между кодом, определяющим тип прерывания, и подпрограммой (процедурой) обслуживания прерывания устанавливается с помощью таблицы указателей векторов прерываний.



Рис. Таблица указателей векторов прерываний

Полная таблица занимает 1Кбайт памяти и содержит 256 элементов, расположенных по адресам 0 – 3FFH. Каждый элемент n в таблице содержит два слова, определяющие начальный логический адрес подпрограммы: слово с большим адресом содержит базовый адрес сегмента, слово с меньшим адресом – смещение от базы сегмента. При переходе на подпрограмму смещение загружается в регистр IP, а адрес сегмента – в регистр CS.

Так как размер каждого элемента таблицы векторов прерываний составляет 4 байта, то МП вычисляет адрес (смещение) требуемого элемента путем умножения типа прерывания n на 4.


После установления нового содержимого регистров IP и CS МП выбирает код операции первой команды подпрограммы и затем выполняет обычные действия по заполнению очереди команд, выполнению команд и обмену данными.

Когда осуществляется переход на подпрограмму обслуживания прерывания, содержимое регистров флагов FLAGS вместе с содержимым регистров IP и CS запоминается в стеке. Флаг IF (и TF) сбрасывается, т.е. автоматически запрещаются внешние прерывания по входу INT. Затем подпрограмма может разрешить внешние прерывания командой STI (установит IF в 1). Кроме того, подпрограмма может быть прервана запросом на входе NMI (немаскируемые прерывания) и внутренними прерываниями.

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

Подпрограмма обработки прерываний должна заканчиваться командой возврата из прерывания IRET. Перед выполнением команды IRET стек должен быть в том состоянии, в котором он был сразу после вызова подпрограммы. Тогда эта команда извлекает три верхних слова из стека в регистры IP, CS и FLAGS, что обеспечивает возврат к команде, которая бы выполнялась бы в случае отсутствия прерывания.

Система команд МП 8086

Команды МП 8086 можно сгруппировать так:

1)   Пересылок;

2)   Арифметические;

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

4)   Строковые;

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

6)   Специальные.

1 Команды пересылок

Возможна пересылка между:

1)   Регистр — регистр

2)   Регистр — память

3)   Память —  регистр

4)   Data            —        память

5)   Data            —        регистр

Основные команды пересылок

MOV   пр,       ист;                где

пр -     приемник,

ист -   источник

Пример:

MOV              AX,     BX       ;                       BX>AX

MOV              [BX]                ;                       mem[ВX]>AX

Замечание



Есть исключения при пересылке. Нельзя данные непосредственно загрузить в сегментный регистр.

Пересылки при работе со стеком

1)   PUSH         ист                  ;           ист > стек

2)   PUSH         sreg                 ;           sreg > стек

3)   PUSHF                              ;           FLAGS > стек

1)   POP                       пр                    ;           стек > пр

2)   POP                       sreg                  ;           стек > sreg

3)   POPF                                 ;           стек > FLAGS

Специфические команды пересылок

1)   Команда взаимообмена данными

XGHG        пр, reg             ;           пр - reg

2)   Команды пересылки между регистром АН и регистром признаков

LAHF                                 ;           FLAGS> AH

SAHF                                            AH > FLAGS

3)   Команды загрузки адресов

LEA                        reg, ист           ;           командный адрес операнда ист > reg

LDS                        reg, ист           ;           загрузка адреса из ист > (DS: reg)

LES            reg, ист           ;           загрузка адреса из ист > (ES: reg)

4)   Пересылка байта (из таблицы) в AL

XLAT                                 ;           mem[ВX+ AL]> AL

5)   Команды ввода-вывода

1)   Байтовый адрес порта (0…255)

IN           A, port             ;           port > A,

OUT       port, A             ;           A > port,

где A=AL – для байта, A=AХ – для слова

2)   Двухбайтовый адрес порта (0…64К)

Адрес порта необходимо предварительно записать в регистр DX

IN           A, DX             ;           [DX] > A

OUT       DX, A             ;           A > [DX]

Примеры

1)         MOV  AX, table         ; Пересылка из ячейки памяти table в регистр AX

MOV  table, AX         ; Пересылка из регистра AX в ячейку памяти table

MOV  ES:[BX], AX   ; Пересылка из AX в ячейку памяти ES:[BX]



MOV  DS, AX           ; Пересылка из AX в DS

MOV  BL, AL            ; Пересылка из AL в BL

MOV  CL, -30           ; Пересылка константы -30 > CL

MOV  dest, 25h          ; Пересылка константы 25h > ячейку памяти dest

2)        PUSH  SI                    ; Сохранение в стеке содержимого регистра SI

            PUSH  DS                   ; Сохранение в стеке содержимого регистра DS

            PUSH  CS                   ; Сохранение в стеке содержимого регистра CS

            PUSH  counter            ; Сохранение в стеке содержимого ячейки памяти

            PUSH  table[BX][DI] ; Сохранение в стеке содержимого ячейки памяти

            PUSH  AX                  ;

            PUSH  ES                   ;

            PUSH  DI                    ;

            PUSH  SI                    ;

           

            …

            …

            POP    SI                    ;

            POP    DI                    ;

            POP    CS                   ;

            POP    AX                  ;

PUSH ES                   ; Копирование в DS

            POP    DS                   ;

3)        XGHG AX, BX           ; AX - BX

            XGHG AL, BH           ; AL - BH

            XGHG word_loc, DX  ; ячейка word_loc -DX

            XGHG DL, byte_loc    ; AL - ячейка byte_loc

4)        XLAT – извлечение элемента таблицы. Начальный адрес таблицы нужно загрузить в BX, а номер элемента таблицы в AL.

            MOV   AL,10              ; номер элемента таблицы в AL

            MOV   BX, offset s_tab;

            XLAT  s_tab               ; извлечь значение байта из таблицы AL

2 Арифметические команды

1)   Сложение

ADD   пр, ист                       ; пр + ист>пр

                        ADD    пр, data           ; пр + data > пр

ADC   пр, ист                       ; пр + ист+CF>пр

ADC пр, data             ; пр + data+CF > пр

2)   Вычитание

SUB    пр, ист                       ; пр - ист>пр

                        SUB    пр, data           ; пр - data > пр



SBB    пр, ист                       ; пр – ист-CF>пр

SBB пр, data              ; пр – data-CF > пр

3)   Умножение

а) без знака

MUL           ист      ; AL * ист > AX – байт, AX * ист > DX:AX – слово

б) со знаком

IMUL         ист     

4)   Деление

а) без знака

DIV             ист     

б) со знаком

IDIV           ист      .

AX / ист > AL – (остаток в AH), DX / ист > AX  (остаток в DX)

5)   Сравнение

CMP   пр, ист                       ; пр-ист          формируется регистр флагов

CMP   пр, data           ; пр - data       формируется регистр флагов

6)   Команды инкремента и декремента

INC                 пр        ;           пр +1 > пр

DEC                пр        ;           пр - 1 > пр

NEG                пр        ;           - пр > пр

Примеры

!) Сложение ADD

ADD               AX + BX         ; Сложение младшего слова                       AX + BX > AX

ADС               BX + DX         ; Сложение старшего слова                        BX + DX +CF> BX

ADD   AX + mem_word        ; Добавить значение ячейки к регистру

ADD   AL,10                         ; Добавить константу к регистру

ADD   mem_byte, ofh ; Добавить константу к содержимому ячейки памяти

INC                CX                  ;

INC                AL                   ;

INC                mem_byte        ; Приращение значения байта

INC                mem_word[BX] ; Приращение значения слова памяти

2) Вычитание

SUB                AX, BX           ; Вычесть младшие слова

SBB                BX, DX           ; Вычесть старшие слова

SUB    mem_word[BX], AX  

SUB                AL,10             

SUB    mem_byte, ofh

3) Умножение

MUL               BX                 

MUL               mem_byte       

IMUL              AL

IMUL              mem_word

4) Команды инкремента

DEC                CX

DEC                AL

DEC                mem_byte

NEG               AL

3Логические команды и команды сдвига

а) логические команды

AND               пр, ист                       ;           пр & ист>пр



OR                  пр, ист                       ;           пр
ист>пр

XOR               пр, ист                       ;           пр
ист>пр

TEST              пр, ист                       ;           пр &ист и формирование флага признаков

б) сдвига

1) Циклический

ROR               пр, cnt             ; Сдвиг вправо на cnt разрядов cnt=1,

; Сдвиг вправо на cnt разрядов cnt=CL

RCR                пр, cnt            

ROL                пр, cnt             ; Сдвиг влево на cnt разрядов cnt=1

                                               ; Сдвиг влево на cnt разрядов cnt=CL

RCR                пр, cnt            

2) Логический

SHR                пр, cnt

SHL                пр, cnt

3) Арифметический

SAR                пр, cnt

SAL                пр, cnt

Замечание

Коды команд логического и арифметического сдвига влево совпадают. SHL/SAL



4 Строковые команды

1) Команды перемещения

MOVSB (MOVSW)                          ; mem[DS:SI] >mem[ES:DI

если DF=0, то инкремент SI и DI

если DF=1, то декремент SI и DI

LODSB (LODSW)                            ; mem[DS:SI] > A ( A=AL- байт, A=AX – слово)

если DF=0, то инкремент SI

если DF=1, то декремент SI

STOSB (STOSW)                             ; A > [ES:DI] ( A=AL- байт, A=AX – слово)

если DF=0, то инкремент DI

если DF=1, то декремент DI

2) Команды сравнения

SCASB (SCASW)                             ; A – mem[ES:DI]

если DF=0, то инкремент DI

если DF=1, то декремент DI

CMPSB (CMPSW)                           ; mem[DS:SI] – mem[ES:DI]

если DF=0, то инкремент SI и DI

если DF=1, то декремент SI и DI

3) Повторение строковых команд

REP MOVSB(W)                              ; повторять, счетчик цикла СХ=СХ-1 пока СХ?0

REPE/REPZ                                       ; повторять пока  СХ?0 и ZF=1

REPNE/REPNZ                                 ; повторять пока  СХ?0 и ZF=0

Примеры

1) Групповая пересылка байтов

CDL                           ; сбросить флаг DF в 0 для пересылки с увеличением адресов



LEA    SI, source        ; смещение адреса источника source > SI

LEA    DI, ES:dest     ; смещение адреса приемника dest >DI

MOV  CX, 100          ; количество элементов 100 > счетчик СХ

REP MOVSB             ; скопировать байты

2) Сравнение строк

CLD

MOV  CX, 100          ; количество элементов 100 > счетчик СХ

CMPSВ                      ; Сравнение строк до тех пор пока либо значение СХ не

; станет равным 0, либо не будет найдена пара несовпада-

; ющих строк (т.е. поиск несовпадающих строк)

REPNE CMPS dest, source ; Поиск совпадающих строк

3) Сканирование строк

CLD

LEA                DI, ES:b_string

MOV              AL, ? ?

MOV              CX, 100

REPE SCASВ  b_string

5 Команды передачи управления

5.1. Команды безусловных переходов.

Производят модификацию регистра инструкций IP или регистров IP и CS без сохранения прежних значений этих регистров.

а) команды передачи управления

JMP                addr

JMP                ист

б) Переход на процедуру

CALL             addr                 ; переход на процедуру по адресу addr CS:IP > стек

CALL             ист                  ; переход на процедуру по адресу ист  CS:IP > стек

в) Возврат из процедуры

RET                                        ; возврат из процедуры стек > CS:IP

RET                n                      ; возврат из процедуры стек > CS:IP, SP=SP+n

5.2 Условные

Jсс                  offset           ; переход, если условие сс выполняется

; где сс = С и NC, Z и NZ и т.д.

5.3 Организация циклов

LOOP             offset                           ; СХ=СХ-1, возврат по смещению offset, если СХ?0

Разновидности

LOOPE/LOOPZ offset ; CX=CX-1, возврат по смещению offset, если СХ?0, ZF=1

LOOPNE/LOOPNZ offset ; CX=CX-1, возврат по смещению offset, если СХ?0, ZF=0

JCXZ  offset                           ; переход по смещению, если СХ=0

5.4 Команды программного прерывания

INT                 n                      ;  где n=0…255,  FLAGS > стек, 0 >IF, 0 >TF,

                                               ; вектор прерывания > CS:IP



IRET                                       ; стек > CS:IP, стек > FLAGS

Примеры

1 Условная передача управления

Вычислить c=a*a+b , но если ответ превосходит размер байта, то передать управление на метку error

MOV              AL, A

MUL               AL

JC                   error                ; если a*а>255, то CF=1 и переход на error

ADD               AL, B             

JC                   error                ; если a*а+b>255, то CF=1 и переход на error

MOV              C, AL

2. Управление циклом

Вычислить факториал числа байтовой переменной n (значение 0…8)

 n! = n(n-1)(n-2)..1

MOV              AX, 1

MOV              CL, n

MOV              CH, 0              ; CX=n

JCXZ              F1                   ; при n=0 обойти цикл

MOV              SI, 1

F:         MUL               SI                    ; (AX*SI >(DX,AX))

            INC                 SI

            LOOP                         F

F1:

3. Усреднение чисел без знака

LEA                BX, table

MOV              CX, 100

CALL                         average

average PROC

            SUB                AX, AX           ; Присвоить делимому 0

            SUB                DX, DX

            PUSH              CX                  ; сохранить значение счетчиков в стеке

Add_w:

ADD               AX, [BX]        ; добавить текущее значение к сумме

            ADC               DX, 0

            ADD               BX, 2

            LOOP             add_w             ; все ли слова просуммированы ?

            POP                CX                  ; Да

            DIV                 CX                  ; вычислить среднее

average RET                                      

            ENDP

Общие сведения об аппаратных и программных прерываниях (командаINT  n)

Все возможные прерывания нумеруются числами от 0 до 255. Для каждого прерывания при необходимости составляется своя процедура обработки прерывания (ПОП). Начальные адреса этих процедур (векторные прерывания) записываются в самые первые ячейки памяти (первый Кбайт памяти).


Эти начальные адреса попадают сюда при загрузке ОС в оперативную память. Четыре ячейки (байта) выделяются для адресации каждой ПОП (младшие 2 байта – значение IP, старшие 2 байта – значение CS).

Устройство, в котором произошло событие, требующее внимания ОС, посылает в МП сигнал прерывания (ЗПр) и номер этого прерывания, точнее команду INT n (n=0..255) по сигналу от микропроцессора ППр.



Получив номер вектора прерывания n, МП сохраняет в стеке регистр флагов FLAGS и адрес возврата и передает управление по адресу n-го вектора прерывания, т.е. передает управление n-ой ПОП, которая начинает обрабатывать данное прерывание (Подробнее см. раздел Ввод-вывод по прерыванию).

ПОП – это, в общем, обычная процедура. Если она использует какие-то регистры, то она в начале своей работы сохраняет  в стеке значения этих регистров, а в конце работы восстанавливает их. Поэтому, когда будет возобновлена работа прерванной программы, в регистрах останутся те же значения, которые были в них в момент прерывания. Для возобновления работы прерванной программы по команде IRET из стека восстанавливаются регистры IP, CS и регистр флагов.

Функции DOS

Рассмотренный механизм прерываний первоначально был предназначен для того, чтобы ОС могла следить за событиями во внешних устройствах ЭВМ (принтере, дисководах и др.). Но затем этот механизм стали использовать и в других целях. Например, в различных программах приходится выполнять одни и те же действия: выводить символы на экран или вводить символы с клавиатуры и т.д.

Чтобы избавить авторов программ от необходимости программировать эти действия в каждой программе заново, такие часто повторяющиеся действия описывают один раз в виде соответствующих процедур и включают их в состав ОС. Теперь все программы могут пользоваться этими процедурами. Эти процедуры ОС можно вызывать с помощью программных прерываний, т.е. с помощью команды

INT n,             n=0…255

Эта команда в программе вызывает искусственное (насильственное) прерывание с номером n.


Хотя по команде INT n можно вызвать ПОП для любого n (например, n=0), но следует использовать эту команду только для вызова процедур ОС. В состав ОС (точнее MS DOS) входит много процедур и для них не хватает номеров прерываний. Поэтому эти процедуры объединены в группы, чтобы процедуры из одной группы вызывались по прерываниям с одним и тем же номером.

Процедуры одной группы принято называть функциями соответствующего прерывания. Чтобы различить их, перед выполнением команды INT n в регистр АН записывают номер нужной функции

MOV              AH, <номер функции>

INT                 < номер прерывания>

Получив по команде INT n управление, ОС по номеру из регистра АН определяет, к какой именно функции произошло обращение и передает ей управление. Для выполнения функции может потребоваться определенная информация, например, для функции вывода символа на экран нужно указать код этого символа. Такая информация передается через регистры. Какие именно параметры надо передавать и через какие регистры – зависит от конкретной функции.

Некоторые функции прерывания 21h

Чтобы после завершения программы вернуть управление операционной системе, эта программа обращается к функции 4ch прерывания 21h/

MOV              AL, <код завершения>

MOV              AH, 4ch

INT                 21h

где <код завершения> - некоторое целое число, передающее информацию о успешной работе вызванной программы или об возникшей ошибке.

Вывод на экран (в текстовом режиме)

Для вывода одного символа на экран ПК используется информация 02 прерывания 21h.

MOV              DL, <код выводимого символа>

MOV              AH, 2

INT                 21h

Выводимый символ высвечивается в позиции курсора, после чего курсор сдвигается на одну позицию вправо (или на начало новой строки из последней позиции текущей строки).

Для вывода на экран строки (последовательности символов) можно с помощью функции 09 прерывания 21h.

            DS:DX – начальный адрес строки

            MOV              AH, 9



            MOV              21h

Перед обращением к этой функции в регистр DS должен быть помещен номер того сегмента памяти, в котором находится выводимая строка, а в регистр DX – смещение строки внутри этого сегмента. При этом в конце строки должен находиться символ '$’, который служит признаком конца строки и который сам не выводится.

6 Специальные команды

1) Манипуляции с флагами регистра FLAGS

а) с флагом переноса CF

CLC                                       ; 0 > CF

STS                                        ; 1 > CF

CMC                                      инвертирование CF

б) с флагом направления DF

CLD                                       ; 0 > DF

STD                                        ; 1 > DF

в) с флагом прерываний IF

CLI                                         ; 0 > IF

STI                                         ; 1 > IF

2) Команда останова

HALT                                     ; останов и ожидание сигнала сброса или сигнала

                                               ; прерывания

3) Команда ожидания

WAIT                                     ; переход МП в состояние ожидания внешнего

; активного сигнала

4) Холостая команда

NOP

1.2.6.     Программирование на языке ассемблера микропроцессора I8086

            В этом разделе приводится в основном краткий конспект книги Григорьева В.Л. Программирование однокристальных микропроцессоров. – М.: Энергоатомиздат, 1987. 288 с.

В языке ассемблер есть командные операторы, т.е. операторы которые транслятор переводит в команды МП (они впоследствии будут выполняться), операторы распределения данных и директивы ассемблера - команды для транслятора.

Исходный модуль программы представляет собой последовательность операторов (или предложений) языка ассемблера, которые классифицируются на:

- командные операторы, определяют генерируемые ассемблером машинные команды. Они содержат мнемонику и (необязательно) один или два операнда;

-         операторы распределения данных, резервирующие ячейки памяти для программных данных;



-         директивы ассемблера (или псевдокоманды), содержащие специальные указания для ассемблера.

Иногда операторы распределения данных относят к директивам.

Формат операторов.

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

{Метка:}   {Префикс}   Код операции   {Операнд(ы)}   {; Комментарии}

Фигурными скобками обозначены необязательные поля.

Директива ассемблера и операторы распределения данных имеют следующий формат:

{Имя}   Директива   {Операнд(ы)}   {; Комментарии}

Имя директивы никогда не заканчивается двоеточием. Некоторые директивы требуют обязательного наличия имени, например, SEGMENT, ENDS, PROC и другие. В других директивах поле имени должно быть пустым, например NAME, ASSUME, ORG, PUBLIC и другие. В операторах распределения данных DB, DW, DD имя является необязательным.

Поле директивы содержит одно из ключевых неизменяемых слов ассемблера и определяет его действия в процессе ассемблирования. Операнды директив аналогичны операндам командных операторов.

В языке ассемблера имеются три пары взаимосвязанных директив , требующих согласованного употребления :

SEGMENT/ENDS(сегмент / конец сегмента)

PROC/ENDP (процедура или подпрограмма/конец процедуры)

MACRO/ENDM (начало определения макрокоманды/ конец определения макрокоманды)

Элементы операторов .

Операторы состоят из:

-         ключевых слов;

-         идентификаторов ( меток и переменных );

-         численных констант;

-         символьных цепочек;

-         специальных символов;

-         комментариев.

Ключевые (или зарезервированные) слова являются именами, имеющими для ассемблера определенный смысл.


Примерами служат мнемоники команд и директив (MOV, PROC и др.).

Идентификатор (общий термин меток и имен переменных) - это определяемая программистом последовательность символов. Первым символом в последовательности должна быть буква или один из символов       @, -, ?, но один знак ? не может быть идентификатором. Остальные символы могут начинаться с прописной или строчной буквы латинского алфавита или одним из следующих специальных символов @, -, ? . Ассемблер различает идентификаторы по первым символам, количество этих символов зависит от версии языка ассемблер.

Операнды команд ( регистры, переменные, метки, константы ) имеют атрибут типа , который сообщает ассемблеру некоторую информацию об операнде. Например, тип abc сообщает ассемблеру, что операнд является численной константой, а не адресом ячейки памяти.

Ассемблер определяет для программиста набор следующих регистров МП:

общие типа BYTE - регистры AL, AH, BL, BH, CL, CH, DL, DH

общие типа WORD - регистры AX,BX,CX,DX,SP,BP,SI,DI

сегментные типа WORD - CS,DS,SS,ES.

Переменная - это единица программных данных, имеющая символическое имя. Переменная имеет три атрибута:

1)                сегмент (SEG) , идентифицирует сегмент , содержащий переменную;

2)                смещение (OFFSET) представляет собой расстояние в байтах переменной от начала (базы) содержащего ее сегмента ( диапазон 0..65535 );

3)                тип (TYPE) , идентифицирует единицу памяти, выделяемую для хранения переменной, т.е. 1 (байт), 2 (слово), 4 (двойное слово).

Ассемблер использует атрибуты переменной для определения формата генерируемой машинной команды.

Метка - это имя, относящееся к ячейке памяти, в которой находится команда, и предназначенное для использования как операнда в командах управления .Метка имеет 4 атрибута :

-сегмента (аналогичен такому же атрибуту переменной);

-смещения (аналогичен такому же атрибуту переменной);

-расстояние (дистанция), определяет возможность перехода по команде передачи к метке, находящейся или внутри сегмента (т.е. управления с помощью двухбайтного смещения -тип NEAR) или вне текущего сегмента (т.е. с помощью 4-байтного указателя сегмент: смещение - тип FAR);

-предположение о сегментном регистре CS. Когда при трансляции (1-ый проход) ассемблер встречает метку как операнд, он не знает ее смещение. Он делает предположение о ее расположении: близкая - NEAR , если знает, что смещение в пределах ±128байт, т.е. SHORT

            Ассемблер считает имя меткой, если выполняется одно из следующих правил:

                        -имя перед кодом операции заканчивается двоеточием, например,


Содержание раздела