Мегаобучалка Главная | О нас | Обратная связь


ОСНОВЫ СИСТЕМНОГО ПРОГРАММИРОВАНИЯ



2015-11-27 1535 Обсуждений (0)
ОСНОВЫ СИСТЕМНОГО ПРОГРАММИРОВАНИЯ 0.00 из 5.00 0 оценок




А. В. Рощин

 

 

Часть 1

ВВЕДЕНИЕ В СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ

 

Рекомендовано Министерством общего и профессионального образования Российской Федерации в качестве учебного пособия

для студентов высших учебных заведений, обучающихся по специальности “Вычислительные машины, комплексы, системы и сети”

 

 

Москва 1999


 

АННОТАЦИЯ

 

Настоящее учебное пособие предназначено для подготовки студентов различных вычислительных специальностей, изучающих работу в среде MS-DOS. Для специальности 2201 эта работа может использоваться в курсах "Системное программное обеспечение", "Проектирование микропроцессорных систем", "Организация ввода-вывода".

В пособии описан микропроцессор 8088/86 с точки зрения программиста, рассмотрены регистры процессора, способы адресации и формирования исполнительного адреса. Даны основы программирования на ассемблере, Приведены примеры программ, использующих ресурсы MS-DOS.

 

 

Автор: проф., к.т.н. Рощин А.В.

 

Рецензент: проф., к.т.н. Зеленко Г.В.

 

Научный редактор: проф., д.т.н. Михайлов Б.М.

 

Работа рассмотрена и одобрена на заседании кафедры ИТ-4


ВВЕДЕНИЕ 4

ГЛАВА 1. ПРОГРАММИРОВАНИЕ

МИКРОПРОЦЕССОРА 8088 5

1.1. Микропроцессор с точки зрения

программиста 5

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

1.2.1. Генерация физического адреса 8

1.2.2. Прямая адресация 9

1.2.3. Косвенная регистровая адресация 10

1.2.4. Базовая адресация 10

1.2.5. Индексная адресация 10

1.2.6. Базово-индексная адресация 11

1.2.7. Адресация строк 11

1.2.8. Адресация портов ввода/вывода 12

1.3. Система команд 12

1.3.1. Команды пересылки данных 12

1.3.1.1. Пересылка данных 13

1.3.1.2. Ввод/вывод 14

1.3.1.3. Формирование указателей 14

1.3.1.4. Пересылка содержимого регистра флагов 15

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

1.3.2.1. Арифметические команды и флаги 17

1.3.2.2. Сложение 18

1.3.2.3. Вычитание 19

1.3.2.4. Умножение 21

1.3.2.5. Деление 22

1.3.3. Команды работы с битами 23

1.3.3.1. Логические команды 24

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

1.3.3.3. Команды циклического сдвига 26

1.3.4. Строковые команды 27

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

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

1.3.5.2. Команды условного перехода 33

1.3.5.3. Команды прерывания 33

1.3.6. Прочие команды 34

ГЛАВА 2. ПРИМЕРЫ ПРОГРАММ 36

2.1 Ввод-вывод символьной информации 36

2.2 Работа с файлами 48

2.3 Работа с графикой 50

2.4 Работа со звуком 53

2.4.1 Извлечение звука в IBM PC 53

2.4.2 Примеры генерации звука 54


ВВЕДЕНИЕ

 

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

Первая из них посвящена вопросам программирования на языке ассемблера для микропроцессора 8088. Дано краткое описание команд микропроцессора, а также основные приемы работы с компилятором TASM.

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


 

 

ГЛАВА 1.

ПРОГРАММИРОВАНИЕ МИКРОПРОЦЕССОРА 8088

 

1.1. МИКРОПРОЦЕССОР С ТОЧКИ ЗРЕНИЯ

ПРОГРАММИСТА

 

