III.  Третья группа вопросов: Ассемблер



 

  1. Компиляция программы.

1. Ассемблер. Понятие, применение, особенности, основные определения.

 

Если коротко, то язык ассемблера — это символическое представление машинного языка.

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

 

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

 

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

 

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

 

Типичный современный компьютер (на базе i486 или Pentium) состоит из следующих компонентов (рис. 1).

 

 

Рис. 1. Компьютер и периферийные устройства

 

Из рисунка видно, что компьютер составлен из нескольких физических устройств, каждое из которых подключено к одному блоку, называемому системным. Если рассуждать логически, то ясно, что он играет роль некоторого координирующего устройства. Давайте заглянем внутрь системного блока (не нужно пытаться проникнуть внутрь монитора — там нет ничего интересного, к тому же это опасно): открываем корпус и видим какие-то платы, блоки, соединительные провода. Чтобы понять их функциональное назначение, посмотрим на структурную схему типичного компьютера (рис. 2). Она не претендует на безусловную точность и имеет целью лишь показать назначение, взаимосвязь и типовой состав элементов современного персонального компьютера.

 

 

Рис. 2. Структурная схема персонального компьютера

 

Обсудим схему на рис. 2 в несколько нетрадиционном стиле.

 Человеку свойственно, встречаясь с чем-то новым, искать какие-то ассоциации, которые могут помочь ему познать неизвестное. Какие ассоциации вызывает компьютер? У меня, к примеру, компьютер часто ассоциируется с самим человеком. Почему?

 

У компьютера есть органы восприятия информации из внешнего мира — это клавиатура, мышь, накопители на магнитных дисках. На рис. 2 эти органы расположены справа от системных шин.

 У компьютера есть органы “переваривающие” полученную информацию — это центральный процессор и оперативная память.

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

 

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

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

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

 

Продолжая аналогию с человеком, отметим: для того, чтобы компьютер правильно питался, придумано множество операционных систем, компиляторов сотен языков программирования и т. д. Но все они являются, по сути, лишь блюдом, на котором по определенным правилам доставляется пища (программы) желудку (компьютеру). Только (вот досада!) желудок компьютера любит диетическую, однообразную пищу — подавай ему информацию структурированную, в виде строго организованных последовательностей нулей и единиц, комбинации которых и составляют машинный язык.

 

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

 

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

 

----------------------------------------------------------------------------------------------------------------------------------

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

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

 

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

Главными особенностями языка Ассемблера являются:

зависимость от типа микропроцессора;

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

необходимость детального проектирования процесса работы ЭВМ;

возможность использования символьных имен для переменных и меток

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

Машинный код — система команд конкретной вычислительной машины, которая интерпретируется непосредственно микропроцессором или микропрограммами данной вычислительной машины.

 

Систе́ма кома́нд (также набо́р команд) — соглашение о предоставляемых архитектурой средствах программирования, а именно: определённых типах данных, инструкций, системы регистров, методов адресации, моделей памяти, способов обработки прерываний и исключений, методов ввода и вывода.

 

Компилировать — производить трансляцию машинной программы с проблемно-ориентированного языка на машинно-ориентированный язык и последующую компоновку программы в готовый к использованию программный модуль.

 

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

 

Компоновщик (также реда́ктор свя́зей, линкер) — программа, которая производит компоновку: принимает на вход один или несколько объектных модулей и собирает по ним исполнимый модуль.

 

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

 

2. Структура процессора. Основные определения, функции составных частей.

Основное устройство компьютеров – ЦП (CPU) выполняет двойную функцию: с одной стороны ЦП является обрабатывающим устройством, т.к. выполняет функции по обработке данных в соответствии с заданной программой; с другой стороны ЦП является управляющим устройством, в связи с тем, что на него возлагаются функции: во-первых, по управлению программой, во-вторых, по управлению остальными устройствами ЭВМ.

Основными устройствами (блоками) ЦП являются, во-первых, АЛУ (ALU), во-вторых, устройство управления (CU).

АЛУ реализует функцию ЦУ по обработке и предназначено для выполнения арифметических и логических операций над целыми числами, логическими значениями и символьными данными. В некоторых современных моделях компьютеров это устройство называется IU для того, чтобы подчеркнуть основной тип обрабатываемых данных.

Функцией устройства управления (УУ) является выработка сигналов управления, с помощью которых осуществляется выполнение элементарных операций в АЛУ или периферийных устройствах, которые называются микрооперациями.

