Команда 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
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-тиразрядный |
||
|
К 16-ти разрядам CS добавляются 4 младших нулевых разряда. |
А в счетчик инструкций эти разряды добавляются слева. И мы получаем 20-тиразрядный физический адрес. |
Машинные программы обычно строятся так. Все команды программы размещаются в одном сегменте памяти, начало которого заносится в регистр 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 -активный Оба блока открыты. Выбрано слово. |
Как уже говорилось выше, конвейер команд этого МП рассчитан на 6 байт, что связано с длиной команды (см. рис. ниже).
Таблица. Mode
Mode |
Режим работы |
Смещение |
00 |
работа с памятью (операнд находится в памяти) |
нулевое |
01 |
8-миразрядное |
|
10 |
16-тиразрядное |
|
11 |
работа с регистром reg / mem |
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 |
Исполнительный адрес (смещение относительно базы сегмента) |
||
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
Ассемблер считает имя меткой, если выполняется одно из следующих правил:
-имя перед кодом операции заканчивается двоеточием, например,