Микропроцессор 8088 является типичным представителем 16-разрядных микропроцессоров, хотя внешняя шина процессора является 8-разрядной. Следует отметить, что все сказанное ниже относится также к микропроцессору 8086, так как для программиста микропроцессоры 8088 и 8086 неразличимы. Все программы, написанные для микропроцессора 8088 могут выполняться на ЭВМ с микропроцессорами 80186, 80286 и т.д., так как система команд младших микропроцессоров этого семейства является подмножеством старших.

Для программиста микропроцессор представляется основным адресным пространством, адресным пространством внешних устройств и программно-доступными регистрами.

Микропроцессор 8088 характеризуется основным адресным пространством объемом 1 (MB) мегабайт, из которого первые 640 KB (килобайт) отведены под основную память (RAM), адресным пространством ввода/вывода объемом 65536 байтов. Программно-доступными в микропроцессоре 8088 являются четыре регистра общего назначения AX, BX, CX, DX, два индексных регистра SI и DI, два регистра-указателя SP и BP и четыре сегментных регистра CS, DS, SS, ES. Косвенно программно-доступными являются также регистр-указатель команд IP и регистр флагов. Все указанные регистры являются 16-разрядными. Регистры общего назначения могут использоваться также 8-разрядными "половинками", причем младший байт обозначается буквой L, а старший байт - буквой H (например, для регистра AX - регистры AL и AH). Схематическое обозначение регистров микропроцессора приведено на рис. 1.

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

 

Регистры общего назначения
AH AL
BH BL
CH CL
DH DL

 

  Регистры-индексы и указатели
SP Указатель стека
BP Указатель базы
SI Индексный регистр источника
DI Индексный регистр назначения

 

 

  Сегментные регистры
CS Регистр сегмента кода
DS Регистр сегмента данных
SS Регистр сегмента стека
ES Регистр дополнительного сегмента

 

    Указатель команд и флаги  
  IP Регистр сегмента кода  
       
  Флаги         O D I T S Z   A   P   C
               
                                                                         

 

 

Рис. 1. Регистры микропроцессора 8088

 

Сегментные регистры используются для организации сегментов памяти. Необходимость в сегментной организации памяти обусловлена несоответствием объема основного адресного пространства микропроцессора (1 MB = 1 048 576 байтов) и размером адресного пространства, адресуемого 16-разрядными регистрами (64 KB = 65 536 байтов). Четыре сегментных регистра позволяют одновременно работать с четырьмя сегментами объемом 64 KB каждый - сегментом кода, сегментом данных, сегментом стека и дополнительным сегментом соответственно.

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

Регистр флагов содержит девять флагов:

СF - флаг переноса,

PF - флаг четности (паритета),

AF - флаг дополнительного переноса

ZF - флаг нуля

SF - флаг знака

TF - флаг ловушки

IF - флаг разрешения прерывания

DF - флаг направления

OF - флаг переполнения

Флаг переноса - индицирует перенос единицы из старшего разряда или заема единицы этим разрядом при арифметических операциях над 8- и 16-разрядными числами. При наличии переноса или заема флаг переноса устанавливается в единичное состояние. Этот флаг делает возможной многобайтную и многословную арифметику. Команды циклического сдвига могут изменять значение флага переноса. Имеются команды непосредственной установки (STC) и сброса (CLC) флага переноса.

Флаг четности (паритета) - индицирует четное число единиц в 8-разрядном числе или в младшем байте 16-разрядного. Этот флаг полезен при тестировании памяти и при контроле правильности передачи данных.

Флаг дополнительного переноса - индицирует наличие переноса из младшей тетрады 8-разрядного числа в старшую или заема - из старшей тетрады в младшую. Флаг полезен при использовании десятичной арифметики.

Флаг нуля - получает единичное значение при образовании всех нулевых битов в байте или в слове.

Флаг знака - индицирует единичное значение старшего бита результата одно- или двухбайтовой операции. В стандартном дополнительном коде единица в старшем разряде результата означает получение отрицательного числа.

Флаг ловушки - используется для реализации пошагового режима работы. При установленном флаге Т микропроцессор вырабатывает сигнал внутреннего прерывания после выполнения каждой команды.

