1. Представление данных. Форматы команд и способы адресации. Программирование в машинных кодах и на языке АССЕМБЛЕРа. Рабочий цикл и состояние микропроцессора. Байт-состояние, назначение разрядов в коде слова состояния процессора - Учебно-методический комплекс

1. Представление данных. Форматы команд и способы адресации. Программирование в машинных кодах и на языке АССЕМБЛЕРа. Рабочий цикл и состояние микропроцессора. Байт-состояние, назначение разрядов в коде слова состояния процессора

 

Представление данных. Форматы команд и способы адресации. Программирование в машинных кодах и на языке АССЕМБЛЕРа. Рабочий цикл и состояние микропроцессора. Байт-состояние, назначение разрядов в коде слова состояния процессора.

 

Любая программа для ЭВМ - системная или приклад­ная — воспринимается (распознается) процессором толь­ко в том случае, если она состоит из специальных ко­манд, коды которых известны процессору определенного типа. Команды записаны в памяти компьютера в специ­альном формате. Каждая команда состоит из операционной и адресной частей. В первой из них находится позиционный двоичный код, определяющий требуемое от процессора действие (сложение, вычитание и т.д.). Во второй – адресной части команды, также в виде двоичного позиционного кода, находятся адреса данных (операндов), над которыми это действие необходи­мо выполнить, либо сами операнды. В вольном переводе на русский язык не­которую команду можно, например, интерпретировать так: сложить два числа, находящиеся в памяти по ад­ресам 100 и 120.

Разные типы ЭВМ имеют отличные друг от друга спосо­бы кодировки команд. Так, на персональных IВМ-совместимых компьютерах некоторая команда сложения в двоичном коде может иметь вид:0000001111000011D или в шестнадцатиричном коде 03С3H . А на «древних» компью­терах типа М-220 команда сложения двух чисел могла выглядеть так:

001 00000001100100 00000001111000 00000001111011.

Поэтому программа в кодах компьютера (машинных кодах) является машинно-зависимой и непереносимой, т.е. подготовленная для компьютера одного типа, она не сможет выполняться на других. Этот факт определяет основной недостаток про­граммирования в машинных кодах.

Вторым недостатком программирования в кодах явля­ется сильное дробление программы. Дело в том, что логи­чески команды процессора достаточно примитивны и обу­славливают выполнение простейших операций. Так, про­граммирование несложной формулы x=(a+b)(c+d) требо­вало задания серии команд типа:

- сложить а и b, промежуточный результат записать в   ,

- сложить c и d, промежуточный результат записать в   ,

- умножить   на   , результат записать в х.

При программировании в кодах ви­зуально каждая программа состояла из большого количе­ства команд-строк, похожих на приведенные выше двоич­ные коды. Это определяло третий недостаток программи­рования в кодах - затрудненную читаемость программы и, как следствие, сложность исправления (отладки) или доработки программы.

Однако программированию в кодах присущи и значи­тельные плюсы. Программист управляет всеми ресурсами компьютера, полностью контролирует текущее состояние ЭВМ, выбирает наиболее оптимальный код команды. Са­мые короткие по объему и наиболее быстрые по выполнению программы или их фрагменты разрабатываются и се­годня в кодах. Для облегчения наглядности программы в кодах разработаны специальные символические языки — ассемблеры. В них каждой команде компьютера сопостав­ляется определенный символьный код, являющийся со­кращением «родных» для человека слов. Специальная программа (она также называется ассемблером) переводит (транслирует)«непонятную» для компьютера (но более понятную для человека) символьную строку в коды ком­пьютера. Так, приведенные выше коды команд сложения на ассемблере могли выглядеть так: ADD АХ, BX (сло­жить числа из регистров АХ и ВХ и результат запомнить в АХ). При программировании на ассемблере программист мо­жет оперировать не с адресами памяти, в которых хра­нятся данные, а с их символическим представлением. На­пример, вначале ассемблеру специальной инструкцией со­общается, что по такому-то адресу хранится число, на­званное для программиста . Далее программист не заду­мывается над тем, по какому адресу находится соответ­ствующее число, но просто использует его имя.

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

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

Команды, как и любая информация в ЭВМ, кодируются двоичными словами, которые должны содержать в себе следующие виды информации:

·      тип операции, которую следует реализовать в данной команде (КОП);

·       место в памяти, откуда следует взять первый операнд (А1);

·       место в памяти, откуда следует взять второй операнд (А2);

·       место в памяти, куда следует поместить результат (A3).

