• Что можно приготовить из кальмаров: быстро и вкусно

    Основы программирования МП устройств (Лекция)

    ПЛАН ЛЕКЦИИ

    1.Классификация команд микропроцессора

    2.Виды адресации

    3. Структура и форматы команд МП КР580ВМ80

    1.Классификация команд микропроцессора

    Как уже отмечалось,принципиальнымдостоинствомМП является программируемость. Этоозначает,чтоподаваяна вход МП команды, можно обеспечить нужную последовательность операций, т.е. реализацию определенного алгоритма.Алгоритмрешаемой задачи может быть сколь угодно сложным,необходимо лишь,чтобы этот алгоритм был разбит на шаги всоответствииссистемой команд МП.Поэтому система команд важна не только с точки зрения, что МП может делать, но и как выполняется алгоритм. Наличие или отсутствие какой–либо команды или группы команд может существенно повлиять навыборМПдляконкретного применения.

    Классификация команд МП представлена на рисунке 8.

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

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

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

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

    К командам связанным с обращением к памяти относятся:

    ЗАПОМНИТЬ (ЗАПИСАТЬ), по которой содержимое регистра засылается в ячейку памяти.

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

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

    ЗАГРУЗИТЬ НЕПОСРЕДСТВЕННО ,покоторойв регистр записывается константа, указанная в коде команды;

    ПЕРЕСЛАТЬ , по которой содержимое одного регистра пересылается в другой.

    К командам ввода–вывода относятся:

    ВВОД , покоторойсодержимоеустройства ввода засылается во внутренний регистр МП;

    ВЫВОД , покоторойсодержимоевнутреннего регистра МП (обычно аккумулятора) пересылается в устройство вывода.

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

    К командам безусловного перехода относятся:

    БЕЗУСЛОВНЫЙ ПЕРЕХОД (БП),по которой в программный счетчик записывается содержимое адресного поля команды БП, т.е. обеспечивается переход в программе по адресу, указанному в команде;

    БЕЗУСЛОВНЫЙ ПЕРЕХОД С ВОЗВРАТОМ (переход кподпрограмме),по которой впрограммныйсчетчик записывается новое содержимое (адрес первой команды подпрограммы),но в отличие от команды БПвпамяти сохраняется состояниепрограммногосчетчика и некоторых других регистров. При выполнении подпрограммы по ее последней команде ВОЗВРАТ восстанавливается содержимое программного счетчика и всех регистров.

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

    УСЛОВНЫЙ ПЕРЕХОД (УП) по адресу.В коде команды УП обязательно указывается проверяемое условие,в качестве которого в МП используются нулевоеилиненулевое значение результата,положительный или отрицательный знак результата, наличие или отсутствие сигналов переноса, переполнения и др.При выполнении условия в программный счетчик записывается содержимое адресного поля команды УП, т.е. обеспечивается переход в программе по адресу указанному в команде. При невыполнении условия управление передается следующей команде программы;

    УСЛОВНЫЙ ПЕРЕХОД С ВОЗВРАТОМ , которая отличается от команды БЕЗУСЛОВНЫЙ ПЕРЕХОД С ВОЗВРАТОМ тем, что переход к подпрограмме происходит только при выполнении указанного условия.

    Обычно в систему команд МП включается ещенескольковспомогательных команд, которые позволяют управлять состоянием регистров или триггеров влияющих на выполнение условных переходов, например: УСТАНОВИТЬ ФЛАГ,СБРОСИТЬ ФЛАГ, УСТАНОВИТЬ СТАРШИЙ РАЗРЯД АККУМУЛЯТОРА, СБРОСИТЬ СТАРШИЙ РАЗРЯД АККУМУЛЯТОРА и др.

    Команды обработкиданных делятся на арифметические и логические. К арифметическим относятся:

    СЛОЖИТЬ содержимое двух регистров или регистра и ячейки памяти;

    ВЫЧЕСТЬ из содержимого ячейки памятиилирегистрасодержимое регистра;

    УВЕЛИЧИТЬ НА 1 (ИНКРЕМЕНТ) содержимое ячейки памяти или регистра (указателя стека, индексного регистра, аккумулятора);

    УМЕНЬШИТЬ НА 1 (ДЕКРЕМЕНТ) содержимое ячейки памяти или регистра;

    СЛОЖИТЬ С УЧЕТОМ ПЕРЕНОСА ,по которой выполняетсясложениес учетом состояния триггера переноса. Это позволяет легко организовать обработку чисел большой длины;

    ВЫЧЕСТЬ С УЧЕТОМ ЗАЕМА ;

    СДВИГ содержимого ячейки памяти или регистра(обычнонаодин разряд).

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

    И (ЛОГИЧЕСКОЕ УМНОЖИТЬ),по которой выполняется операция конъюнкции между содержимым двух регистров или ячейки памяти и регистра;

    ИЛИ (ЛОГИЧЕСКИ СЛОЖИТЬ),по которой выполняется операция дизъюнкции между содержимым двух регистров или ячейки памяти и регистра;

    НЕРАВНОЗНАЧНОСТЬ , по которой производится поразрядное сравнение содержимого двух регистров или ячейки памяти и регистра;

    ИНВЕРСИЯ содержимого ячейки памяти или регистра.

    2.Виды адресации

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

    Во–первых, большой объем памяти требует большойдлиныадреса, так какn–разрядный адрес позволяет обращаться к памяти емкостью 2n слов. Типовые 8–разрядные слова МП дают возможностьнепосредственно обращаться только к 256 ячейкам памяти,что явно недостаточно. Если учесть, что обращение к памяти является наиболее часто встречающейся операцией, то очевидно, что эффективность использования МП во многом определяется способами адресации к памяти большого объема прималой разрядности МП.

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

    Если адресноеполев команде является ограниченным и недостаточным для непосредственного обращения к любой ячейке памяти, то память в таких случаях разбивают на страницы,где страницей считается 2n ячеек памяти.

    Для согласования адресного поля команды малой разрядности с памятью большогообъема (для решения “страничной” проблемы) в МП применяются различные виды адресации:

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

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

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

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

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

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

    3. Структура и форматы команд МП КР580ВМ80

    Система команд МП серии КР580ВМ80 содержит команды трехформатов: однобайтные,двухбайтные и трехбайтные .

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

    Если в выполнении операции участвуют регистры, то один или два из них могут быть указаны в первом байте команды. При этом под номера регистров в поле команды отводятся вполнеопределенныеразряды: три младших разряда (b2 – b0) кодируют номер регистра источника, содержащего операнд, а три средних (b5 – b3) – номер регистра–приемника, вкоторый засылается результат операции.В тех случаях,когда оба или один из этих регистров не участвуют ввыполненииоперации, соответствующие разряды используются под код операции.

    Принято следующее кодирование регистров:

    000 – регистр В,100 – регистр Н,

    001 – регистр С,101 – регистр L,

    010 – регистр D,110 – ячейка памяти,

    011 – регистр Е,111 – аккумулятор А.

    Код 100являетсяпризнаком косвенной адресации к памяти с помощью 16–разрядного адреса,размещенного в регистрах Н и L. В зависимости от расположения этого кода в команде,обращение к соответствующей ячейке памяти производится или за операндом,или для записи результатов операции.

    Ряд команд МП предусматриваетобработкуилипередачучисел двойной длины. В этих случаях пары регистров В и С, D и Е или Н и L объединяются в 16–разрядные регистры,имеющие номера 00,01 и10 соответственно. Под номера регистровых пар в командах отводятся разряды b2 и b1 (регистр–источник),b5 и b4 (регистр–приемник), а разряды b0 и b3 используются для указания кода операции.

    К двухбайтным командам в МП относятся команды снепосредственной адресациейикоманды ввода–вывода.Соответственно второй байт команды этой группы содержит 8–разрядный операнд или 8–разрядный адрес устройства ввода или вывода.

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

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

    Для удобствасохранения и восстановления состояния МП во время прерываний и перехода к подпрограммам все указанные признакисохраняются вспециальномрегистре– регистре признаков. Расположение признаков в разрядах регистра приведено в таблице.

    гдеS – признак “знака” (принимает значениестаршегоразряда

    результата);

    Z – признак нулевого результата;

    АС –признак вспомогательного переноса (если есть перенос

    между тетрадами байта, то АС=1, иначе АС=0;

    Р – признак четности результата (если число единиц в байте

    результата четно, то Р=1, иначе Р=0);

    С – признак переноса или заема(если при выполнении коман–

    ды возник перенос из старшего разряда или заем в стар–

    ший разряд то С=1, иначе С=0).

    Примечание: Для команд логического умножения признак вспомогательного переноса АС принимает значение четвертого разряда результата.

    Полностью система команд МП серии КР580ВМ80 приведена в приложении учебного пособия "Микропроцессоры и микропроцес­сорные системы". Там же для каждой команды указывается как,после ее выполнения, изменяется значение каждого признака: устанавливается в соответствии с результатом операции (+), не изменяется (–), сбрасывается в нуль (0) или устанавливается в единицу (1).

    В общем случае команда должна содержать следующую информацию:

    –код операции,указывающий операцию,которую должен выполнить МП;

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

    –адрес ячейки памяти в которую должен быть помещен результат операции;

    –адрес следующей команды.

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

    В системе команд МП серии 580 имеются однобайтные, двухбайтные и трехбайтные команды.

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

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

    Эти командыпозволяютисключитьсравнительно длинный цикл обращения к ОЗУ и тем самым существенно повысить скорость выполнения операций. В связи с ограниченной разрядностью РОН и при работе с большим массивом данных,используются другие методы адресации, которые позволяют обращаться к операндам, расположенным во внешней по отношению к МП памяти. Наиболее распространенной является косвенная регистровая адресация,которая использует регистровую пару HL.

    Нарушение естественного порядка следования команд, когда адрес следующей выполняемой команды автоматически вычисляется программным счетчиком, осуществляется путем загрузки в программный счетчик и, при необходимости, в сегментный регистр CS новых адресов. Эти действия выполняются при помощи команд условных и безусловных переходов.

    Безусловные переходы

    Безусловный переход - это переход, который выполняется всегда. Безусловный переход осуществляется с помощью команды JMP . У этой команды один операнд, который может быть непосредственным адресом, регистром или ячейкой памяти, содержащей адрес. Примеры безусловных переходов:

    Jmp metka ;Переход на метку jmp bx ;Переход по адресу в BX jmp word ;Переход по адресу, содержащемуся в памяти по адресу в BX

    Условные переходы

    Условный переход осуществляется, если выполняется определённое условие, заданное флагами процессора. Cостояние флагов изменяется после выполнения арифметических, логических и некоторых других команд. Если условие не выполняется, то управление переходит к следующей команде.

    Существует много команд для различных условных переходов. Давайте рассмотрим подробнее все эти команды:

    Команда Переход, если Условие перехода
    JZ/JE нуль или равно ZF=1
    JNZ/JNE не нуль или не равно ZF=0
    JC/JNAE/JB есть переполнение/не выше и не равно/ниже CF=1
    JNC/JAE/JNB нет переполнения/выше или равно/не ниже CF=0
    JP число единичных бит чётное PF=1
    JNP число единичных бит нечётное PF=0
    JS знак равен 1 SF=1
    JNS знак равен 0 SF=0
    JO есть переполнение OF=1
    JNO нет переполнения OF=0
    JA/JNBE выше/не ниже и не равно CF=0 и ZF=0
    JNA/JBE не выше/ниже или равно CF=1 или ZF=1
    JG/JNLE больше/не меньше и не равно ZF=0 и SF=OF
    JGE/JNL больше или равно/не меньше SF=OF
    JL/JNGE меньше/не больше и не равно SF≠OF
    JLE/JNG меньше или равно/не больше ZF=1 или SF≠OF
    JCXZ содержимое CX равно нулю CX=0

    У всех этих команд один операнд - имя метки для перехода. Сравнения «выше» и «ниже» относятся к беззнаковым числам, а «больше» и «меньше» - к числам со знаком.

    Команды CMP и TEST

    Для формирования условий переходов используются команды CMP и TEST . Команда CMP предназначена для сравнения чисел. Она выполняется аналогично команде SUB : из первого операнда вычитается второй, но результат не записывается на место первого операнда, изменяются только значения флагов. Например:

    Cmp al,5 ;Сравнение AL и 5 jl c1 ;Переход, если AL

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

    Test bl,00000100b ;Проверить состояние 2-го бита BL jz c2 ;Переход, если 2-й бит равен 0

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

    Команды безусловных переходов. Включают три мнемокода: JMP (безусловный переход), CALL (вызов подпрограммы) и RET (возврат из подпрограммы).

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

    Первый формат обеспечивает переход в произвольную точку программы внутри текущего программного сегмента, для чего к содержимому IP добавляется в дополнительном коде 16-разряд­ное смещение, старший разряд которого является знаковым. Вто­рой, укороченный формат позволяет перейти к точке программы, отстоящей не более чем на -128-f-127 адресов от команды JMP. Наконец, третий формат осуществляет загрузку указателя команд 16-разрядным числом, которое размещено по исполни­тельному адресу ЕА, определяемому постбайтом. Этот переход называется косвенным, так как используется косвенная адреса­ция.

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

    Четвертый формат определяет прямой межсегментный пере­ход, при котором во втором и третьем байтах формата указан относительный адрес точки перехода, а в четвертом и пятом бай­тах- новое значение CS. Пятый формат с помощью постбайта позволяет определить исполнительный адрес ЕА, по которому на­ходится относительный адрес точки перехода (в байтах памяти с адресами ЕА, ЕА+1), и новое значение CS (в байтах памяти ЕА+2, ЕА+3).

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

    Для возврата из подпрограммы используется команда RET, под действием которой происходит передача управления по ад­ресу возврата, занесенному в стек при выполнении предыдущей команды CALL. При возврате из подпрограмм, расположенных в текущем программном сегменте, применяются первые два фор­мата команды RET, причем второй формат отличается от перво­го тем, что к содержимому указателя стека добавляется констан­та, записанная во 2-м и 3-м байтах команды. Это позволяет одновременно с возвратом из подпрограммы сбрасывать пара­метры, записанные в стек при выполнении этой подпрограммы и не используемые в дальнейшем.

    Для межсегментного возврата применяются третий и четвер­тый форматы RET, которые обеспечивают восстановление содер­жимого как указателя команд, так и программного сегмента.

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

    В мнемокодах команд условных переходов при сравнении чи­сел со знаком для обозначения условия «больше» используется буква G (Greater - больше), а для обозначения - «меньше» буква L (Less - меньше). Для аналогичных условий при сравне­нии чисел без знака используются соответственно буквы A (Abo­ve - над) и В (Below - под). Условие равенства обозначается буквой Е (Equal - равно), а невыполнение некоторого условия - буквой N (Not - не). Следует отметить, что допускается исползование двух различных мнемокодов для каждой команды; на­пример, мнемокоды JL и JNGF - эквивалентны, поскольку ус­ловия «меньше» и «не больше или равно» - идентичны.

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

    Таблица 1.4

    Мнемокод команды Условие Значение флагов
    Для чисел со знаком
    JL/JNGE Меньше/не больше или равно SF + OF = l
    JNL/JGE Не меньше/больше или равно SF + OF = 0
    JG/JNLE Больше/не меньше или равно (SF + OF) V ZF = 0
    JNG/JLE Не больше/меньше или равно Для чисел без знака (SF + OF) V ZF = l
    JB/JNAE Меньше/не больше или равно CF = 1
    JNB/JAE Не меньше/больше или равно CF = 0
    JA/JNBE Больше CF V ZF = 0
    JNA/JBE Не больше Для прочих данных CF V ZF = 1
    JE/JZ Равно/по нулю ZF = 1
    JNE/JNZ Не равно/по нулю ZF = 0
    JS По минусу SF = 1
    JNS По плюсу SF = 0
    JO По переполнению OF = l
    JNO По отсутствию переполнения OF = 0
    JP/JPE По четному паритету PF = 1
    JNP/JPO По нечетному паритету PF = 0

    Все команды условных переходов имеют одинаковый двух­байтовый формат, в первом байте которого задается код опера­ции (КОП), а во втором - 8-разрядное смещение, которое рас­сматривается как число со знаком и, следовательно, позволяет осуществлять изменение адреса в диапазоне от -128 до +127. При необходимости более отдаленного («дальнего») перехода по выполнению условия используется дополнительно команда безусловного перехода.

    Время выполнения каждой из команд условных переходов указано для двух случаев: 1) условие выполнено и управление действительно передается в соответствии со смещением, 2) ус­ловие не выполнено, так что управление передается следующей команде.

    Команды организации циклов. Введены в ЦП для удобства выполнения вычислительных циклов. К ним относятся следующие мнемокоды: LOOP (цикл, пока (СХ) не равно 0), LOOPNZ/LOOPNE (цикл, пока не нуль/не равно), LOOPZ/LOOPE (цикл, пока нуль/равно) и JCXZ (переход по нулю в СХ). Каждая из этих команд имеет двухбайтовый формат, во втором байте кото­рого указывается 8-разрядное смещение, используемое для орга­низации перехода. Это смещение рассматривается как число со знаком и перед вычислением адреса перехода оно расширяется со знаком до 16 разрядов.

    Используя команды циклов совместно с командами манипу­ляции элементами строк, можно составлять достаточно сложные программы преобразования строк. Рассмотрим пример составле­ния программы для перевода строки данных, записанных в шестнадцатеричной системе счисления, в некоторый код, для которого перекодировочная таблица находится в памяти с начального ад­реса, указанного в ВХ, как это требуется для использования команды табличного преобразования кодов XLAT. Пусть далее исходная строка содержит 80 элементов и находится в памяти с относительного начального адреса 100, а строка-результат дол­жна быть размещена с относительного адреса 200. Программа, выполняющая перекодировку исходной строки в строку-резуль­тат, при значении флага направления DF=0 будет иметь вид:

    MOV SI ,100
    MOV DI ,200
    MOV СХ, 80

    Здесь использована команда табличного преобразования кодов XLAT, описанная в 1.2.

    Команды прерывания. Включают три мнемокода: INT (пре­рывание), INTO (прерывание при переполнении) и IRET (воз­врат из прерывания).

    Команда прерывания INT при v = 1 имеет двухбайтовый фор­мат, второй байт которого содержит 8-разрядное число, определя­ющее тип (type) или уровень прерывания. По команде INT type процессор переходит к выполнению программы обслуживания прерывания указанного уровня, причем автоматически выполня­ются действия, необходимые для обеспечения возврата в точку прерывания. Эти действия состоят в следующем: содержимое регистра флагов F записывается в стек (PUSHF), сбрасывают­ся флаги IF и TF, текущие значения регистра CS и указателя команд IP записываются в стек.

    Для определения начального адреса программы обслужива­ния в соответствии со значением type используется таблица уровней прерывания. Для каждого из 256 уровней прерываний в этой таблице от­ведено по четыре байта: первые два байта определяют значение указателя команд IP, вторые - значение сегментного регистра CS. Эта четверка байтов определяет начальные адреса программ обслуживания (пары значений CS, IP), которые должны быть предварительно записаны в ячейки памяти по абсолютным адре­сам 0-3FFH. Адрес таблицы, соответствующий указанному в команде INT type уровню прерывания, определяется в ЦП сле­дующим образом. После запоминания в стеке текущих значений CS и ГР осуществляются загрузки: CS = type x 4 + 2 и IP = type x 4. Новые значения CS и IP, взятые соответственно из ячеек с адресами type x 4 + 2 и type x 4, определяют начальный адрес требуемой программы обслуживания.

    Рассмотренная выше команда прерывания INT при значении поля v = 0 имеет однобайтовый формат, т. е. не требует специаль­ного указания уровня прерывания. Эта команда автоматически воспринимается процессором как прерывание третьего уровня (type=3) и обычно используется в программах в качестве контрольной точки.

    Команда прерывания при переполнении INTO вызывает пе­реход на обслуживание прерывания четвертого уровня (type = 4) в случае, когда значение флага переполнения OF = 1. Команда INTO обычно используется после арифметических команд над числами со знаком. Обычно несколько первых уровней прерыва­ний (до 32) резервируются под обработку ряда специфических ситуаций, таких, например, как попытка деления на нуль, переполнение и тому подобных.

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

    Однобайтовая команда IRET ставится в конце каждой про­граммы обслуживания прерывания и обеспечивает возврат из прерывания. По этой команде процессор извлекает из стека значение указателя команд IP и программного сегмента CS, а также восстанавливает прежнее содержимое регистра флагов F (как и по команде POPF). При необходимости содержимое остальных регистров ЦП, соответствующее прерываемой программе, может быть запомнено в стеке при переходе на программу обслужива­ния и затем восстановлено при возврате из нее с помощью команд обращения к стеку.

    Команды микропроцессора.

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

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

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

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

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

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

    Пример.

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

    Очевидно, что для реализации данного алгоритма придется прервать последовательное выполнение команд. Для того, чтобы программа имела возможность менять алгоритм своей работы в зависимости от какого-либо условия, в системе команд любого процессора обязательно имеются команды передачи управления. К командам передачи управления отно­сятся следующие виды команд: команды условного перехода; команды безусловного перехода; команды перехода к подпрограмме; команды организации цикла. Рассмотрим все эти виды команд по порядку.

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

    Оба этих вида команд предназначены для того, чтобы прерывать после­довательное выполнение программы и вызывать так называемый переход. Причем условный переход происходит только при соблюдении какого-либо условия. Безусловный переход выполняется всегда, как только программа встретит соответствующую команду. В качестве условий перехода может выступать одно из следующих логических выражений:

    ♦ величина А равна величине В;

    ♦ величина А не равна величине В;

    ♦ величина А меньше величины В;

    ♦ величина А больше величины В;

    ♦ величина А меньше или равна величине В;

    ♦ величина А больше или равна величине В.

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

    Пример.

    Рассмотрим пример применения условного и безусловного переходов. Для наглядности изобразим цепочку команд в программной памяти в виде последовательности графических элементов (см. рис. 2.2). Ход выполнения программы показан при помощи стрелок. Квадратиками обозначены обычные команды (команды перемещения и команды пре­образования данных). Кружочек с вопросом - это команда условного перехода. Скругленный элементе восклицательным знаком - это безусловный переход. Такая программа имеет две ветви. В случае, если условие есть ложь, выполняется ветвь номер 1. В случае, если условие - истина, выполняется ветвь номер 2.

    Допустим, что условный переход производит сравнение кода нажатой клавиши с некоторой константой. Тогда действие, выполняемое услов­ным оператором, можно записать так: «Если код нажатой клавиши равен 0, перейти к выполнению ветви номер 2». Соответственно, в случае невы­полнения условия (например, считанное число равно 1), программа про­должит свою работу в обычном режиме и перейдет, таким образом, к выполнению ветви номер 1.

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

    Команда безусловного перехода имеет уже упоминавшийся мнемокод jmр.

    Для организации безусловного перехода в регистры сs и iр (или только iр) загру- жается их новое содержимое, то есть новый указатель. При этом их старое содер- жимое - старый указатель - безвозвратно теряется. Это значит, что после со- вершения перехода восстановить точку программы, из которой он был совершен, невозможно. На рис. 4.36, а приведен пример выполнения безусловного перехо- да по команде jmр Ml.


    Вызов подпрограмм осуществляется с помощью команды с мнемокодом call (вызвать). В команду call входит метка директивы рrос (от procedure - про- цедура), с которой в языке Ассемблер принято начинать подпрограммы. Закан- чиваются подпрограммы директивой епdр (от end procedure - конец процеду- ры), которая должна иметь ту же самую метку, что и директива рrос.

    Обращение к подпрограмме происходит следующим образом. Вначале старое значение указателя из регистров сs:iр помещается в стек (рис. 4.36, б). Отме- тим, что в момент выполнения команды call регистры сs:iр содержат адрес команды, которая расположена непосредственно за этой командой вызова под- программы. На рис. 4.36, б эта точка программы отмечена меткой VI. Затем из команды вызова выбирается новый указатель (в примере на рисунке это указа- тель на метку Р1 начала подпрограммы), который загружается в регистры сs:iр. Тем самым обеспечивается переход к выполнению вызванной подпрограммы.

    Сохранение в стеке адреса, откуда был совершен переход в подпрограмму, обес- печивает возможность при необходимости вернуться в точку вызова. Чтобы та- кой возврат произошел, в подпрограмму должна быть включена команда rеt (от return - возврат), схема выполнения которой показана на рис. 4.36, в. По коман- де rеt производятся выборка указателя из вершины стека и последующая его загрузка в пару регистров сs:iр. В примере на рис. 4.36 из стека выбирается
    указатель, соответствующий метке VI, которой отмечена команда, непосредст- венно следующая за командой вызова call Рl.



    Использование стека для хранения последовательности адресов возвратов позво- ляет правильно организовать вложенные обращения к подпрограммам. На рис. 4.37 изображена схема выполнения вложенных вызовов, когда из основной програм- мы вызывается подпрограмма Рl, а из нее - другая подпрограмма Р2. Во время выполнения первого вызова по команде call Рl (рис. 4.37, а) в стек попадает адрес точки возврата VI и управление передается в начало подпрограммы Рl. Внутри подпрограммы Рl вызывается другая подпрограмма Р2. По команде call Р2 в стек попадает адрес второй точки возврата V2 и происходит переход в начало второй подпрограммы Р 2 (рис. 4.37, б).

    Предполагается, что в теле подпрограммы Р2 других вызовов нет. Поэтому в мо- мент выполнения находящейся в теле подпрограммы Р2 команды rеt из верши- ны стека выбирается адрес второй точки возврата V2 (рис. 4.37, в) и таким обра- зом осуществляется возвращение в первую подпрограмму Рl, в ту ее точку, из которой была вызвана подпрограмма Р2.

    Когда закончится выполнение подпрограммы Рl и начнется выполнение ее ко- манды rеt (рис. 4.37, г), из вершины стека окажется выбранным адрес первой точки возврата VI и, следовательно, осуществится возврат в основную программу.

    Обсуждаемая схема обеспечивает корректную обработку вызовов подпрограмм с произвольной глубиной вложенности. Если быть точным, то глубина вложен- ности вызовов ограничивается только объемом стека.