Флаг разрешения прерывания - используется для разрешения или запрещения внешнего маскируемого прерывания, поступающего по линии INTR. На немаскируемые внешние прерывания и на программные прерывания флаг не влияет. Имеются команды непосредственной установки (STI) и сброса (CLI) флага прерывания.

Флаг направления - используется обычно вместе со строковыми командами. При единичном значении флага изменение адресов в этих командах осуществляется от старших к младшим, при единичном значении - от младших к старшим. Команда STD устанавливает флаг направления в единичное значение, а команда CLD - в нулевое.

 

1.2. СПОСОБЫ АДРЕСАЦИИ

 

1.2.1. Генерация физического адреса

 

Адресная шина микропроцессора 8088 является 20-разрядной и позволяет адресовать 1 мегабайт (1 048 576 байтов). В этом микропроцессоре используется сегментная организация памяти, причем каждый сегмент не превышает 64 килобайт (65536 байтов). Каждый сегмент должен начинаться с границы параграфа (1 параграф = 16 байтам). Так как в микропроцессоре 8088 имеется четыре сегментных регистра, микропроцессор одновременно имеет доступ к четырем сегментам - сегменту кода, сегменту данных, сегменту стека и дополнительному сегменту.

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

Физический 20-разрядный адрес складывается из адреса сегмента и смещения:

                                     
  Адрес сегмента
+                                    
          Смещение
=                                    
  Физический адрес

Смещение или перемещаемый адрес операнда внутри сегмента образуется в микропроцессоре 8088 множеством различных способов, зависящих от способа адресации. Вычисленное значение этого смещения называется исполнительным адресом (The Effective Address - EA). Способ адресации определяется вторым байтом команды, состоящим из трех полей:

                             
  Mod Reg R/m                        

Двухразрядное поле Mod может принимать следующие значения:

00 - байтов смещения нет,

01 - следом идет один байт смещения со знаком,

10 - следом идут два байта смещения без знака,

11 - в команде используются регистровые операнды.

Трехразрядное поле Reg указывает регистр, содержащий операнд (8-битный при работе с байтами и 16-битный при работе со словами):

000 - AL или AX 100 - AH или SP

001 - CL или CX 101 - CH или BP

010 - DL или DX 110 - DH или SI

011 - BL или BX 111 - BH или DI

Трехразрядное поле R/m вместе с полем Mod определяет тип адресации:

Reg Mod=00 Mod=01 или 10 Mod=11
BX+SI BX+SI + смещение AL или AX
BX+DI BX+DI + смещение CL или CX
BP+SI BP+SI + смещение DL или DX
BP+DI BP+DI + смещение BL или BX
SI SI + смещение AH или SP
DI DI + смещение CH или BP
Прямая BP + смещение DH или SI
BX BX + смещение BH или DI

 

1.2.2. Прямая адресация

 

При использовании прямой адресации исполнительный адрес ЕА берется из поля смещения команды:

Код операции Mod Reg R/m 16-разрядное смещение
       
    Исполнительный адрес ЕА

При относительной адресации смещение определяется 8-битовым числом со знаком. В этом случае исполнительный адрес получается сложением этого смещения с содержимым указателя команд IP:

Код операции 8-разрядное смещение
     
Указатель команд   Исполнительный адрес
IP   ЕА
       

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

Код операции 16-разрядное смещение 16-разрядное смещение
     
  Исполнительный адрес ЕА

 


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

 

Исполнительный адрес берется в этом случае непосредственно из регистра BP, BX, SI или DI.

Код операции Mod Reg R/m    
           
      BP    
      BX   Исполнительный
    SI   адрес ЕА
    DI    

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

В командах безусловного перехода JMP и вызова процедуры CALL в качестве регистра косвенной адресации может быть использован любой 16-разрядный регистр общего назначения.

 

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

 

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

Код операции Mod Reg R/m Смещение  
                 
      BP          
                 
                 
                 
                 
      BX          
                 
      Исполнительный адрес ЕА
                   

 

 

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

 

При индексной адресации эффективный адрес вычисляется как сумма смещения и содержимого регистра SI или DI.


 