Каждому из этих видов информации соответствует своя часть двоичного сло­ва — поле, а совокупность полей (их длины, расположение в командном слове, способ кодирования информации) называется форматом команды. В свою очередь, некоторые поля команды могут делиться на подполя. Формат команды, поля которого перечислены выше, называется трехадресным . Команды трехадресного формата занимают много места в памяти, в то же время далеко не всегда поля адресов используются в командах эффективно. [Действительно, наряду с двухместными операциями (сложение, деление, Конъюнкция и др.) встречаются и одноместные (инверсия, сдвиг, инкремент др.), для которых третий адрес не нужен. При выполнении цепочки вычис-ний часто результат предыдущей операции используется в качестве опе-да для следующей. Более того, нередко встречаются команды, для кото-операнды не определены (СТОП) или подразумеваются самим кодом раций (DAA, десятичная коррекция аккумулятора).

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

- прямая,

- косвенная,

- непосредственная,

- автоинкрементная (автодекрементная),

- страничная,

- индексная,

- относительная

Прямая адресация – исполнительный адрес размещается в адресном поле команды. В этом способе непосредственно используется счетчик команд и аккумулятор МП. При прямой адресации содержимое счетчика команд передается на ША и из адресуемой ячейки выбирается очередная команда, поступающая в устройство управления МП. С помощью прямой адресации в АЛУ может вызываться и операнд. Для этого на ША передается адрес ячейки памяти, содержащийся в команде. При необходимости изменения последовательного порядка выполнения программы адресуется ячейка памяти, содержащая адрес условного или безусловного перехода. Команда, содержащая прямой адрес, занимает 2-3 ячейки памяти, что соответственно требует и 2-3 обращений к памяти. Еще одно обращение может потребоваться для непосредственного вызова операнда.

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

Косвенная адресация– адресное поле команды указывает не адрес операнда, а лишь адрес ячейки, в которой хранится косвенный адрес, по которому можно получить операнд. В МП косвенная адресация обычно является неявной регистровой. В этом случае команда предписывает выполнить операцию над операндом, адрес которого содержится в регистрах общего назначения (обычно для этого выделяются определенные регистры блока РОН). Так, команда MOV REG,M загружает любой регистр из ячейки памяти, адрес которой содержится в регистровой паре H,L. Команда LDAX загружает аккумулятор с использованием адреса, содержащегося в регистровой паре B или D (используя регистры B или D можно осуществить косвенную загрузку только аккумулятора).

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

ИА = [базовый адрес] + (содержимое индексных регистров)

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

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

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

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

- основные (арифметические, логические, пересылочные операции);

- передачи управления;

- ввода-вывода;

- системные (установка маски прерываний, состояния процессора и др.).

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

Рабочий цикл начинается (см. рисунок 4.6) с определения состояния процессора - СЧЕТ или ОЖИДАНИЕ. Процессор никаких действий в состоянии ожидания не выполняет и может выйти из него только при активизации некоторых внешних сигналов, например, запроса на прерывание ЗПр.

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

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

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

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

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

1.   Состояние захвата шин.

2.   Состояние прерывания.

3.   Состояние ожидания.

4.   Состояние останова.

1) Состояние захвата шин инициируется внешним сигналом HLD, поступающим на одноименный вход микропроцессора. Указанный сигнал посылает специализированный контроллер КР580ВТ57 – контроллер прямого доступа к памяти – это четырехканальный программируемый контроллер, берущий на себя функцию управления шинами адреса и данных. Такое управление реализуется контроллером после получения разрешающего сигнала HLDА. С помощью контроллера осуществляется двунаправленный обмен массивами данных до 16 килобайт по одному из каналов. К каналу с одной стороны подключено внешнее устройство, с другой – память. При работе в этом режиме микропроцессор переводит свои магистрали (шина адреса и шина данных) в третье состояние (отключенное). Состояние захвата шин длится целое число машинных тактов. Микропроцессор при этом на каждом машинном такте синхроимпульсов С2 проверяет наличие сигнала HLD. Если сигнал снимается, то по следующему тактовому импульсу С2 режим захвата шин прекращается, и микропроцессор переходит к выполнению очередного машинного цикла, начиная с такта Т1.

2) Состояние обслуживания прерывания инициируется сигналом INT на входе микропроцессора. Данный сигнал может поступить либо от внешнего устройства, либо от контроллера прерываний КР580ВН59.

Микропроцессор может не обслуживать прерывания, если внутренний триггер разрешения прерываний сброшен. Если триггер установлен в единицу (сигнал INTA), то микропроцессор после получения запроса на прерывание сообщает другим модулям системы о выполняемом машинном цикле записью байта состояния (D0D1D5, равные «1») в регистр слова состояния или одноименный регистр внутри системного контроллера. После перехода в режим обслуживания микропроцессор осуществляет процедуру вызова подпрограммы прерывания.

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

1.    Формируется сигнал разрешения прерывания INTA на выходе микропроцессора. По этому сигналу возможна запись адреса первой команды подпрограммы обслуживания прерываний. (Существует однобайтная инструкция RST <AAA> для указания адреса перехода на ячейку памяти, где <AAA> - трехразрядный код).

2.    Трехбайтная команда вызова CALL <A1><A2>, где A1 – младший байт, A2 – старший байт. CALL - код команды вызова. При наличии в системе контроллера прерывания и системного контроллера по первому разрешающему сигналу INTA, который формирует системный контроллер, контроллер прерываний выдает на шину данных код команды CALL. По двум последующим сигналам INTA системного контроллера на шину данных поступают младший и старший байты адреса первой команды подпрограммы обслуживания прерываний. До считывания указанного адреса перехода на подпрограмму прерывания, микропроцессор сохраняет содержимое программного счетчика в стеке, а также всю необходимую информацию, а в программный счетчик загружает поступивший адрес перехода. Далее выполняется подпрограмма обслуживания прерываний.

3) Состояние ожидания предполагает отключение микропроцессора от шины адреса и шины данных, формирование на его выходе сигнала ожидания WT, на входе осуществляется проверка сигнала готовности RDY. Сигнал RDY может отсутствовать из-за низкого быстродействия периферийного устройства. Данный режим позволяет синхронизировать работу более быстрого микропроцессора с более медленным внешним устройством.

4) Состояние останова предполагает также формирование сигнала ожидания WT на выходе микропроцессора, отключение его от шины адреса и шины данных. Переход в состояние останова осуществляется программно, по инструкции (сигнал HLT). Выход из этого состояния возможен только после перезагрузки (начальной установки).