УУ, во-первых, обеспечивает выполнение команд программы, реализуя выборку команд из памяти, их декодирование, формирование адресов операндов и их выборку из памяти, настройку АЛУ на выполнение заданной операции и запись результата операции в память. С другой стороны УУ реализует функции по управлению взаимодействия периферийных устройств ЭВМ с его ядром, обеспечивая реакцию на запросы ПУ по организации обмена между ними и памятью (ОП). Для обеспечения быстрой реакции на запросы ПУ в ЦП используется система, представляющая собой комплекс аппаратных и программных средств.

 

 

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

Арифметико-логическое устройство(или АЛУ, ALU) предназначено для обработки информации в соответствии с полученной процессором командой.

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

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

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

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

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

3. Режимы адресации. Схема формирования адреса.

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

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

В основном для задания режимов адресации используется специальный байт, который принято называть постбайтом адресации (он обязательно следует за байтом кода операции) или байтом mod, r/m (по наименованию основных полей, которые являются неизменными в этом байте).

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

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

 

mod reg r/m

                              7           6 5               3 2            1                                   

 

Байт с подобной структурой осуществляет адресацию двух операндов, один из которых, задаваемый полем reg, является регистровым. Из этого следует, что машинные команды, использующие постбайт адресации, реализуют операции следующих типов:

- reg – reg          (регистр – регистр);

- reg – mem      (регистр – память);

- mem – reg      (память – регистр);

и не реализуют операции типа mem- mem (память – память).

Операции типа "память – память" реализуются в командах обработки строк (цепочек). Например, команда MOVS (пересылка строки) осуществляет пересылку строки-источника в строку-приемник.

      Поле reg постбайта задает прямой регистровый адрес операнда, находящегося в РОН.

Поле r/m (register/memory) задает адрес второго операнда команды, находящегося либо в регистре, либо в памяти. Факт принадлежности поля r/m к адресации регистра или памяти определяется значением поля mod (режим). При mod = (11)2 поле r/m трактуется как адрес регистра, при mod ¹ (11)2 поле r/m участвует в адресации памяти. Фактическое значение двоичного кода поля r/m в этом случае неявным образом определяет базовую и (или) индексную компоненту ЕА. При адресации памяти значение поля mod задает длину смещения disp в байтах:

 

           mod              disp

           00                      -

           01                      1 байт

           10                      2 байт

 

Смещение интерпретируется как целое число со знаком, естественно, представляемое в дополнительном коде. В соответствии с этим при сложении байтного смещения с 16-разрядными компонентами в виде базы и (или) индекса на этапе формирования ЕА производится предварительное расширение смещения путем копирования знакового бита во все биты старшего байта. Таким образом, старший байт содержит все нули в случае положительного смещения и все единицы в случае отрицательного смещения.

 

При использовании двухадресной команды адрес одного из операндов используется и как адрес операнда, и как адрес результата. Этот операнд называется приемником (dst - destination).

Использование одного из операндов в качестве приемника определяется значением специального бита d (direction) кода операции. При d = 1 приемником является операнд, адресуемый с помощью поля reg, при d = 0 – операнд, адресуемый с помощью поля r/m.

Бит d является предпоследним слева (вторым справа) битом байта кода операции ОрС. В свою очередь, крайний правый бит кода операции w (word) определяет длину операндов. При w = 0 длина операндов – байт, при w = 1 – 2 байта (слово).

Интерпретация поля r/m для регистровых операндов и операндов, размещаемых в памяти, может быть представлена следующей таблицей:

код r/m

mod=11

mod¹11

w=0 w=1 Base Index
000 AL AX BX SI
001 CL CX BX DI
010 DL DX BP SI
011 BL BX BP DI
100 AH SP - SI
101 CH BP - DI
110 DH SI BP -
111 BH DI BX -

 

Как следует из таблицы, для базовой компоненты ЕА могут быть использованы только регистры ВХ и ВР, а для индексной компоненты - только регистры SI и DI. При использовании 32-разрядной адресации, начиная с процессора 80386, эти ограничения снимаются, т.е. в качестве базового и индексного регистра может использоваться любой РОН, за исключением SP.

Исключением из общего правила является комбинация:

 

mod = 00,         r/m = 110.

 

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

 

Рис.3.6

 

С помощью постбайта адресации реализуются следующие режимы адресации:

1) Регистровая прямая.

Реализуется всегда для операнда, адресуемого полем reg, а также для операнда, адресуемого полем r/m при mod = 11.

2) Прямая адресация памяти.

Реализуется как исключительный случай при mod = 00, r/m = 110.

3) Косвенная регистровая адресация.

Имеет место при mod = 00 и r/m = 100 (SI), r/m = 101 (косвенный адрес в DI),

 r/m = 111 (BX).

4) Базовая адресация.