Код операции Mod Reg R/m Смещение  
                 
      SI          
                 
                 
                 
                 
      DI          
                 
      Исполнительный адрес ЕА
                   

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

 

1.2.6. Базово-индексная адресация

При базово-индексной адресации эффективный адрес вычисляется как сумма базового регистра (BP или BX), индексного регистра(SI или DI) и смещения. Таким способом можно обрабатывать двумерные массивы.

Код операции Mod Reg R/m Смещение  
                 
      BP          
                 
                 
                 
                 
      BX          
                 
      SI          
                 
                 
                 
                 
      DI          
                 
      Исполнительный адрес ЕА
                   

 

При использовании регистра ВХ эффективный адрес определяется в сегменте данных DS. При использовании регистра ВР эффективный адрес определяется в сегменте стека SS.

 

1.2.7. Адресация строк

 

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

Код операции   SI   DI
             
    Эффективный адрес источника   Эффективный адрес назначения
             

 

1.2.8. Адресация портов ввода/вывода

 

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

Для обращения к порту, расположенному в пространстве ввода/вывода могут использоваться два различных способа адресации. При прямой адресации порта номер порта указывается в непосредственном 8-битовом операнде. Таким образом может быть осуществлен доступ к портам с номерами от 0 до 255. Для косвенной адресации порта может быть использован регистр DX. Таким образом может быть осуществлен доступ к портам с номерами от 0 до 65535.

Код операции Данные  
       
Адрес порта  
       
Код операции      
         
DX   Адрес порта
           

 

 

1.3. СИСТЕМА КОМАНД

 

1.3.1. Команды пересылки данных

 

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


 

Пересылка данных
MOV Пересылка байта или слова
PUSH Помещение слова в стек
POP Извлечение слова из стека
XCHG Обмен байтами или словами
XLAT Выборка из таблицы
Ввод/вывод
IN Ввод байта или слова
OUT Вывод байта или слова
Формирование указателей
LEA Загрузка эффективного адреса
LDS Загрузка указателя с использованием DS
LES Загрузка указателя с использованием ES
Пересылка содержимого регистра флагов
LANF Загрузка регистра АН из регистра флагов
SANF Запись регистра АН в регистр флагов
PUSHF Помещение регистра флагов в стек
POPF Извлечение регистра флагов из стека

 

1.3.1.1. Пересылка данных

 

MOV (операнд назначения),(операнд-источник)

Команда MOV пересылает байт или слово из операнда-источника в операнд назначения.

PUSH (операнд-источник)

Команда PUSH уменьшает значение указателя SP стека на 2, а затем пересылает слово из операнда источника в стек.

POP (операнд назначения)

Команда POP берет слово с вершины стека и помещает его в операнд назначения, а затем увеличивает значение SP на 2.

XCHG (операнд назначения),(операнд-источник)

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

XLAT

Команда XLAT помещает в регистр AL байт из 256-байтовой таблицы, начальный адрес которой находится в регистре BX, а порядковый номер элемента таблицы - в регистре AL.


1.3.1.2. Ввод/вывод

 

IN (аккумулятор),(порт)

Команда IN передает байт или слово из порта ввода с указанным номером в регистр AL или AX. Номер порта может быть определен непосредственно в команде, в этом случае он может иметь номер от 0 до 255. Номер порта может находиться также в регистре DX, в этом случае порт может иметь номер от 0 до 65 535.

OUT (порт),(аккумулятор)

Команда OUT передает байт или слово из регистра AL или AX в порт вывода с указанным номером. Возможности прямого или косвенного указания номера порта такие же, как в команде IN.

 

1.3.1.3. Формирование указателей

 

Эти команды формируют адреса переменных. Они могут быть полезны при обработке списков, массивов и строк.

LEA (операнд назначения),(операнд-источник)

Команда LEA (load effective address - загрузка эффективного адреса) пересылает смещение операнда-источника в операнд назначения. В качестве операнда-источника должен использоваться элемент памяти, а в качестве операнда назначения - 16-разрядный регистр общего назначения. Эта команда не затрагивает флаги. Команда LEA может быть использована, например, для инициализации регистра BX перед использованием команды XLAT.

LDS (операнд назначения),(операнд-источник)

Команда LDS (load pointer using DS - загрузка указателя с использованием DS) пересылает 32-разрядный указатель переменной из операнда-источника, расположенного в памяти, в операнд назначения и регистр DS. Слово смещения указателя пересылается в операнд назначения, который должен быть 16-разрядным регистром общего назначения. Слово сегмента указателя пересылается в регистр DS. Использование этой команды с указанием в качестве операнда назначения регистра SI позволяет определить строку-источник для последующей строковой команды.

LES (операнд назначения),(операнд-источник)

Команда LES (load pointer using ES - загрузка указателя с использованием ES) пересылает 32-разрядный указатель переменной из операнда-источника, расположенного в памяти, в операнд назначения и регистр ES. Слово смещения указателя пересылается в операнд назначения, который должен быть 16-разрядным регистром общего назначения. Слово сегмента указателя пересылается в регистр ES. Использование этой команды с указанием в качестве операнда назначения регистра DI позволяет определить строку назначения для последующей строковой команды.

 

1.3.1.4. Пересылка содержимого регистра флагов

 

LAHF

Команда LAHF (загрузка регистра AH из регистра флагов) копирует флаги SF, ZF, AF, PF и CF в биты 7, 6, 4, 2 и 0 регистра АН. Содержимое битов 5, 3 и 1 неопределено.

SAHF

Команда SAHF (сохранение регистра АН в регистре флагов) пересылает биты 7, 6, 4, 2 и 0 регистра АН в SF, ZF, AF, PF и CF. Значение флагов OF, DF, IF и TF при этом остаются неизменными.

PUSHF

Команда PUSHF уменьшает значение указателя SP стека на 2, а затем пересылает все флаги в стек.

POPF

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

 

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

 

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

Беззнаковые 8-разрядные двоичные числа могут иметь значение от 0 до 255. Для представления беззнаковых чисел в диапазоне от 0 до 65 535 используются 16 разрядов. Над беззнаковыми двоичными числами могут выполняться операции сложения, вычитания, умножения и деления.


 

Сложение
ADD Суммирование байта или слова
ADC Суммирование байта или слова с разр. переноса
INC Увеличение байта или слова на 1
AAA Коррекция сложения неупак. десятичных чисел
DAA Коррекция сложения упак. десятичных чисел
Вычитание
SUB Вычитание байта или слова
SBB Вычитание байта или слова с разр. переноса
DEC Уменьшение байта или слова на 1
NEG Инверсия байта или слова
CMP Сравнение байта или слова
AAS Коррекция вычитания неупак. десятичных чисел
DAS Коррекция вычитания упак. десятичных чисел
Умножение
MUL Умножение беззнакового байта или слова
IMUL Целочисленное умножение байта или слова
AAM Коррекция умножения неупак. десятичных чисел
Деление
DIV Деление беззнакового байта или слова
IDIV Целочисленное деление байта или слова
AAD Коррекция деления неупак. десятичных чисел
CWB Преобразование байта в слово
CWD Преобразование слова в двойное слово

 

Знаковые двоичные числа (целые) также могут быть 8- и 16-разрядными. Самый старший (самый левый) бит знакового числа интерпретируется как знак этого числа: 0 - положительное число, 1 - отрицательное. Отрицательные числа представляются в стандартном двоичном дополнительном коде. Так как старший бит знакового числа используется для обозначения знака, диапазон представления 8-разрядных знаковых чисел от - 128 до + 127. 16-разрядное целое число представляется в диапазоне от - 32 768 до + 32 767. Нуль представляется положительным числом. Для знаковых чисел могут выполняться операции сложения, вычитания, умножения и деления.