(ЕА = BASE+disp): mod = 01 или mod = 10, r/m = 110 или 111.

5) Индексная адресация.

(EA = Index+disp):

mod = 01 или 10, r/m = 100 или 101

6) Базово-индексная адресация без смещения.

(ЕА = Base+Index):

mod = 00, r/m = 000, 001, 010, 011

7) Базово-индексная адресация со смещением.

(ЕА=Base+Index+disp):

mod = 01 или 10, r/m = 000, 001, 010, 011.

 

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

Косвенная адресация с использованием памяти реализуется в командах перехода JMP (jump) и в командах вызова CALL, но этот режим используется не для адресации операнда, а для задания адреса команды (перехода или вызова).

 

4. Регистры процессора. Основные группы, особенности и назначения регистров каждой группы.

РЕГИСТРОВАЯ СТРУКТУРА (ПРОГРАММНАЯ МОДЕЛЬ) ПРОЦЕССОРА

1. ОБЩЕЕ ПРЕДСТАВЛЕНИЕ

 

Регистровая структура процессора включает в себя 14 16-разрядных программнодоступных регистров и может быть представлена в следующем виде:

                                             15          8 7                0

АН (100) AL (000)
 CH (101) CL (001)
DH (110) DL (010)
BH (111) BL (011)

 

 

 

 

                                  000      AX

                                      001 CX

                                                      010       DX  HL

                                                  011  BX

            Адреса РОН 100 SP                 GPR (РОН)

                                                           101 BP     PI

                                                           110 SI

                                                           111 DI

                                                           15      0

                                                             15                                   0

 
 
 
 

                                                           00 ES

                                                           01 CS

                                                           10 SS    SR

                                                           11 DS

 

 

15     FR(FLAGS)  0

 

15            IP            0

                                                                  Instruction Pointer

 

 

Рис.1. Регистровая структура процессора

 

 

Программно-доступные регистры разделяются на:

- регистры общего назначения (GPR – General Purpose Registers), группа включает 8 регистров;

- сегментные регистры (SR – Segment Registers), группа включает 4 регистра;

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

- указатель команды (Instruction Pointer).

 

2. РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ

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

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

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

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

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

           Функциональная специализация РОНов отражается в их наименованиях:

АХ – Accumulator (регистр-аккумулятор) – по умолчанию используется для задания одного из операндов команды и для представления результата.

СХ – Counter (счетчик) – по умолчанию используется, во-первых, как счетчик числа повторения циклов в команде "организация цикла" (LOOP); во-вторых, для задания числа сдвигов в командах сдвигов (его младший байт – CL); в-третьих, для задания числа элементов обрабатываемых строк (цепочек) в командах обработки строк (MOVS, CMPS и т.д.).

DX –Data (регистр данных) – по умолчанию используется как расширение аккумулятора со стороны старших разрядов в командах умножения и деления.

ВХ –Base (базовый регистр) – по умолчанию используется как базовая компонента эффективного адреса операнда, находящегося в памяти. (В терминологии фирмы Intel под эффективным адресом – Effective Address (ЕА) – понимается адрес операнда, формируемый программой (программный адрес).) Для получения физического адреса ячейки памяти, в которой находится операнд, осуществляется преобразование ЕА на основе простейшей модели сегментированной памяти (механизма сегментации).

SP – Stack Pointer (указатель стека) – по умолчанию используется для адресации вершины стека. 

Вершина стека указывает на адрес последнего элемента, записанного в стек.

Стек представляет собой сегмент памяти. Стек растет в область младших адресов. Это означает, что при записи (включении в стек), например, по команде PUSH, сначала производится декремент SP (уменьшение) на 2, а затем запись в память по новому значению SP как адреса.

При чтении (извлечении) из стека, например, по команде POP, сначала производится чтение слова по адресу из SP, а затем инкремент (увеличение) содержимого SP на 2.

Работа со стеком реализуется на уровне слов, но не байт.

ВР – Base Pointer (указатель базы) – по умолчанию используется как базовая компонента эффективного адреса операнда в памяти по аналогии с ВХ.

Отличие в использовании содержимого регистров ВХ и ВР как базовых компонент ЕА состоит в том, что при использовании ВХ подразумевается обращение к сегменту данных, а при использовании ВР – к сегменту стека (но не через его вершину).

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

SI – Source Index (индекс источника) – по умолчанию используется для задания индексной компоненты ЕА, а также для адресации элементов строки-источника в командах обработки строк.

DI – Distination Index (индекс приемника) – по умолчанию используется аналогично SI для задания индексной компоненты ЕА, а также для адресации элементов строки-приемника в командах обработки строк.

 