Упакованные десятичные числа содержат в каждом байте две десятичных (0 - 9) цифры. В старшем полубайте содержится старшая значащая цифра, в младшем - младшая. Каждая десятичная цифра представляется в двоичном (или, что то же самое, в шестнадцатеричном) коде. Диапазон представления упакованных десятичных чисел в байте 0 - 99. Сложение и вычитание упакованных десятичных чисел осуществляется в два этапа.

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

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

Ниже приведена арифметическая интерпретация 8-разрядных двоичных чисел.

Шестнадца-теричный код Двоичный код Беззнаковое двоичное Знаковое двоичное Неупакован-ное десятичное Упакован-ное десятичное
+ 7
- 119 недействит.
С5 - 59 недействит. недействит.

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

 

1.3.2.1. Арифметические команды и флаги

 

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

CF (флаг переноса): Если в результате сложения осуществляется перенос из старшего бита, флаг переноса взводится; в противном случае флаг переноса сбрасывается. При вычитании флаг переноса взводится, если осуществляется заем в старший бит результата; при отсутствии заема флаг сбрасывается. Следует иметь в виду, что при возникновении знакового переноса CF = OF (флаг переполнения). Флаг переноса CF может использоваться для индикации беззнакового переполнения. Команды ADC (сложение с учетом разряда переноса) и SBB (вычитание с учетом разряда переноса) учитывают значение флага переноса, что позволяет реализовывать многобайтовые (например, 32- и 64-битовые) операции.

AF (флаг дополнительного переноса): Если в результате ложения осуществляется перенос из младшего полубайта в старший, флаг дополнительного переноса взводится; в противном случае флаг сбрасывается. При вычитании флаг дополнительного переноса взводится, если осуществляется заем из старшего полубайта в младший; при отсутствии заема флаг сбрасывается. Флаг дополнительного переноса используется при десятичной коррекции операций.

SF (флаг знака): После арифметических и логических операций флаг знака принимает значение старшего (7 или 15) бита результата. Для знаковых двоичных чисел флаг знака принимает значение 0 при положительном результате и 1 при отрицательном (если только не возникло переполнение). Команда условного перехода, выполняемая после операции со знаковыми числами, может использоваться для ветвления программы в зависимости от знака результата.

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

PF (флаг четности): Если младшие 8 бит результата арифметической или логической операции содержат четное число единичных битов, флаг четности взводится; в противном случае флаг четности сбрасывается. Флаг четности может использоваться для проверки правильности принятого кода при передаче данных по линиям связи.

OF (флаг переполнения): Если в результате операции получается очень большое положительное число или очень маленькое отрицательное, которое не помещается в операнд назначения, флаг переполнения взводится; в противном случае флаг переполнения сбрасывается. Флаг переполнения индицирует знаковое арифметическое переполнение. Состояние этого флага может быть проверено командой условного перехода или командой INTO (прерывание по переполнению). Флаг переполнение может игнорироваться при выполнении операций с беззнаковыми числами.

 

1.3.2.2. Сложение

 

ADD (операнд назначения),(операнд-источник)

Сумма двух операндов, которые могут быть байтами или словами, помещается в операнд назначения. Оба операнда могут быть знаковыми или беззнаковыми числами. Команда ADD изменяет значение флагов AF, CF, OF, PF, SF и ZF.

ADC (операнд назначения),(операнд-источник)

Команда ADC (суммирование с учетом разряда переноса) суммирует операнды, которые могут быть байтами или словами, и добавляет 1, если установлен разряд переноса; результат помещается в операнд назначения. Оба операнда могут быть знаковыми или беззнаковыми числами. Команда ADD изменяет значение флагов AF, CF, OF, PF, SF и ZF. Так как команда ADC учитывает значение разряда переноса от предыдущей операции, это может быть использовано для организации суммир



2015-11-27 1535 Обсуждений (0)
ОСНОВЫ СИСТЕМНОГО ПРОГРАММИРОВАНИЯ 0.00 из 5.00 0 оценок









Обсуждение в статье: ОСНОВЫ СИСТЕМНОГО ПРОГРАММИРОВАНИЯ

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

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



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (1535)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.012 сек.)