Группу из 8 РОН принято делить на 2 части:

- группа HL (High – Low);

- группа PI (Pointer – Index).

 

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

Регистры группы HL могут использоваться в командах в 2-байтном (полном) и в байтном (неполном) варианте.

Отдельные байты этих регистров используют то же наименование, что и полный регистр (A, C, D, B) с добавлением приставки L – младший, Н – старший, для соответствующих байтов регистра.

 

Группа PI или группа указателей-индексов может использоваться только в 2-байтном варианте.

Для адресации РОН, как полных, так и не полных, в машинной команде используются 3 двоичных разряда.

Двоичные адреса полных РОН приведены на рис.2.1 слева, а их отдельных байт - в скобках.

 

3. СЕГМЕНТНЫЕ РЕГИСТРЫ

CS – Code Segment (сегмент кода – машинной программы),

SS – Stack Segment (сегмент стека),

DS – Data Segment (сегмент данных),

ES – Extra Segment (дополнительный сегмент).

 

Сегментные регистры используются для аппаратной поддержки простейшей модели сегментированной памяти, принятой в процессоре 8086. Их содержимое определяет базовые (начальные) адреса соответствующих сегментов в физической памяти. Использование 4 сегментных регистров предполагает, что в любой момент времени программа может работать (иметь доступ) с 4 сегментами памяти. С учетом того, что длина каждого сегмента составляет 216 байт = 64 Кбайт (16-разрядный адрес) физическое адресное пространство, доступное программе, составляет 256 Кбайт.

Шина адреса процессора Intel 8086 является 20-разрядной, что обеспечивает емкость адресного пространства 220 байт = 1 Мбайт. При формировании 20-разрядного физического адреса, содержимое соответствующего сегментного регистра смещается в сторону старших разрядов путем сдвига на 4 разряда влево. Таким образом, содержимое сегментных регистров представляет собой не сам физический начальный адрес сегмента, а его значение, уменьшенное на 16 (сегменты выровнены в памяти на границу параграфа).

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

 

4. РЕГИСТР ФЛАГОВ

ХХХХ OF DF IF TF SF ZF X AF X PF X CF

15   12 11    10       9         8         7      6        5       4       3       2           1     0         

 

           В регистре флагов актуальными являются только 9 битов, 6 из которых представляют собой арифметические флаги (флаги состояний) и 3 – флаги управления. Остальные 7 бит являются незадействованными (обозначаются Х).

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

К арифметическим флагам относятся:

CF – Carry Flag (флаг переноса). В нем фиксируется перенос из старшего разряда при сложении и заем в старший разряд при вычитании. При умножении значения флага CF определяет возможность (CF=0) или невозможность (CF=1) представления результата (произведения) в том же формате, что и сомножители.

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

PF – Parity Flag – флаг паритета (четности). Он устанавливается при наличии четного числа единиц в младшем байте результата, в противном случае – сбрасывается. Этот флаг используется как аппаратная поддержка контроля по четности (нечетности).

AF – Аuxiliary Carry Flag (флаг вспомогательного переноса). В этом флаге фиксируется межтетрадный перенос при сложении и межтетрадный заем при вычитании. Значение этого флага используется командами десятичной и ASCII-коррекции сложения и вычитания. Этот флаг можно рассматривать как аппаратную поддержку операций над десятичными числами.

ZF – Zero Flag (флаг нуля). Он устанавливается при нулевом результате операции, в противном случае (ненулевой результат) - сбрасывается.

SF – Sign Flag (флаг знака). В него копируется старший (крайний левый) бит результата, интерпретируемый как знак.

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

 

К флагам управления относятся:

TF – Trace (Trap) Flag (флаг трассировки (ловушки)). При установке флага TF процессор переводится в так называемый отладочный (покомандный, пошаговый) режим работы. В этом режиме завершение выполнения любой команды сопровождается выходом на прерывание специального типа (стандартный тип 1 – прерывание по отладке).

DF – Direction Flag (флаг направления). Его значение используется командами обработки строк (цепочек) и определяет направление обработки: от меньших адресов к большим (слева на право) при DF=0 или от больших адресов к меньшим (справа на лево) при DF=1.

IF – Interrupt Flag (флаг прерываний). С помощью этого флага разрешаются (IF=1) или запрещаются (IF=0) внешние прерывания, запросы которых поступают на специальный вход INTR (Interrupt Requester). Этот вход обычно связан с микросхемой PIC (Programmable Interrupt Controller) – программируемый контроллер прерываний.

 


Дата добавления: 2018-04-04; просмотров: 460; Мы поможем в написании вашей работы!

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






Мы поможем в написании ваших работ!