Справочник от Автор24
Поделись лекцией за скидку на Автор24

Аппаратное обеспечение современного компьютера. Архитектура современного компьютера

  • 👀 602 просмотра
  • 📌 552 загрузки
Выбери формат для чтения
Загружаем конспект в формате docx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Аппаратное обеспечение современного компьютера. Архитектура современного компьютера» docx
Тема 1. Аппаратное обеспечение современного компьютера Рабочая программа курса В результате изучения курса студент должен знать о конструкции компьютера и взаимосвязях отдельных узлов и блока компьютера, необходимые сведения об операционных системах, основные понятия языка ассемблера; • уметь разрабатывать алгоритмы решения несложных задач с использованием базовых конструкций языка ассемблера; • иметь навыки работы в среде MS DOS, с компилятором TASM и отладчиком Turbo Debugger. 1.1 Архитектура современного компьютера Для прикладного программиста необязательны глубокие знания архитектуры компьютера, однако знание базовых принципов работы компьютера и взаимодействия основных составляющих необходимо, поскольку даже простейшая программа требует организации ввода-вывода информации, т.е. обращения к клавиатуре и монитору (устройствам ввода-вывода). В составе большинства персональных компьютеров (ПК) можно выделить: системный блок, монитор, клавиатуру, мышь (указательное устройство) и периферийные устройства. Системный блок включает все основные составляющие ПК. Важнейшим компонентом является материнская или системная платаю. Расположенные на ней электронные модули (чипсеты), центральный процессор (ЦП), оперативная память (ОЗУ) составляют электронную базу компьютера. В системном блоке также размещаются источник питания и устройства внешней памяти. К системному блоку подсоединены все внешние устройства: · монитор для отображения текстовой и графической информации; · клавиатура для ввода в компьютер команд и данных; · мышь, которая позволяет указывать на элементы экрана с помощью указателя; · принтер для вывода текстовой и графической информации в виде твердой копии; · модем для подключения к телефонной линии; · сканер, обеспечивающий ввод в ПК текстовой и графической информации; ·  звуковая система для воспроизведения звуковой информации. Вместе все эти устройства составляют единую систему и взаимодействуют между собой.   Шина Рисунок 1 Структурная схема компьютера Архитектура ПК – это структурная схема внутренней организации и взаимодействия основных функциональных модулей компьютера (ЦП, чипсеты, устройства системы памяти ПК, контроллеры периферийных устройств и сами периферийные устройства). В понятие архитектуры компьютера также входят принципы организации вычислительного процесса и переработки информации, включая внутреннее программное обеспечение, позволяющее обрабатывать машинные команды. Детальный анализ архитектуры компьютера содержит описание представления программ и данных – систему счисления, информационные форматы и организацию вычислительного и обменного процессов, а также структуры памяти, методики выполнения машинных операций, системы размещения информации в памяти, системы диагностирования и контроля. Рассмотрим основные составляющие, изображенные на рис. 1. Центральный процессор – это электронный модуль, который выполняет в компьютерной системе основную вычислительную работу и управляет взаимодействием между всеми блоками и системами компьютера. ЦП находится в функциональном центре компьютерной системы, окруженном аппаратными блоками и подсистемами. Современные процессоры выполняют сотни миллионов операций в секунду, позволяя решать очень сложные задачи за короткие промежутки времени. В компьютере может быть несколько процессоров. Но в любом ПК есть процессор, который управляет всей компьютерной системой – это центральный процессор. Чипсет – это комплект микросхем, предназначенный для поддержки в компьютерной системе функциональных возможностей процессора, оперативной памяти, кэш-памяти и т.д. Микросхемы чипсета генерируют большинство сигналов для системных  и периферийных компонентов, преобразуют сигналы между шинами, позволяют ЦП и ОП работать с высокой производительностью. в состав нескольких микросхем, из которых состоят чипсеты, входят узлы, называемые обрамлением ЦП. Это – таймеры, контроллеры прерываний и контроллер прямого доступа к памяти, контроллеры параллельного и последовательного портов и прочие устройства, поддерживающие системные процессы в ПК. Контроллеры предназначены для управления доступом из системы к какому-либо из устройств, а также для выполнения соответствующих операций информационного обмена. Все внешние устройства имеют контроллер. После получения от ЦП соответствующих команд контроллер выполняет операции по обслуживанию внешнего устройства. Электронные компоненты компьютера постоянно обмениваются  информацией друг с другом и взаимосвязаны посредством шин (физических линий и микросхем), осуществляющих передачу электронных сигналов определенного функционального назначения между различными компонентами ПК. Все шины информационно-вычислительной системы объединены в системную магистраль. По шинам передаются сигналы трех видов: адресные, управляющие и данные. Соответственно различают шины трех типов: ·    шины данных – предназначены для передачи данных между электронными модулями ПК; ·    шины адреса – обеспечивают пересылку кодов адресной информации к ОЗУ или к электронным модулям ПК; ·    шины управления – предназначены для передачи сигналов управления. Шины характеризуются разрядностью, т.е. количеством линий, составляющих шину или количеством битов информации, одновременно передаваемых по линиям шины. Шины бывают последовательными и параллельными. Последовательная шина состоит из одной линии данных (данные передаются последовательно) и нескольких линий управления и адреса. Параллельная шина состоит из нескольких линий данных, адреса и управления. Количество информации, которое может быть передано по каналу за единицу времени (секунду), называется пропускной способностью шины. Наивысшую пропускную способность имеют шины ЦП и ОЗУ. Оперативная память (ОЗУ) – это основная память компьютера, предназначенная для хранения текущих данных и выполняемых программ, а также копий отдельных модулей операционной системы. Большинство программ в процессе выполнения резервируют часть оперативной памяти для хранения своих данных. К данным, хранящимся в ОЗУ, ЦП может обращаться непосредственно, используя специальную шину. После отключения компьютера все содержимое ОЗУ стирается. Для пересылки данных между устройствами существует несколько стандартных процедур. Одним из возможных способов, позволяющих ЦП обработать запрос устройства на обмен данными с другим устройством или с памятью, является процедура прерывания. Выполнение этой процедуры начинается с генерации каким-либо устройством сигнала запроса на прерывание. Запрос может поступить также в случае аварийной ситуации в системе. Каждое из устройств, работающих по прерываниям, имеет собственную линию запроса на прерывание. Другой способ обмена данными между устройством ввода-вывода и ОЗУ – прямой доступ к памяти, т.е. метод передачи данных от дисковых и иных периферийных устройств непосредственно в оперативную память без участия ЦП. 1.2  Процессор. Адресуемые регистры ЦП – это основной электронный модуль на материнской плате, который выполняет вычислительную работу, управляет обменом данными с оперативной памятью и устройствами ввода-вывода. ЦП работает циклически и упрощенно его работу можно описать следующим образом. В начале очередного цикла процессор считывает из ОП команду, расшифровывает и выполняет ее. Полученный результат записывается в заданную ячейку памяти. После этого инициируется новый цикл работы ЦП. Основными характеристиками ЦП являются: скорость выполнения команд и разрядность шин данных и адреса, разрядность внутренних регистров. Разрядность шины данных (или адреса) определяет максимальное целое число ( или адрес), с которым может работать процессор. Для ускорения доступа к ОП и повышения производительности ПК в ЦП встроен модуль кэш-памяти. Это промежуточная память между ЦП и ОП. Кэш – малоёмкое, но более быстрое, чем оперативная память, хранилище данных. Работу кэша можно описать следующим образом. Все свои запросы ЦП адресует одновременно ОП и кэш. Если адреса обращения и в ОП, и в кэш одинаковы, то данные или команды считываются из более быстрой памяти, что повышается общую производительность ПК. В противном случае ЦП обращается к ОП и скорость обмена данными замедляется. Однако самыми быстродействующими участками памяти являются регистры, которые расположены непосредственно на ядре процессора. На рис. 2 представлена упрощенная схема  процессора.   Рисунок 2 Упрощенная схема  процессора Регистры – это участки высокоскоростной памяти для хранения данных в процессоре. Они непосредственно подключены к блоку управления и арифметико-логическому устройству, поэтому доступ к регистрам происходит значительно быстрее, чем доступ к внешней памяти. Команды, использующие только обращение к регистрам, выполняются очень быстро, в отличие от команд, требующих получения операндов из внешней памяти, что необходимо учитывать при программировании, если программа должна работать максимально быстро. Схематично регистры можно изобразить следующим образом.   Регистры данных   АХ AH AL Аккумулятор ВХ BH BL Базовый регистр CX CH CL Счетчик DX DH DL Регистр данных   Регистры указателей и индексов     SP Указатель стека   BP Указатель базы   SI Индекс источника   DI Индекс приемника   Регистры сегментов     CS Регистр сегмента команд   DS Регистр сегмента данных   SS Регистр сегмента стека   ES Регистр дополнительного сегмента   Регистры управления и состояния     IP Указатель команд     Регистр флагов Рисунок 3 Основные регистры 16-разрядных процессоров Регистры данных используются при арифметических операциях  и при перемещениях данных. Каждый регистр содержит 16-разрядное значение, однако существует возможность обратиться к каждому байта регистра отдельно. В командах можно адресоваться как к 16-разрядным данным с использованием регистров AX, BX, CX, DX, так и к 8- разрядным данных с использованием регистров AН, BН, CН, DН, AL, BL, CL, DL. Когда 16-разрядное значение изменяется, изменяются соответствующие ему 8-разрядные значения и наоборот. Каждый регистр данных имеет свое неявное назначение, которое используется в командах: · АХ (аккумулятор) – Используется при арифметических операциях. · ВХ (базовый регистр) – Содержит адреса процедур или переменных, также может использоваться при выполнении арифметических операций и при перемещении данных. · CX (счетчик) – Выполняет функции счетчика для операций повторения и циклических команд. При выполнении этих команд увеличение значения происходит автоматически. · DX (регистр данных) – Выполняет особые функции при операциях умножения и деления. Процессор поддерживает сегментную организацию памяти. Необходимость в сегментной организации памяти обусловлена несоответствием объема основного адресного пространства микропроцессора (1 MB = 1 048 576 байтов) и размером адресного пространства, адресуемого 16-разрядными регистрами (64 KB = 65 536 байтов). Сегментные регистры используются для организации сегментов памяти. Четыре сегментных регистра позволяют одновременно работать с четырьмя сегментами объемом 64 KB каждый - сегментом кода, сегментом данных, сегментом стека и дополнительным сегментом соответственно. При всех обращениях к памяти для расчета адреса используются регистры сегментов. ·  CS (сегмент кода) – Содержит сегментную часть адреса расположения кодов программы ·  DS (сегмент данных) – Содержит сегментную часть адреса расположения переменных. ·  SS (сегмент стека) – Содержит сегментную часть адреса стека. ·  ES (дополнительный сегмент) – Используется в специальных случаях, а также в случаях, когда невозможно или неудобно использование других сегментов. Регистры индексов содержат величину смещения, которая используется при расчете адресов данных и команд. Смещение показывает расстояние переменной, метки или команды от начала базового сегмента. Использование регистров индексов повышается скорость работы со строками, массивами и другими структурами со множеством элементов. · SP (указатель стека) – Содержит смещение вершины стека · BP (указатель базы) – Содержит смещение от начала сегмента SS для указателя стека. · SI (индекс источника) – Используется при исполнении команд перемещения. Содержит смещение начала данных, которые должны быть перемешены. · DI (индекс приемника) – Указывается смещение адреса, куда перемещаются данные В регистре-указателе команд IP всегда находится смещение следующей команды, которая должна быть выполнена. Регистры IP и CS используются для расчета полного адреса команды. Регистр флагов – это специальный регистр, в котором позиция каждого бита отображает состояние процессора или результаты арифметических операций, причем все задействованные биты имеют соответствующие имена. На рис. 4 показаны все используемые флаги 16-разрядных процессоров. Флаги         OF DF IF TF SF ZF   AF   PF   CF   15       11 10 9 8 7 6   4   2   Рисунок 4 Флаги 16-разрядных процессоров Регистр флагов содержит девять флагов: · СF – флаг переноса, · PF – флаг четности (паритета), · AF – флаг дополнительного переноса, · ZF – флаг нуля, · SF – флаг знака, · TF – флаг ловушки, · IF – флаг разрешения прерывания, · DF – флаг направления, · OF – флаг переполнения. Каждый флаг имеет свое собственное назначение : · Флаг переноса СF индицирует перенос единицы из старшего разряда или заема единицы этим разрядом при арифметических операциях над 8- и 16-разрядными числами. При наличии переноса или заема флаг переноса устанавливается в единичное состояние. Этот флаг делает возможной многобайтную и многословную арифметику. Команды циклического сдвига могут изменять значение флага переноса. Имеются команды непосредственной установки (STC) и сброса (CLC) флага переноса. · Флаг четности (паритета) PF индицирует четное число единиц в 8-разрядном числе или в младшем байте 16-разрядного. Этот флаг полезен при тестировании памяти и при контроле правильности передачи данных. · Флаг дополнительного переноса AF индицирует наличие переноса из младшей тетрады 8-разрядного числа в старшую или заема из старшей тетрады в младшую. Флаг полезен при использовании десятичной арифметики. · Флаг нуля ZF получает единичное значение при образовании всех нулевых битов в байте или в слове. · Флаг знака SF индицирует единичное значение старшего бита результата одно- или двухбайтовой операции. В стандартном дополнительном коде единица в старшем разряде результата означает получение отрицательного числа. · Флаг ловушки TF используется для реализации пошагового режима работы. При установленном флаге Т микропроцессор вырабатывает сигнал внутреннего прерывания после выполнения каждой команды. · Флаг разрешения IF прерывания используется для разрешения или запрещения внешнего маскируемого прерывания, поступающего по линии INTR. На немаскируемые внешние прерывания и на программные прерывания флаг не влияет. Имеются команды непосредственной установки (STI) и сброса (CLI) флага прерывания. · Флаг направления DF используется обычно вместе со строковыми командами. При единичном значении флага изменение адресов в этих командах осуществляется от старших к младшим, при единичном значении – от младших к старшим. Команда STD устанавливает флаг направления в единичное значение, а команда CLD – в нулевое. 1.3  Контрольные вопросы 1.  Назовите основные составляющие компьютерной системы. 2.  Какова роль процессора в компьютере? 3.  Назовите четыре регистра общего назначения в процессоре. 4.  Как обозначается старшая половина регистра AH? Сколько битов она может хранить? 5.  Назовите четыре регистра сегментов. 6.  Почему с изменением регистра AH одновременно изменяется содержимое регистра AX? 7.  Назовите два регистра индексов. 8.  Какие флаги содержатся в регистре флагов? Тема 2. Необходимые сведения об операционных системах 2.1  Состав и назначение ОС Операционная система (ОС) – это комплекс программ, входящих в состав программного обеспечения компьютера, обеспечивающих управление работой аппаратных средств компьютера, обменом данных между различными аппаратными узлами ПК, а также организующих диалог компьютера и человека. При параллельной работе процессора, памяти и внешних устройств ОС обеспечивает разделение ресурсов, что предотвращает возникновение конфликтов между компонентами компьютерной системы. ОС – неотъемлемая часть любого компьютера. Ни один из компонентов программного обеспечения, за исключением самой ОС, не имеет доступа к аппаратуре компьютера. Наиболее важными частями ОС являются файловая система (ФС), драйверы внешних устройств, загрузчик, системная библиотека, сервисные программы (или утилиты), справочная система. Кроме того, в состав ОС могут входить такие программы, как текстовые редакторы, редакторы связей, системные мониторы, трансляторы и т.д. Файловая система представляет собой способ организации хранения файлов в дисковой памяти. Тип ФС и организация хранения данных на носителях внешней памяти определяют удобство работы пользователя, скорость доступа к файлам, организацию многозадачной работы, возможность создания хороших баз данных. Файлы – это программы, тексты, данные, любая информация, хранящаяся в памяти, которая имеет уникальное имя. Имя каждого файла и основные сведения о нем хранятся в каталоге (директории), который упрощает поиски доступ к информации. Каталоги – это специальное место на диске, организованное для хранения имен файлов и сведений о них. Исходный каталог, в состав которого входят все остальные каталоги называется корневым каталогом. ФС поддерживает операции чтения, переименования, удаления файлов. Задачи ОС заключаются в том, чтобы: ·  облегчить проектирование, программирование, отладку и сопровождение программ, обеспечить их взаимодействие с аппаратурой; ·  распределить ресурсы ЭВМ таким образом, чтобы обеспечить эффективную работу всех ее компонентов (центрального процессора, устройств ввода/вывода и т.п.); ·  предоставить пользователям возможности общего управления машиной. В рамках первой задачи ОС обеспечивает взаимодействие программ с внешними устройствами и друг с другом, распределение оперативной памяти, выявление различных событий, возникающих в процессе работы, и соответствующую реакцию на них (например, при ошибочных ситуациях). Общее управление машиной осуществляется на основе командного языка (языка директив), с помощью которого человек может осуществлять различные операции, например, такие, как разметка дисков, копирование файлов, запуск программ, установка режимов работы дисплея, принтера и т.п. Главное назначение ОС – управление ресурсами компьютера. Операционная система управляет следующими основными ресурсами: процессорами, памятью, устройствами ввода/вывода, данными. При этом операционная система реализует следующие функции: -    определяет интерфейс пользователя; -    обеспечивает разделение аппаратных средств между пользователями; -    планирует доступ пользователей к общим ресурсам; -    обеспечивает эффективное выполнение операций ввода-вывода; -    осуществляет восстановление информации и вычислительного процесса в случае ошибок; -    обеспечивает сохранность данных и защиту одной программы от другой; Операционная система взаимодействует с: операторами ЭВМ, прикладными программистами, системными программистами, административным персоналом, программами, аппаратными средствами, пользователями. Операторы ЭВМ – это специально подготовленные люди, которые контролируют работу ОС и в случае необходимости (поступление запроса) вмешиваются в работу компьютера для устранения каких-либо препятствий. Системные программисты занимаются сопровождением ОС, осуществляют ее настройку применительно к требованиям конкретной машины и при необходимости доработку для обслуживания новых типов устройств. Администраторы систем устанавливают порядок работы на ЭВМ и взаимодействуют с ОС, чтобы обеспечить соблюдение принятого порядка. Программы обращаются к ОС при помощи специальных команд  (вызов монитора, супервизора и т.п.), не нарушающих ее целостности и работоспособности. Пользователи – это абоненты вычислительной сети. Операционной системе, как правило, присваивается статус самого полномочного пользователя. Она имеет возможность доступа ко всем видам аппаратных ресурсов, всем программам пользователя, данным и т.п. Пользователь взаимодействует ПК через внешний интерфейс, организуемый ОС. Он вводит задания (команды) и получает результаты их выполнения. Существует два типа диалоговых интерфейсов – текстовый  (MS DOS) и графический (Windows). В графических интерфейсах информация и команды представляются в виде пиктограмм (значков), и пользователь выполняет те или иные действия, указывая на эти пиктограмм и совершая с ними определенные действия. 2.2  Характеристики современных ОС Современные операционные системы имеют следующие особенности: -    дружественный интерфейс, ориентированный на неподготовленного пользователя и при помощи меню предоставляющий пользователю ряд альтернатив, выраженных на естественном языке; -    использование концепции виртуальных машин, благодаря которой пользователь избавлен от необходимости знать физические особенности машин и систем; он имеет дело с функциональным эквивалентом компьютера, создаваемым для него операционной системой и называемым виртуальной машиной; -    распределенная обработка данных: гораздо целесообразнее иметь вычислительные мощности там, где они необходимы, вместо того, чтобы передавать данные для обработки в вычислительные центры. Различные ОС обладают теми или иными возможностями по обслуживанию компонентов компьютера и организации диалога с пользователем. К числу основных характеристик ОС относят: разрядность поддержка многопроцессорности, многозадачность, поддержка многопользовательского режима. Разрядность ОС определяет, какую разрядность внутренней шины данных ЦП может поддерживать ОС. Все современные ОС поддерживают 32-разрядный интерфейс прикладных программ. ОС может поддерживать два режима работы ЦП: реальный и защищенный. В реальном режиме, характерном для системы MS-DOS, все программы и данные располагаются в одной области ОП. Таким образом пользователь может войти в любую системную программу и испортить ее. 32-разрядные ОС поддерживаютзащищенный режим работы ЦП, который позволяет хранить программы и данные раздельно, в соответствии с их важностью в системе. Многопроцессорность – это способность ОС, ЦП и системных контроллеров компьютера поддерживать одновременную работу нескольких процессоров над выполнением одной и той же задачи. ОС могут быть ориентированы на одновременное обслуживание нескольких процессов (задач). Такое свойство ОС называется многозадачностью. Многозадачность могут поддерживать все современные процессоры и чипсеты ПК. ЦП в определенные кванты времени выполняет работу над отдельными фрагментами задач. У пользователя складывается впечатление одновременности их выполнения. ОС обеспечивает переключение ЦП и других устройств с выполнения одной задачи на другую, распределяет между задачами системные ресурсы и синхронизирует задачи между собой. Переносимость ОС – это возможность ОС работать на компьютерах, базирующихся на ЦП с различной архитектурой. 2.3  ОС MS DOS Операционная система MS-DOS за годы своего существования прошла путь от простого загрузчика до универсальной системы для персональных компьютеров, построенных на базе микропроцессоров Intel 8086/8088. Операционная система MS-DOS была разработана компанией Microsoft в 1981 г. и впервые использована фирмой IBM для персональных компьютеров – тогда она была названа PC DOS 1.0. В последующие годы MS-DOS многократно перерабатывалась и приобретала новые важные функции (версии 2.0 в 1983 г., 3.0 в 1984 г., 3.2 в 1986 г., 3.3 в 1987 г., 4.0 в 1988 г., 5.0, …, 6.22). Например, в версии 4.0 появилась графическая оболочка пользователя DOS-Shell, в версии 5.0 – целый ряд сервисных программ (редактор командной строки DOSKEY, страничный редактор EDIT, и т.д.). MS-DOS является однозадачной однопользовательской системой. Она требует относительно небольшого объема памяти, легко адаптируется к разнообразным аппаратным конфигурациям и поэтому достаточно популярна среди пользователей. Кроме того, ее можно считать основой для изучения операционных систем и их возможностей – знакомство с общей структурой системы MS-DOS очень полезно для понимания поведения вычислительной системы в целом. Многие ОС, созданные позднее, имеют пользовательский интерфейс, совместимый с MS-DOS. Например, это система MS OS/2, в которой реализованы многозадачный и защищенный режим, система виртуальной памяти. Система MS-DOS разбита на несколько уровней, которые служат для разделения логики ядра ОС и восприятия системы пользователем от технических средств, реализующих ее работу. К этим уровням относятся: · BIOS  (базовая система ввода-вывода), · Ядро системы DOS, · Командный процессор (оболочка). Модуль BIOS индивидуален для каждой вычислительной системы и поставляется ее изготовителем. В этом модуле по умолчанию резидентно содержатся аппаратно-зависимые драйверы следующих устройств: · Консольный дисплей с клавиатурой (CON); · Устройство построчной печати (PRN); · Последовательный канал связи (AUX); · Часы/календарь (CLOCK$); · Дисковое устройство начальной загрузки. Ядро системы MS-DOS взаимодействует с драйверами этих устройств с помощью пакетов запросов ввода-вывода. Затем драйверы переводят эти запросы в сами команды для различных аппаратных контроллеров. Ядро DOS реализует MS-DOS, как она видится прикладным программам.  Ядро  – это специальная программа, которая включает набор аппаратно-независимых сервисных программ, называемых системными функциями. К ним можно отнести следующие функции: · управление файлами и записями; · управление памятью; · символьно-ориентированное устройство ввода-вывода; · порождение других задач; · доступ к часам реального времени. Программы могут обращаться к системным функциям путем загрузки регистров параметрами функций и последующей передачи управления операционной системе посредством программного прерывания. Командный процессор (или оболочка) – это интерфейс пользователя с операционной системой. Он отвечает за анализ синтаксиса и выполнение команд пользователя, в том числе и за загрузку и выполнение других программ, находящихся на диске. 2.4  Команды MS DOS Для удобства редактирования вводимых команд существует специальная программа – редактор командной строки DOSKEY. После запуска она становится резидентной. Программа DOSKEY хранит в кольцевом стеке несколько ранее введенных пользователем команд и может выводить их в командную строку DOS. Для управления стеком команд используются клавиши: (¯) – вызов предыдущей (следующей) команды; ALT+F7 – очистка стека команд; F7 – вывод на экран списка запомненных команд и их номеров; F9 – вывод из стека в командную строку команды с данным номером. При редактировании вводимых и вызванных команд становятся доступными стандартные клавиши перемещения курсора, удаления символов, режима вставки/замены. Для выдачи справочного материала по командам MS-DOS ввести: команда/? В описании команд в скобки [] заключены те элементы команды, которые можно не указывать. Стандартными внешними устройствами являются: CON – клавиатура и дисплей; PRN – принтер, NUL – пустое устройство. Символом  d:  обозначен любой дисковый носитель. В командах можно использовать маски имен файлов или папок, т.е. символы ? или * (? заменяет один произвольный символ, * заменяет произвольное количество символов). I Команды работы с каталогами 1)    DIR – просмотр содержимого каталога: DIR [d:][путь\][имя_файла][/P][/W][/S][/B][/L]. Параметры: /P – постраничный вывод на экран; /W – вывод записей в усеченном формате (только имена файлов) в 5 колонок; /S – вывод имен файлов в каталоге и подкаталогах; /B – вывод только имен файлов в столбик; /L – вывод информации маленькими буквами. Примеры: DIR /P – постраничный вывод на экран содержимого текущего каталога; DIR *.txt –вывод на экран имен файлов с расширением txt из текущего каталога. 2)    MD (MKDIR) – создание подкаталога в текущем или пассивном каталоге: MD [d:][путь\]имя_подкаталога. Пример: MD H:\WORK\TEST – создание в пассивном каталоге H:\WORK подкаталога TEST. 3)    RD (RMDIR) – уничтожение каталога (пустого): RD [d:][путь\]имя_подкаталога. Пример: RD  TEST – уничтожение подкаталога TEST в текущем каталоге. 4)    CD – переход в другой каталог: CD [d:][путь\][имя_подкаталога]. Примеры: CD .. – переход в родительский каталог; CD \ – переход в корневой каталог; CD (\)TEST – переход в подкаталог TEST текущего (корневого) каталога. 5)    TREE – отображение структуры каталогов диска в виде дерева: TREE [d:[\путь]][/F]. Параметр: /F – в дереве отображаются также и файлы. Пример: TREE  H: – нарисовать дерево каталогов диска H:. II Команды работы с файлами 1)    TYPE – просмотр содержимого текстового файла на экране: TYPE [d:][путь\]имя_файла (в имени файла нельзя использовать маску, т.е. символы * и ?). Пример: TYPE H:\TXT\a.txt – просмотр содержимого файла  a.txt  из каталога H:\TXT. Замечание: Для приостановки просмотра необходимо нажать комбинацию клавиш CTRL+S (для продолжения просмотра нажать любую клавишу). 2)    DEL – удаление одного или группы файлов: DEL [d:][путь\]имя_файла (или шаблон) [/P]. Параметр: /P – выдача запроса на подтверждение удаления. Пример: DEL H:\*.* /P – уничтожить все файлы на диске H: в корневом каталоге с выдачей запроса на подтверждение удаления. 3)    COPY – копирование одного или группы файлов, вывод содержимого файла на внешнее устройство, объединение содержимого нескольких файлов в один. Для копирования файлов: COPY [d1:][путь1\]имя_файла1 [d2:][путь2\][имя_файла2] [/V]. Параметр: /V – контролирует процесс копирования. Примеры: COPY  a.txt  PRN – распечатать файл  a.txt  из текущего каталога на принтере; COPY  CON  a.txt – создать файл a.txt  с клавиатуры (окончание ввода:   CTRL+Z); COPY *.txt  H: – скопировать все файлы типа .txt из текущего каталога на диск H:. Для объединения файлов: COPY [d1:][путь1\]имя_ф1+[d2:][путь2\]имя_ф2+… [d:][путь\] имя_ф_приемника. Пример: COPY  a1.txt+a2.txt  a.txt – объединить содержимое файлов  a1.txt  и  a2.txt  в  a.txt. 4)    REN (RENAME) – переименование файла: REN [d:][путь\]имя_файла1 имя_файла2 (можно использовать шаблон). Пример: REN  a.txt  a.doc – переименовать в текущем каталоге файл  a.txt  в файл  a.doc. 5)    COMP – побитовое сравнение файлов (после 10 различий сравнения прекращаются): COMP [d1:][путь1\]имя_файла1 [d2:][путь2\]имя_файла2 [/L][/C]. Параметры: /L – отображать номера строк, в которых есть различия; /C – не различать большие и маленькие буквы. Пример: COMP  a.txt  a.doc – сравнить содержимое файлов a.txt и a.doc из текущего каталога. III   Команды общего назначения 1)   DATE – вывод на экран текущей даты. 2)   CLS – очистка экрана 3)   TIME – вывод на экран текущего времени. 4)   PATH – работа с поисковыми маршрутами: (путь без пробелов!): PATH имя_каталога[;имя_кат] – установка списка каталогов для поиска программ; PATH ; – установка поиска только в текущем каталоге; PATH – (без параметров) вывод имен каталогов, в которых производится поиск программ. 5)   PROMPT аргумент – задание формата приглашения DOS. Аргумент – строка из управляющих символов: $b – выдача символа-разделителя | $d – выдача текущей даты $g – выдача символа-разделителя > $h – стирание предыдущего символа (BackSpaсe) $n – выдача имени текущего дисковода $p – выдача имени текущего (рабочего) каталога $t  – выдача текущего времени $v  – выдача номера версии MS-DOS $_  – последовательность символов «возврат каретки» и «перевод строки» Пример: PROMPT $p$g – стандартное приглашение, содержащее путь к текущему каталогу 2.5  Командные файлы Командные файлы принадлежат к категории исполняемых файлов и имеют тип bat. Командный файл – это текстовый файл, строки которого могут содержать: ·  команды DOS; ·  обращение к исполняемым программам (с расширением  .com,  .exe); ·  вызовы других командных файлов; ·  специальные команды для управления выдачей на экран; ·  специальные команды для организации ветвлений и циклов; ·  метки. Файлы с расширением .bat можно создавать текстовым редактором. Командный файл представляет собой системную макрокоманду и является аналогом процедуры в программировании. Командные файлы предназначены для упрощения процесса задания часто используемых последовательностей команд, или команд, требующих большого количества аргументов и переключателей, чтобы избежать ввода с клавиатуры длинной строки. Для описания действий, которые необходимо осуществить после загрузки ОС, используется командный файл AUTOEXEC.BAT. Командные файлы обрабатываются командным процессором построчно, причем каждая прочитанная строка отображается на экране дисплея (если не был установлен режим ECHO OFF), а затем интерпретируется. Если в начале строки командного файла указать символ @, то данная строка не отображается на экране перед ее интерпретацией. Некоторые команды  *.bat -файлов: 1)   CLS – очистка экрана. 2)   PAUSE – приостановка выполнения программы и ожидание нажатия клавиши. 3)   REM – строка комментариев. 4)   ECHO разрешение или подавление вывода на экран системных сообщений: [@]ECHO [ON]([OFF]) – включение (выключение) режима отображения команды на экране; [@]ECHO – запрос о текущем режиме вывода сообщений (вкл/выкл?); ECHO  [строка] – отображение  строки  на экране. 5) GOTO метка – безусловный переход (признаком метки является двоеточие в начале строчки). 6) IF – проверка условия и ветвление: IF EXIST имя_файла (или шаблон) … – проверка существования файла; IF текст_строка1==текст_строка2 … – сравнение двух строк. Примеры: IF %1== Y GOTO m – переход на  m, если фактический параметр = Y; IF EXIST a.txt ECHO файл существует! – вывод надписи, если файл имеется. При вызове командного файла можно задать последовательность аргументов, отделенных друг от друга пробелами, которые будут замещать формальные параметры при интерпретации строк  bat-файла. Допускается использовать до 10 формальных параметров с именами %0, %1, …, %9. Действует принцип позиционного соответствия параметров и аргументов, т.е. вместо %0 подставляется имя командного файла, вместо %1 подставляется первый аргумент и т.д. Для обрабатывания неизвестного заранее количества параметров можно использовать команду SHIFT – сдвиг списка формальных параметров. Пример: Пусть имеется командный файл pf.bat, содержащий строки: @ECHO OFF TYPE %1 PAUSE TYPE %2 PAUSE Запустить его на выполнение можно, набрав команду  pf.bat f1.txt f2.txt. Результатом работы станет вывод на экран содержимого файла f1.txt, а затем, после нажатия клавиши – файла f2.txt.   2.6  Контрольные вопросы 1.  Каким образом можно осуществить быстрый переход в родительский каталог? В корневой каталог? 2.  Как просмотреть на экране содержимое файла? Каталога? 3.  Как можно удалить ненужный файл? Группу файлов? Каталог? 4.  Каким образом объединить содержимое нескольких файлов в один? 5.  Как изменить тип сразу у нескольких файлов? 6.  Каким образом можно разыскать на диске некоторый каталог, если известно только его название? 7.  Как можно быстро определить, есть ли различия в двух файлах, и если да, то в каких именно строках? 8.  Существует ли возможность редактирования вводимых команд? Тема 3. Представление данных в компьютере 3.1  Двоичные числа Все команды и данные в оперативной памяти компьютера представляются последовательностями заряженных или разряженных ячеек, поэтому состояние каждой ячейки можно закодировать 0 или 1. Таким образом, ячейки памяти идеально подходят для хранения двоичных чисел, т.е. натуральных чисел представленных в двоичной системе счисления. Правила представления в двоичной системе счисления аналогичны правилам представления в привычной десятичной системе. Степень двойки при каждой двоичной цифре на единицу больше, чем у предшествующей цифры. Крайняя правая цифра имеет вес 20 (десятичное значение 1). Например, двоичное число (1011)2 имеет десятичное значение 11, поскольку (1011)2=(1×23)+ (0×22)+ (1×21)+ (1×20)=1110. Для преобразования десятичных чисел в двоичные необходимо проделать последовательность делений на 2. Каждое деление определяет двоичную цифру. Для примера переведем число 11 в двоичную систему счисления. 20 21 22 23 11 2     10 5 2     1 4 2 2   1 2 1       Рисунок 5 Перевод десятичного числа в двоичное Таким образом, 11 представимо в двоичной системе как (1011)2. Каждый разряд в двоичном числе называется битом. Восемь битов составляют байт – отдельно адресуемый элемент памяти в большинстве компьютеров. Байт может содержать отдельную машинную команду, символ или число. Следующим по размеру элементарным понятием является слово. В процессорах Intel слово составляет 16 бит (2 байта). В зависимости от количества битов, составляющих байты и слова, диапазон значений, которые можно представить, меняется. Наибольшее значение в диапазоне определяется как 2к-1, где к – число битов. 3.2  Числа со знаком Поскольку при вычислений могут использоваться как положительные, так и отрицательные значения (числа со знаком), то знак числа представляется следующим образом. Если байт содержит число со знаком, то его значение представляется только младшими семью битами, старший бит указывает знак числа. Знаковый бит равен 0, если число положительно или равно 0; Знаковый бит равен 1, если число отрицательно. На рис. 6 и 7 показано размещение битов в байтах со знаком и без знака. Рисунок 6 Размещение битов в байтах без знака Если байт содержит числа со знаком, то он может представлять положительные значения от 0 (000000002) до +127 (011111112) и отрицательные значения от –1 (111111112) до –128 (100000002). Для корректного представления отрицательных чисел со знаком был введен дополнительный код. Использование дополнительного кода объясняется необходимостью однозначного представления нуля. Рисунок 7 Размещение битов в байтах со знаком Для нахождения двоичного представления отрицательного числа со знаком необходимо взять его положительную форму, инвертировать биты (заменить 0 на 1, 1 на 0), а затем прибавить единицу к полученному результату. Приведем пример нахождения двоичного представления для числа –27. Очевидно, 27=000110112. Инвертируем биты – 11100100. Прибавим единицу – 11100101. Получили дополнительный код. Если проделать обратные действия, то получим соответствующее десятичное число. 3.3  Шестнадцатеричные числа Для человека очень трудно работать с большими последовательностями нулей и единиц. Кроме того, программисты как правило работают не с отдельными битами, а с группами битов (байтами или словами). Поэтому используют шестнадцатеричные числа, которые удобно воспринимать и преобразовывать. Каждая шестнадцатеричная цифра заменяет четыре двоичных бита, а две – байт. Поскольку для представления числа в шестнадцатеричной системе счисления необходимо 16 цифр, то для обозначения значений от 10 до 15 используют символы (см. табл. 1). Таблица 1 Шестнадцатеричная система счисления Шестнадца-теричная цифра Двоичное значение Десятичное значение Шестнадца-теричная цифра Двоичное значение Десятичное значение 0000 8 1000 8 1 0001 1 9 1001 9 2 0010 2 А 1010 10 3 0011 3 B 1011 11 4 0100 4 C 1100 12 5 0101 5 D 1101 13 6 0110 6 E 1110 14 7 0111 7 F 1111 15 Используя соответствия между шестнадцатеричными цифрами и двоичными значениями, можно быстро переводить двоичное число в шестнадцатеричное и обратно. Пример приведен на рис. 8. Символ h в конце числа означает, что число представлено в шестнадцатеричной форме. 3 D E 0011 1101 0000 1110 Рисунок 8 Соответствие шестнадцатеричных и двоичных чисел Для преобразования шестнадцатеричного числа в десятичное необходимо умножить значение каждого разряда  на соответствующую степень 16, а потом просуммировать полученные значения. На рис. 9 показан пример такого преобразования. 3×163 13×162 0×162 14×160 3 D E = 15630 Рисунок 9 Преобразование шестнадцатеричного числа в десятичное 3.4  Арифметические действия с двоичными и c шестнадцатеричными числами Двоичные и шестнадцатеричные числа можно складывать столбиком так же, как и десятичные. Получившийся избыток переносится в следующий разряд. Ниже приведены примеры сложения двоичных и шестнадцатеричных чисел. + 1 1   +   5 9 Е С       1 1   6 А 8 1       1 1 1     6 F A 6 D     Рисунок 10 Сложение двоичных и шестнадцатеричных чисел Отдельная операция вычитания не реализована в процессоре. Вычитание осуществляется путем сложения. Перед суммированием отрицательные числа преобразовываются в дополнительный код. Таким образом, вместо операции вычитания А-В процессор выполняет операцию сложения А+(-В).   3.5  Контрольные вопросы 1.  Сколько бит находится в байте, слове? 2.  Подсчитайте диапазон значений для слова без знака. 3.  Что такое основание системы счисления? 4.  Почему удобно использовать шестнадцатеричную систему счисления для отображения данных? 5.  Как представлены в памяти числа без знака и со знаком? 6.  Каким образом проводятся арифметические действия с шестнадцатеричными числами? 7.  Как представить десятичное число в двоичном виде? 8.  Как представить десятичное число в шестнадцатеричном виде? Тема 4. Язык ассемблера 4.1  Понятие ассемблера Квалифицированные программисты должны знать язык ассемблера не только для того, чтобы на нем программировать. Язык ассемблера позволяет лучше понять взаимодействие всех функциональных узлов компьютера с операционной системой. Язык ассемблера – это специфический язык программирования со взаимно однозначным соответствием между его операторами и командами процессора. Язык ассемблера существует для каждого типа процессоров или целого семейства процессоров, поскольку команды на языке ассемблера должны иметь взаимно однозначное соответствие с системой машинных команд и должны быть согласованы с архитектурой компьютера. В данном курсе рассматривается система команд для 16-разрядного 8086-88 процессоров производства Intel. Микропроцессоры 8086-88 характеризуются основным адресным пространством объемом 1 (MB) мегабайт, из которого первые 640 KB (килобайт) отведены под основную память (RAM) и адресным пространством ввода/вывода объемом 65536 байтов. Ассемблер – это программа, преобразовывающая исходные коды языка ассемблера в машинные команды. Ассемблер может создавать листинг программы с номерами строк, адресами памяти, исходными операторами и таблицей перекрестных ссылок символов и переменных, используемых в программе. Специальная программа – загрузчик – позволяет собрать отдельные файлы, созданные ассемблером, в единую исполняемую программу. Язык ассемблера является языком низкого уровня, поскольку он очень близок к машинному языку по своей структуре и по выполняемым функциям. Каждая команда ассемблера имеет взаимно однозначное соответствие с машинными командами, в отличие от языков высокого уровня, для которых один оператор транслируется во множество машинных команд. Хотя разработка и отладка программы на языке ассемблера занимают много времени, при этом получаются небольшие исполняемые модули, занимающие мало места в памяти и позволяющие достичь приемлемой скорости даже на медленных компьютерах. Язык ассемблера используется в основном для написания отдельных сегментов прикладных программ (для повышения скорости работы и прямого доступа к оборудованию), а также встроенных системных программ, которые хранятся в программируемой памяти отдельных устройств. Главный недостаток языка ассемблера состоит в том, что написанная для одного типа компьютеров программа не может быть перекомпилирована и использована на компьютерах других типов, поскольку для каждого семейства компьютеров используется свой язык ассемблера. Если создаваемая программа должна использоваться на различных компьютерах, то ее необходимо разрабатывать на языках высокого уровня, которые скрывают от программиста специфику архитектуры компьютера для удобства использования и получения переносимого кода. 4.2  Разработка программы на языке ассемблера Разработка программ на языке ассемблера отличается от написания программ на языках высокого уровня тем, что требует большого внимания и аккуратности при отслеживании содержимого памяти и регистров. При этом следует соблюдать следующие этапы разработки программы: · постановка задачи и составление проекта программы; · создание файла с текстом программы с помощью любого текстового редактора; · трансляция программы с помощью ассемблера, при обнаружении ошибок – исправить их в текстовом редакторе и оттранслировать заново; · преобразование результата работы ассемблера в исполняемый модуль с помощью компоновщика; · запуск программы на исполнение; · проверка результатов. В случае не соответствия необходимо найти ошибки с помощью отладчика. Программа, написанная в кодах ассемблера, называется исходной программой, а ее преобразованный вид в команды микропроцессора – объектной программой или объектным модулем. Компоновщик позволяет создать исполняемый файл или исполняемый модуль. Отладчик – это программа, позволяющая отображать на экране значения необходимых переменных, получать состояния всех регистров и ячеек памяти при пошаговом исполнении программы, вносить изменения в программу, указывать точки останова и многое другое. Для создания программ на языке ассемблера в данном курсе используются программный продукт Турбо Ассемблер фирмы Borland Int. Компилятор Турбо Ассемблера – это выполняемая программа, размещенная в файле TASM.EXE, а компоновщик содержится в файле TLINK.EXE. Отладчик содержится в файле TD.EXE. Процесс компиляции и компоновки программы на языке ассемблера выглядит следующим образом.   Рисунок 11 Этапы разработки программы на языке ассемблера 4.3  Компиляция и отладка программы Для удобства работы с компилятором можно создать командный файл, который содержит в себе вызов компилятор и компоновщика с соответствующими опциями. Это можно сделать следующим образом. Создайте в текстовом редакторе (в Far Manager) текстовый файл с расширением .bat. Назовите его, например, a.bat. Наберите следующие строки (компилятор и компоновщик находятся в директории C:\ASM): @echo off C:\ASM\tasm /zi %1.asm, %1.obj, %1.lst C:\ASM\tlink /v %1.obj Во второй строчке вызывается компилятор с нужными опциями для файла с исходной программой, который будет указан в командной строке. В третьей строчке вызывается компоновщик для создания ехе-файла. Для компиляции программы в командной строке необходимо набрать a.bat Myprog (если исходная программа хранится в файле Myprog.asm) Рисунок 12 Компиляция программы на языке ассемблера После трансляции в текущей директории появляются файлы с расширением .lst, .map, .exe. Файл с расширением .lst содержит информацию об ошибках. Обязательно нужно просматривать файл листинга на наличие ошибок в программе, после этого необходимо исправить их и заново оттранслировать программу. Если ошибки не найдены, то можно запустить на исполнение созданный ехе-файл. Для исправления ошибок можно воспользоваться отладчиком Turbo Debugger. В командной строке необходимо набрать C:\АSM\td Myprog.exe Можно оформить этот вызов в виде командного файла для удобства. После выполнения этой команды вызывается отладчик.   Рисунок 13 Отладчик Turbo Debugger Просмотр содержимого регистров осуществляется командой Veiw\CPU. Пошаговое исполнение программы – F8. Выход из отладчика – ALT-X. 4.4 Контрольные вопросы 1.  Существует ли взаимно однозначное соответствие между командами языка ассемблера и машинными кодами? 2.  Можно ли написать программу в машинных кодах? 3.  Как разрабатывается программа на языке ассемблера? 4.  Назовите основные этапы получения исполняемой программы. 5.  Для чего нужен отладчик? Как его вызвать? 6.  Как вызвать компилятор языка ассемблера? Тема 5. Команды и директивы языка ассемблера 5.1  Операторы программы на языке ассемблера Исходная программа – это последовательность операторов, описывающих выполняемые операции. Оператором исходной программы может или команда, или директиваязыка ассемблера. Каждый оператор располагается на одной строке программы. Команды языка ассемблера представляют собой краткую нотацию системы команд процессора и сообщают процессору об необходимых действиях. Директивы используются для того, чтобы сообщить ассемблеру, что делать с командами и данными, которые вводит программист. Каждая команда языка ассемблера в исходной программе может иметь до четырех полей следующего вида (необязательные поля заключены в квадратные скобки): [Метка:] Мнемокод [Операнд] [; Комментарий] Поле метки служит для присваивания имени команде языка ассемблера. По имени на эту команду могут ссылаться другие команды программы. Метка команды может содержать до 31 символа и заканчиваться двоеточием. В нее могут входить буквы (A-Z), цифры (0-9), специальные знаки (? . @ $). Нельзя использовать в качестве меток названия регистров и мнемокоды. Поле мнемокода  содержит имя команды микропроцессора. Имена состоят их двух-шести букв. Для трансляции каждого мнемокода программы в его машинный эквивалент ассемблер использует внутреннюю таблицу. По мнемокоду ассемблер узнаёт, сколько и какого типа должны быть операнды у данной команды. Для некоторых команд наличиеполя операнда обязательно, для других оно запрещено. Если поле операнда присутствует то в нем должно быть одно или два операнда, разделенных между собой запятой. От мнемокода операнды отделяются хотя бы одним пробелом или знаком табуляции. В качестве операндов могут использоваться константы. Ассемблер позволяет вводить константы в различной форме. Наиболее распространены следующие виды констант: · двоичные – последовательности из 0 и 1, которые заканчиваются буквой b. Например, 10001111b. · десятичные – последовательности из 0-9 · шестнадцатеричные – последовательности цифр 0-9 и букв A-F, которые заканчиваются буквой h. · литералы – строки букв, цифр и других символов, заключенные в кавычки или апострофы. Можно также использовать отрицательные числа. Если число десятичное, то достаточно поставить знак минус перед числом. Если число двоичное или шестнадцатеричное, тот число необходимо вводить в дополнительном коде. Поле комментария позволяет описывать назначение операторов исходной программы для облегчения ее понимания. Ассемблер игнорирует комментарии при трансляции, но сохраняет их в листинге программы. Директивы управляют работой ассемблера, а не процессора. С помощью директив можно определять сегменты и процедуры, давать имена командам и элементам данных, резервировать рабочие области памяти  и выполнять другие важные задачи. В отличие от команд языка ассемблера большинство директив не генерирует объектного кода. Директивы могут содержать до четырех полей: [Идентификатор] Директива [Операнд] [; Комментарий] Смысл полей директивы практически тот же, что и при описании команд языка ассемблера. 5.2  Основные директивы языка ассемблера В этом параграфе рассматриваются основные директивы языка ассемблера, такие как директивы установки типа процессора, директивы установки модели памяти, директивы размещения данных. Язык ассемблера для семейства процессоров Intel поддерживает большой диапазон процессоров. Директива установки типа процессора определяет минимально возможный тип применяемого процессора. В таблице приведены возможные варианты этой директивы. Таблица 2 Директивы установки типа процессора Директива Описание .8086 Допустимы команды для процессоров 8086 и 8088. Команды для более поздних процессоров не используются. .186 Разрешены команды для процессора 80186. Команды для более поздних процессоров не используются. .286 Разрешены команды для процессора 80286. Команды для более поздних процессоров не используются. .386 Разрешены команды для процессора 80386. Команды для более поздних процессоров не используются. .486 Разрешены команды для процессора 80486. Команды для более поздних процессоров не используются. .586 Разрешены команды для процессора Pentium. С помощью директивы .MODEL можно выбрать одну из стандартных моделей памяти для программ на языке ассемблера. Модель памяти определяет, как расположены в памяти используемые программой сегменты: сегмент данных, сегмент стека, сегмент кодов. Описания стандартных моделей памяти приведены в таблице. Таблица 3 Модели памяти Модель Описание tiny Коды и данные вместе занимают не более64 Кб. small Коды занимают не более64 Кб, данные занимают не более64 Кб medium Данные занимают не более64 Кб, код может быть любого размера compact Коды занимают не более64 Кб, данные могут быть любого размера large Данные и коды имеют объем больше, чем 64Кб каждый Использование директивы .MODEL позволяет применять упрощенные директивы для указания начала сегментов данных, стека, кодов: .DATA, .STACK, .CODE. Общий вид программы на языке ассемблера с упрощенными директивами выглядит следующим образом. TITLE MyProg .286 .MODEL small .DATA A DW 5 ; ; описания переменных B DW 3 ; C DW 8 ; D DW 9 ; .STACK 100h .CODE ; Начало программы - установить все регистры Start: mov AX, @Stack_ mov SS, AX mov AX, @Data mov DS, AX ;Регистры установлены, уже можно что-то вызывать mov AL, 0 mov AH, 4Ch ; MS DOS "exit" int 21h END Start Директивы размещения данных служат для заполнения памяти данными, определенного типа. В результате интерпретации этих директив происходит резервирование в оперативной памяти места для переменных соответствующих типов. Переменная является символическим именем для определенного места в памяти, где размещены данные. Смещение переменной – это расстояние от начала сегмента до ячейки памяти с размещенными данными. Имена переменных автоматически связываются со смещением. Возможные варианты директив размещения данных приведены в таблице. Таблица 4 Директивы размещения данных Директива Описание Размер переменной DB Объявить байт 1 байт DW Объявить слово 2 байта DD Объявить двойное слово 4 байта DF Объявить шесть байтов 6 байтов DQ Объявить учетверенное слово 8 байтов DT Объявить десять байтов 10 байтов Директивы размещения данных используются следующим образом: [имя переменной] Директива инициализатор [,инициализатор] … Обязательно должна быть проведена инициализация хотя бы одной переменной. Начальным значением переменной может быть константой или выражением с константами, которые имеют соответствующий переменной тип. Значение переменной можно не указывать, поставив знак вопроса на месте инициализатора. Примеры использования директив: ch DB ‘A’ x1 DB –127 x1 DB ? x2 DB 255 DW 256*2 x3 DD 0BCA34567h Если имя переменной указывает на начало последовательности данных, то можно применить множественную инициализацию, перечисляя начальные значения через запятую. 5.3  Команды управления микропроцессором К командам управления работой микропроцессором относятся команды, приведенные ниже в таблице. Таблица 5 Команды установки флагов Команда Действие STC Устанавливает флаг переноса CF в 1 и не воздействует на другие флаги. CLC Обнуляет флаг переноса CF и не воздействует на другие флаги CMC Изменяет значение флага переноса CF на противоположное и не воздействует на другие флаги. STD Устанавливает флаг переноса DF в 1 и не воздействует на другие флаги. При установленном флаге направления выполнение строковых команд сопровождается автодекрементом регистра SI и/или DI. CLD Сбрасывает флаг переноса DF в 0 и не воздействует на другие флаги. При сброшенном флаге направления выполнение строковых команд сопровождается автоинкрементом регистра SI и/или DI. STI Устанавливает флаг переноса IF в 1 и не воздействует на другие флаги. При установленном флаге разрешения прерывания разрешены все прерывания. CLI Сбрасывает флаг переноса IF в 0 и не воздействует на другие флаги. При сброшенном флаге разрешения прерывания процессор не реагирует на внешние запросы прерывания, поступающие на вход INTR. Этот запрет не касается немаскируемого прерывания NMI и программных прерываний. HLT Команда HLT (останов) переводит процессор в состояние останова, из которого он может быть выведен только сбросом или сигналом запроса прерывания. Команда HLT не воздействует ни на какие флаги. NOP Команда NOP (нет операции) не влияет ни на работу процессора, ни на флаги. 5.4  Команды пересылки данных Основная команда общего назначения MOV позволяет пересылать байт или слово между регистром и ячейкой памяти или между двумя регистрами. Кроме того, команда может пересылать непосредственно адресуемое значение в регистр или ячейку памяти. Команда MOV имеет следующий формат MOV приемник, источник Приведем несколько примеров использования этой команды. MOV AX, val             ;пересылка из памяти в регистр MOV val, AX             ;и наоборот MOV DS, AX               ;пересылка между 16-разрядными регистрами MOV BL, AL               ;пересылка между 8-разрядными регистрами MOV CL, -25             ;пересылка константы в регистр MOV val, 234h                  ;или в память В команде MOV исключаются следующие сочетания операндов: 1.  Нельзя осуществить непосредственную пересылку данных из одной ячейки памяти в другую. Чтобы выполнить такую пересылку, данные источника необходимо загрузить в регистр общего назначения, а затем переслать содержимое этого регистра в приемник. Например, если val1 и val2 две переменные, то для пересылки значения из одной переменной в другую можно воспользоваться командами: MOV AX, val1 MOV val2, AX 2.  Нельзя загрузить непосредственно адресуемый операнд в регистр сегмента. 3.  Нельзя непосредственно переслать значение одного регистра сегмента в другой. Подобные пересылки модно делать через регистр общего назначения. Например, чтобы регистр DS указывал на тот же сегмент, что и регистр ES, можно воспользоваться командами MOV AX, ES MOV DS, AX 4.  Нельзя использовать регистр CS в качестве приемника в команде MOV. Команда обмена XCHG позволяет обменять между собой значения двух регистров или регистра и ячейки памяти. Нельзя выполнить обмен значений регистров сегмента. Приведем несколько примеров использования этой команды: XCHG AX, val           ;обмен значения регистра и ячейки памяти XCHG val, AX           ;и наоборот XCHG BX, AX             ;обмен между 16-разрядными регистрами XCHG BL, AL             ;обмен между 8-разрядными регистрами 5.5  Режимы адресации Микропроцессор 8088 предоставляет множество способов доступа к операндов. Операнды могут содержаться в регистрах, в самих командах , в памяти или портах ввода-вывода. Рассмотрим несколько типов адресации операндов в языке ассемблера: · регистровая адресация · непосредственная адресация · прямая адресация · косвенная регистровая адресация. Микропроцессор выбирает один из режимов адресации по значению поля режима команды. Самыми быстрыми режимами адресации являются регистровая и непосредственная адресация операндов, поскольку в этом случае процессор извлекает их из регистров либо из конвейера команд. В других режимах адресация выполняется дольше, потому что интерфейс шины сначала должен  вычислить адрес ячейки, извлечь операнд и только после этого передать его операционному блоку процессора. При регистровой адресации процессор извлекает операнд из регистра (или загружает его в регистр). В следующем примере процессор использует регистровую адресацию для извлечения операнда-источника из регистра СХ и загрузки его в регистр-приемник АХ. MOV AX, СХ Непосредственная адресация позволяет указывать значение константы (8 или 16 битов) в качестве операнда-источника. Эта константа содержится в команде, а не в регистре или ячейке памяти. Прямая адресация применяется, когда операндом служит переменная. В этом случае составной частью команды является исполнительный адрес переменной, т.е. смещение, которое вычисляется операционным блоком для доступа к находящемуся в памяти операнду. Исполнительный адрес показывает, на каком расстоянии (в байтах) находится операнд от начала сегмента. Время, затрачиваемое на вычисление исполнительного адреса, является одним из основных компонентов общего времени исполнения команды. На рис. 12 схематично представлена прямая адресация. Рисунок 14 Прямая адресация При косвенной регистровой адресации исполнительный адрес операнда содержится в базовом регистре ВХ, регистре указателя базы ВР или индексном регистре. Косвенные регистровые операнды необходимо заключать в квадратные скобки, чтобы отличить их от регистровых операндов. Например, команда MOV AX, [BХ] загружает в регистр АХ содержимое ячейки памяти с адресом, содержащимся в регистре ВХ (рис.13). Чтобы поместить смещение адреса в регистр ВХ можно воспользоваться операцией OFFSET к адресу ячейки памяти. Например, для загрузки содержимого из ячейки VAL в регистр АХ подойдет последовательность команд MOV BX, OFFSET VAL MOV AX, [BX]. Эти две команды выполняют те же действия, что и команда MOV AX,VAL. Рисунок 15 Косвенная регистровая адресация Для получения сегментной части адреса метки или переменной используют оператор SEG. Обычно он используется, когда переменная находится в сегменте, отличном от того, на который указывает регистр DS. Следующие команды формируют адреса переменных. Они могут быть полезны при обработке списков, массивов и строк. 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 позволяет определить строку назначения для последующей строковой команды. 5.6  Арифметические команды Арифметические команды могут обрабатывать четыре типа чисел – беззнаковые двоичные, знаковые двоичные, беззнаковые упакованные десятичные и беззнаковые неупакованные десятичные. Двоичные числа могут быть 8- и 16-разрядными. Десятичные упакованные числа содержат в байте две цифры, неупакованные – одну. Беззнаковые 8-разрядные двоичные числа могут иметь значение от 0 до 255. Для представления беззнаковых чисел в диапазоне от 0 до 65 535 используются 16 разрядов. Над беззнаковыми двоичными числами могут выполняться операции сложения, вычитания, умножения и деления. Знаковые двоичные числа (целые) также могут быть 8- и 16-разрядными. Самый старший (самый левый) бит знакового числа интерпретируется как знак этого числа: 0 – положительное число, 1 – отрицательное. Отрицательные числа представляются в стандартном двоичном дополнительном коде. Так как старший бит знакового числа используется для обозначения знака, диапазон представления 8-разрядных знаковых чисел от -128 до +127. 16-разрядное целое число представляется в диапазоне от -32 768 до +32 767. Нуль представляется положительным числом. Для знаковых чисел могут выполняться операции сложения, вычитания, умножения и деления. Рассмотрим арифметические команды языка ассемблера. Сложение ADD (операнд назначения),(операнд-источник) Сумма двух операндов, которые могут быть байтами или словами, помещается в операнд назначения. Размеры операндов должны быть одинаковыми, и только один операнд может быть операндом памяти. Регистр сегмента не может быть операндом назначения. Оба операнда могут быть знаковыми или беззнаковыми числами. Команда ADD изменяет значение флагов AF, CF, OF, PF, SF и ZF. Пример. mov BX, 1FFEh mov CX, 3 add BX, CX                ; ВХ=2001h ADC (операнд назначения),(операнд-источник) Команда ADC (суммирование с учетом разряда переноса) суммирует операнды, которые могут быть байтами или словами, и добавляет 1, если установлен разряд переноса; результат помещается в операнд назначения. Оба операнда могут быть знаковыми или беззнаковыми числами. Команда ADD изменяет значение флагов AF, CF, OF, PF, SF и ZF. Так как команда ADC учитывает значение разряда переноса от предыдущей операции, это может быть использовано для организации суммирования чисел произвольной разрядности. Пример 1. mov AX, 1125h adc AX, 2C25      ; AX=3D48h, если CF=1 Пример 2. В сегменте данных: numlow  DW 0FFFh     ;Младшая часть 2-го слагаемого numhigh DW 0005h     ;Старшая часть 2-го слагаемого ;Число 5FFFh=393215 В сегменте кодов: mov    AX, 0005h       ;Младшая часть 1-го слагаемого mov    BX, 0002h       ;Старшая часть 2-го слагаемого ;Число 20005h=131077 add    AX, numlow      ;Сложение младших частей, CF=1 adc    BX, numhigh     ;Сложение старших частей ;с переносом ;BX:AX=0008:0004h ;Число 80004h=524292 INC (операнд назначения) Команда INC (инкремент) добавляет единицу к операнду назначения. Операнд может быть байтом или словом и трактуется как беззнаковое двоичное число. Команда INC изменяет значение флагов AF, OF, PF, SF и ZF; значение флага CF эта команда не изменяет. Не допускается использовать в качестве операнда непосредственное значение. Вычитание SUB (операнд назначения),(операнд-источник) Содержимое операнда-источника вычитается из содержимого операнда назначения, и результат помещается в операнд назначения. Операнды могут быть знаковыми или беззнаковыми, двоичными или десятичными (см. команды AAS и DAS), однобайтовыми или двухбайтовыми числами. Команда SUB изменяет значение флагов AF, CF, OF, PF, SF и ZF. SBB (операнд назначения),(операнд-источник) Команда SBB (вычитание с учетом заема) вычитает содержимое операнда-источника из содержимого операнда назначения, затем вычитает из результата 1, если был установлен флаг переноса CF. Результат помещается на место операнда назначения. Операнды могут быть знаковыми или беззнаковыми, двоичными или десятичными (см. команды AAS и DAS), однобайтовыми или двухбайтовыми числами. Команда SBB изменяет значение флагов AF, CF, OF, PF, SF и ZF. Команда SBB может быть использована для организации вычитания многобайтовых чисел. DEC (операнд назначения) Команда DEC (декремент) вычитает единицу из операнда назначения, который может быть одно- или двухбайтовым. Команда DEC изменяет содержимое флагов AF, OF, PF, SF и ZF. Содержимое флага CF при этом не изменяется. NEG (операнд назначения) Команда NEG (инверсия) вычитает операнд назначения, который может быть байтом или словом из 0 и помещает результат в операнд назначения. Такая форма двоичного дополнения числа пригодна для инверсии знака целых чисел. Если операнд нулевой, его знак не меняется. Попытка применить команду NEG к байтовому числу -128 или к двухбайтовому числу -32 768 не приводит к изменению значения операнда, но устанавливает флаг OF. Команда NEG воздействует на флаги AF, CF, OF, PF, SF и ZF. Флаг CF всегда установлен за исключением случая, когда операнд равен нулю, когда этот флаг сброшен. Не допускается использовать в качестве операнда непосредственное значение. CMP (операнд назначения),(операнд-источник) Команда СМР (сравнение) вычитает операнд-источник из операнда назначения, не изменяя при этом значения операндов. Операнды могут быть байтовыми или двухбайтовыми числами. Хотя значения операндов не изменяются, значения флагов обновляются, что может быть учтено в последующих командах условного перехода. Команда CMP воздействует на флаги AF, CF, OF, PF, SF и ZF. При совпадении значений операндов взводится флаг ZF. Флаг переноса взводится, если операнд назначения меньше операнда-источника. Умножение MUL (операнд-источник) Команда MUL (умножение) выполняет беззнаковое умножение операнда-источника и содержимого аккумулятора. Если операнд-источник однобайтовый, осуществляется умножение на содержимое регистра AL, а двухбайтовый результат возвращается в регистры AH и AL. Если операнд-источник двухбайтовый, осуществляется умножение на содержимое регистра AX, а четырехбайтовый результат возвращается в пару регистров DX и AX. Операнды рассматриваются как беззнаковые двоичные числа. Если старшая половина результата (регистр AH при однобайтовом умножении и DX при двухбайтовом умножении) взводятся флаги CF и OF, в противном случае эти флаги сбрасываются. Если после выполнения умножения взведены флаги CF и OF, это говорит о наличии значащих цифр результата в регистре AH или DX. Содержимое флагов AF, PF, SF и ZF после выполнения команды умножения неопределено. Пример 1. mov AL, 5 ; первый сомножитель mov BL, 3 ; второй сомножитель mul BL   ;AX=000Fh Пример 2. mov AX, 255   ; первый сомножитель mov BX, 255   ; второй сомножитель mul BX        ; DX=0001h,AX=0000h ; число 65536 IMUL (операнд-источник) Команда IMUL (целочисленное умножение) выполняет знаковое умножение операнда-источника и содержимого аккумулятора. Если операнд-источник однобайтовый, осуществляется умножение на содержимое регистра AL, а двухбайтовый результат возвращается в регистрах AH и AL. Если операнд-источник двухбайтовый, осуществляется умножение на содержимое регистра AX, а четырехбайтовый результат возвращается в паре регистров DX и AX. Операнды рассматриваются как беззнаковые двоичные числа. Если старшая половина результата (регистр AH при однобайтовом умножении и DX при двухбайтовом умножении) взводятся флаги CF и OF, в противном случае эти флаги сбрасываются. Если после выполнения умножения взведены флаги CF и OF, это говорит о наличии значащих цифр результата в регистре AH или DX. Содержимое флагов AF, PF, SF и ZF после выполнения команды целочисленного умножения неопределено. Пример 1. mov AL, 5 ; первый сомножитель mov BL, 3 ; второй сомножитель mul BL   ;AX=000Fh Пример 2. mov AL, -3    ; первый сомножитель mov BL, 5     ; второй сомножитель mul BL        ; AX=FFF1h ; число 65536 Деление DIV (операнд-источник) Команда DIV (деление) выполняет беззнаковое деление содержимого аккумулятора (и его расширения) на операнд-источник. Если операнд-источник однобайтовый, осуществляется деление двухбайтового делимого, расположенного в регистрах AH и AL. Однобайтовое частное получается в регистре AL, а однобайтовый остаток – в регистре AH. Если операнд-источник двухбайтовый, осуществляется деление четырехбайтового делимого, расположенного в регистрах DX и AX. Двухбайтовое частное при этом получается в регистре AX, а двухбайтовый остаток – в регистре DX. Если значение частного превышает разрядность аккумулятора (0FFh для однобайтового деления и 0FFFFh – для двухбайтового) или выполняется попытка деления на нуль, генерируется прерывание типа 0, а частное и остаток остаются неопределенными. Содержимое флагов AF, CF, OF, PF, SF и ZF после выполнения команды DIV неопределено. Пример 1. mov AX, 506   ;Делимое mov BL, 50    ;Делитель div BL        ;AL=0Ah (частное) ;AH=06h (остаток) Пример 2. mov DX, 1     ;Старшая часть делимого 65537 mov AX, 1     ;Младшая часть делимого 65537 mov CX, 256   ;Делитель div CX        ;AX=0100h (частное) ;DX=0001h (остаток) IDIV (операнд-источник) Команда IDIV (целочисленное деление) выполняет знаковое деление содержимого аккумулятора (и его расширения) на операнд-источник. Если операнд-источник однобайтовый, осуществляется деление двухбайтового делимого, расположенного в регистрах AH и AL. Однобайтовое частное получается в регистре AL, а однобайтовый остаток - в регистре AH. Для бйтового целочисленного деления положительное частное не может быть больше значения +127 (7Fh), а отрицательное не может быть меньше -127 (81h). Если операнд-источник двухбайтовый, осуществляется деление четырехбайтового делимого, расположенного в регистрах DX и AX. Двухбайтовое частное при этом получается в регистре AX, а двухбайтовый остаток - в регистре DX. Для двухбайтового целочисленного деления положительное частное не может быть больше значения +32767 (7FFFh), а отрицательное не может быть меньше значения -32767 (8001h). Если частное положительное и превышает максимум или отрицательное и меньше минимума, генерируется прерывание типа 0, а частное и остаток остаются неопределенными. Частным случаем такого события является попытка деления на нуль. Содержимое флагов AF, CF, OF, PF, SF и ZF после выполнения команды IDIV неопределено. Пример. mov AX, -506  ;AX=FE06h Делимое mov BL, 50    ;Делитель idiv BL       ;AL=F6h=-10 (частное) ;AH=FAh=-6 (остаток) CBW Команда CBW (преобразование байта в слово) расширяет знак байта в регистре AL на весь регистр АХ. Команда CBW не воздействует на флаги. Команда CBW может быть использована для получения двухбайтового делимого из однобайтового перед выполнением команды деления. Пример. mov AL, 5 cbw           ;AX=0005h mov AL, -2    ;AL=FEh=-2 cbw           ;AX=FFFEh=-2 CWD Команда CWD (преобразование слова в двойное слово) расширяет знак слова в регистре AХ на пару регистров АХ и DX. Команда CWD не воздействует на флаги. Команда CWD может быть использована для получения четырехбайтового делимого из двухбайтового перед выполнением команды деления. Результаты арифметических команд воздействуют на состояние 6 флагов. Большая часть этих флагов может быть проанализирована после выполнения арифметических команд с помощью команд условного перехода, а также с помощью команды INTO (прерывание по переполнению). Воздействие арифметических команд на флаги описано ниже. · CF (флаг переноса): Если в результате сложения осуществляется перенос из старшего бита, флаг переноса взводится; в противном случае флаг переноса сбрасывается. При вычитании флаг переноса взводится, если осуществляется заем в старший бит результата; при отсутствии заема флаг сбрасывается. Следует иметь в виду, что при возникновении знакового переноса CF = OF (флаг переполнения). Флаг переноса CF может использоваться для индикации беззнакового переполнения. Команды ADC (сложение с учетом разряда переноса) и SBB (вычитание с учетом разряда переноса) учитывают значение флага переноса, что позволяет реализовывать многобайтовые (например, 32- и 64-битовые) операции. · AF (флаг дополнительного переноса): Если в результате сложения осуществляется перенос из младшего полубайта в старший, флаг дополнительного переноса взводится; в противном случае флаг сбрасывается. При вычитании флаг дополнительного переноса взводится, если осуществляется заем из старшего полубайта в младший; при отсутствии заема флаг сбрасывается. Флаг дополнительного переноса используется при десятичной коррекции операций. · SF (флаг знака): После арифметических и логических операций флаг знака принимает значение старшего (7 или 15) бита результата. Для знаковых двоичных чисел флаг знака принимает значение 0 при положительном результате и 1 при отрицательном (если только не возникло переполнение). Команда условного перехода, выполняемая после операции со знаковыми числами, может использоваться для ветвления программы в зависимости от знака результата. · ZF (флаг нуля): Если в результате арифметической или логической операции получается нулевой результат, флаг нуля взводится; в противном случае флаг нуля сбрасывается. Команда условного перехода могут использоваться для ветвления программы в зависимости от равенства или неравенства нулю результата предыдущей операции. · PF (флаг четности): Если младшие 8 бит результата арифметической или логической операции содержат четное число единичных битов, флаг четности взводится; в противном случае флаг четности сбрасывается. Флаг четности может использоваться для проверки правильности принятого кода при передаче данных по линиям связи. · OF (флаг переполнения): Если в результате операции получается очень большое положительное число или очень маленькое отрицательное, которое не помещается в операнд назначения, флаг переполнения взводится; в противном случае флаг переполнения сбрасывается. Флаг переполнения индицирует знаковое арифметическое переполнение. Состояние этого флага может быть проверено командой условного перехода или командой INTO (прерывание по переполнению). Флаг переполнение может игнорироваться при выполнении операций с беззнаковыми числами. 5.7  Команды логических вычислений и сравнений Команды работы с битами могут быть разбиты на три группы: логические команды, команды сдвига и команды циклического сдвига. Таблица 6 Команды для работы с битами Логические операции NOT Инверсия байта или слова AND Операция “И” над байтами или словами OR Операция “ИЛИ” над байтами или словами XOR Операция “ИСКЛЮЧ. ИЛИ” над байтами или словами TEST Проверка байта или слова Команды сдвига SHL/SAL Логический/арифметич. сдвиг влево байта или слова SHR Логический сдвиг вправо байта или слова SAR Арифметический сдвиг вправо байта или слова Команды циклического сдвига ROL Циклический сдвиг влево байта или слова ROR Циклический сдвиг вправо байта или слова RCL Циклический сдвиг влево байта или слова через флаг переноса RCR Циклциклический сдвиг вправо байта или слова через флаг переноса Логические команды К логическим операциям относятся булевы операции "НЕ", "И", "ИЛИ" и "ИСКЛЮЧАЮЩЕЕ ИЛИ". Кроме того, к ним относится также команда "ТЕСТ", которая устанавливает флаги, но не изменяет ни одного из операндов. Команды AND ("И"), OR ("ИЛИ"), XOR ("ИСКЛЮЧАЮЩЕЕ ИЛИ") и TEST ("ТЕСТ") воздействуют на флаги следующим образом: · Флаги переполнения (OF) и переноса (CF) после логических операций всегда сброшены, а флаг дополнительного переноса (AF) всегда неопределен. · Флаги знака (SF), нуля (ZF) и четности (PF) всегда отражают результат логической операции и могут быть проверены последующей командой условного перехода. Интерпретация этих флагов такая же, как и после выполнения арифметических операций. Флаг знака (SF) взводится при единичном старшем бите результата и сбрасывается – при нулевом. · Флаг нуля (ZF) взводится при нулевом результате операции и сбрасывается в противном случае. Флаг четности (PF) взводится, если младший байт результата имеет четное число единиц, и сбрасывается при нечетном числе единиц. NOT (операнд назначения) Команда NOT ("НЕ") инвертирует биты (в форме дополнения до единицы) байта или слова операнда. Операция NOT ("НЕ") не влияет на флаги. Пример. mov AX, 0FFFFh not AX            ;AX=0000h mov SI, 5551h     ; not SI            ;SI=AAAEh AND (операнд назначения),(операнд-источник) Команда AND выполняет логическую операцию "И" над двумя операндами (байтами или словами), а результат возвращается в операнде назначения. Бит результата устанавливается только в том случае, если соответствующие биты операндов установлены. В противном случае бит результата сбрасывается. OR (операнд назначения),(операнд-источник) Команда OR выполняет логическую операцию "ИЛИ" над двумя операндами (байтами или словами), а результат возвращается в операнде назначения. Бит результата устанавливается в том случае, если установлен хотя бы один соответствующий бит любого из операндов. В противном случае бит результата сбрасывается. XOR (операнд назначения),(операнд-источник) Команда XOR выполняет логическую операцию "ИСКЛЮЧАЮЩЕЕ ИЛИ" над двумя операндами (байтами или словами), а результат возвращается в операнде назначения. Бит результата устанавливается в том случае, если установлен соответствующий бит только одного из операндов. В противном случае бит результата сбрасывается. Пример 1. mov AX, 0Fh xor AX, 0FFFFh        ;AX=FFF0h Пример 2. xor BX, BX        ; обнуление ВХ TEST (операнд назначения),(операнд-источник) Команда TEST выполняет логическую операцию "И" над двумя операндами (байтами или словами), не меняя при этом значений ни одного из операндов, и в зависимости от результата устанавливает флаги SF, ZF и PF. Флаги OF и CF сбрасываются, а AF имеет неопределенное значение. Состояние флагов можно затем проанализировать командами условных переходов. Флаг SF устанавливается в 1, если в результате выполнения команды образовалось число с установленным знаковым битом. Флаг ZF устанавливается в 1, если в результате выполнения команды образовалось число, состоящее из одних нулей. Флаг РF устанавливается в 1, если в результате выполнения команды образовалось число с четным количеством единиц в битах. Команды сдвига Биты в байте или слове могут сдвигаться арифметически или логически. Максимально может быть выполнено 255 сдвигов одной командой. Счетчик сдвига может быть определен в команде либо как константа 1, либо в регистре CL. Арифметические сдвиги могут использоваться для умножения и деления двоичных чисел на степени двойки. Команды сдвига воздействуют на флаги следующим образом: ·  флаг дополнительного переноса AF после операции сдвига всегда неопределен; ·  флаги PF, SF и ZF принимают стандартные значение, как после любых логических операций; ·  флаг переноса CF всегда содержит последний выдвинутый из операнда назначения бит. SHL/SAL (операнд назначения)(счетчик) Команды SHL (логический сдвиг влево) и SAL (арифметический сдвиг влево) полностью идентичны. Байт или слово операнда назначения сдвигается влево на количество разрядов, определяемое операндом-счетчиком. Освобождающиеся младшие биты операнда назначения заполняются нулями. Если знаковый бит во время операции не изменился, флаг OF сбрасывается. Каждый сдвиг влево эквивалентен умножению знакового числа на 2, поэтому команду SAL удобно использовать для умножения на степень 2. Пример 1. mov AL, 7 sal AL, 1     ;AL=0Eh=7*2 Пример 2. mov AX, 1FFh mov CL, 2 sal AX, CL        ;AX=07FCh=1FFh*4 Пример 3. mov SI, -1        ;SI=FFFFh mov CL, 4 sal SI, CL        ;SI=FFF0h=-1*16 SHR (операнд назначения)(счетчик) Команда SHR (логический сдвиг вправо) сдвигает байт или слово операнда назначения вправо на количество разрядов, определяемое операндом-счетчиком. Освобождающиеся старшие биты операнда назначения заполняются нулями. Если знаковый бит во время операции не изменился, флаг OF сбрасывается. Пример 1. mov AL, 7 shr AL, 1     ;AL=3 Пример 2. mov AX, 1FF0h mov CL, 4 shr AX, CL        ;AX=01FFh Пример 3. mov DX, 0FFF0h mov CL, 4 shr DX, CL        ;DX=0FFFh SAR (операнд назначения)(счетчик) Команда SAR (арифметический сдвиг вправо) сдвигает байт или слово операнда назначения вправо на количество разрядов, определяемое операндом-счетчиком. Освобождающиеся старшие биты операнда назначения заполняются исходным значением знакового (старшего значащего бита) операнда. Следует отметить, что эта команда не эквивалентна команде целочисленного деления (IDIV) на соответствующую степень двойки. Так, например, при сдвиге вправо на 1 разряд значения -5 в результате получается значение -3, в то время, как при делении должно было получиться -2. Пример 1. mov AL, 7 sar AL, 1     ;AL=3 Пример 2. mov AX, 1FF0h mov CL, 4 sar AX, CL        ;AX=01FFh=1FF0h/16 Пример 3. mov BX, -8        ;BX=FFF8h mov CL, 2 sar BX, CL        ;BX=FFFEh=-2 Команды циклического сдвига Биты в байте или в слове могут сдвигаться также циклически. При циклическом сдвиге "выдвигаемые" из операнда биты не теряются, как при простом сдвиге, в "вдвигаются" в операнд с другого его конца. Как и в командах простого сдвига количество разрядов сдвига определяется операндом-счетчиком, который может определяться непосредственной константой 1 или регистром CL. Команда циклического сдвига воздействуют только на флаги переноса CF и переполнения OF. Флаг переноса CF всегда содержит значение последнего "выдвинутого" бита. Значение флага переполнения OF при многобитовом сдвиге неопределено, при однобитовом сдвиге OF устанавливается, если старший (знаковый) бит изменяется во время операции. Если старший бит не меняется, флаг переполнения сбрасывается. ROL (операнд назначения)(счетчик) Команда ROL (циклический сдвиг влево) циклически сдвигает содержимое операнда назначение влево на количество разрядов, определенное в операнде-счетчике. получиться -2. Пример 1. mov AX, 1 rol AX, 1     ;AX=0002h Пример 2. mov DL,8 rol DL,1      ;DL=10h Пример 3. mov DH, 0C0h  ; mov CL, 2 rol DH, CL        ;DH=3 ROR (операнд назначения)(счетчик) Команда ROR (циклический сдвиг вправо) циклически сдвигает содержимое операнда назначение вправо на количество разрядов, определенное в операнде-счетчике. RСL (операнд назначения)(счетчик) Команда RСL (циклический сдвиг влево через разряд переноса) циклически сдвигает содержимое операнда назначение влево на количество разрядов, определенное в операнде-счетчике. При этом флаг переноса является частью операнда назначения, то есть, значение флага переноса CF при сдвиге переносится в младший значащий бит операнда, а сам флаг принимает значение старшего значащего бита байта или слова. Пример 1. clc mov AX, 1 rcl AX, 1     ;AX=2 CF=0 Пример 2. mov DL,8 rcl DL,1      ;DL=10h CF=0 Пример 3. clc mov DH, 3 mov CL, 4 rcl DH, CL        ;DH=30h CF=0 RСR (операнд назначения)(счетчик) Команда RСR (циклический сдвиг вправо через разряд переноса) в точности соответствует команде RCL, лишь с той разницей, что сдвиг производится вправо. 5.8  Команды для работы со стеком Стек – это специальный буфер в оперативной памяти, который используется для временного хранения адресов и данных. Стек размещается в сегменте стека. К каждой 16-разрядной ячейке стека можно обратится с помощью регистра SP (указателя стека). Указатель стека содержит адрес последнего элемента, помещенного в стек. Последнее значение, добавленное в стек, является также первым значением, которое может быть извлечено из стека. Рассмотрим команды для работы со стеком. PUSH Команда позволяет занести содержимое операнда в стек. Команда PUSH уменьшает на 2 содержимое указателя стека SP и заносит на эту новую вершину содержимое двухбайтового операнда-источника. В качестве операнда-источника может использоваться любой 16-разрядный регистр (включая сегментные) или ячейка памяти. Пример push AX push CS POP Команда РОР пересылает слово из вершины стека (на которую указывает регистр SP) по адресу операнда-приемника. Затем содержимое SP увеличивается на 2 и указывает на новую вершину стека. В качестве операнда-приемника может использоваться любой 16-разрядный регистр (кроме СS) или ячейка памяти. Пример push CS pop DS        ;теперь DS=CS PUSHF POPF Команда PUSHF уменьшает значение указателя SP стека на 2, а затем пересылает все флаги в стек. Команда POPF берет специальные биты из слова, расположенного на вершине стека, и помещает их в регистр флагов, а затем увеличивает значение указателя стека SP на 2. 5.9  Команды передачи управления Порядок выполнения команд в процессорах 80х86 и 80х88 определяется содержимым регистра сегмента кода (CS) и счетчика команд (IP). Регистр CS содержит базовый адрес текущего сегмента кода, т.е. 64-килобайтного фрагмента памяти, из которого в данный момент извлекаются коды команд. Содержимое счетчика команд IP используется как смещение относительно начала текущего сегмента кода. Содержимое CS и IP однозначно определяет то место в памяти, из которого будет извлечена следующая команда. Команда передачи управления (команды переходов) изменяют содержимое регистров CS и IP. Всего имеется три группы команд передачи управления: команды безусловного перехода, команды условного перехода и команды управления циклами. Команды безусловного перехода JMP (цель) Команда JMP осуществляет безусловную передачу управления на указанный адрес. Команда JMP не сохраняет в стеке информацию об адресе возврата. Адрес целевого операнда может быть указан непосредственно в команде (непосредственная команда JMP), а также в памяти или в регистре (косвенная команда JMP). При внутрисегментной непосредственной команде JMP к счетчику команд IP добавляется смещение, указанное в команде. Если компилятор обнаруживает, что целевой адрес находится на расстоянии меньшем, чем 127 байтов от команды, он автоматически генерирует двухбайтовый вариант команды, называемый коротким переходом (SHORT JMP), в противном случае генерируется ближний переход (NEAR JMP), в котором диапазон перехода составляет плюс-минус 32К. При внутрисегментной косвенной команде JMP смещение, добавляемое к регистру IP, может быть указано в памяти или в 16-разрядном регистре. В последнем случае значение смещение берется из регистра, указанного в команде. При межсегментной непосредственной команде JMP значения IP и CS заменяются значениями, указанными в команде. При межсегментной косвенной команде JMP значения IP и CS могут быть заменены только значениями расположенными в памяти. При этом первое слово двойного слова содержит смещение, второе слово – сегмент. Команды условного перехода Команды условного перехода выполняют или не выполняют передачу управления на указанный адрес в зависимости от состояния флагов процессора не момент выполнения команды. Эти команды (см. таблицу ниже) проверяют различные комбинации флагов и условий. Если условие истинно, осуществляется передача управления на указанный адрес. Если условие неверно, управление передается команде, следующей за командой условного перехода. Все команды условного перехода являются короткими (SHORT), так что диапазон переходов в этих командах лежит в диапазоне от -128 до +127 байтов. При этом следует иметь в виду, что команде JMP 00h соответствует переход на следующую команду. Таблица 7 Команды условного перехода Мнемон. Проверяемое условие Переход, если ... JA/JNBE (CF or ZF) = 0 выше/не ниже или равно JAE/JNB CF = 0 выше или равно/не ниже JB/JNAE CF = 1 ниже/не выше или равно JBE/JNA (CF or ZF) = 1 ниже или равно/не выше JC CF  = 1 перенос JE/JZ ZF = 1 равно/нуль JG/JNLE [(SF xor OF) or ZF] = 0 больше/не меньше или равно JGE/JNL (SF xor OF) = 0 больше или равно/не меньше JL/JNGE (SF xor OF) = 1 меньше/не больше или равно JLE/JNG [(SF xor OF) or ZF] = 1 меньше или равно/не больше JNC CF = 0 нет переноса JNE/JNZ ZF = 0 не равно/не нуль JNO OF = 0 не переполнение JNP/JPO PF = 0 нечетно JNS SF = 0 не знак JO OF = 1 переполнение JP/JPE PF = 1 четно JS SF = 1 знак JCXZ CX=0 CX=0 Пример 1. cmp AX,0 ;АХ=0? je equal ;Если да, перейти на метку equal ja above ;Переход на метку above, ;если содержимое АХ как число ;без знака превышает 0 Пример 2. test AX,1 jne label1    ;Переход, если бит 0 в АХ ;установлен Пример 3. test DX,0FFFFh jz label2         ;Переход, если DX=0 Циклы LOOP Циклическое выполнение, пока содержимое СХ не равно нулю. Команда LOOP выполняет декремент содержимого регистра СХ и если оно не равно 0 осуществляет переход на указанную метку вперед или назад в том же программном сегменте в диапазоне –128…+127 байт. Содержимое регистра СХ рассматривается как целое число без знака, поэтому максимальное число повторений последовательности команд в цикле составляет 65536. Пример 1. Заполнение массива нулями В сегменте данных: mas DW 4096 dup(?)       ;Массив из 4096 слов В сегменте кодов: mov    BX, offset mas mov CX, 4096 mov AX,0 nulmas: mov [BX], AX inc BX inc BX loop nulmas Пример 2. xor CX,CX begin:… loop begin При необходимости организовать вложенные циклы удобно воспользоваться стеком для сохранения внешнего цикла на время выполнения внутреннего. В следующем примере организуется программная задержка длительностью несколько секунд Пример. mov CX, 10  ;Внешний счетчик повторений outer: push CX     ;Сохраним его в стеке mov CX,0    ;64К шагов во внутреннем цикле inner: loop inner  ;Тело внутреннего цикла pop CX      ;Восстановим СХ перед командой loop loop outer LOOPE/LOOPZ Команда выполняет декремент содержимого регистра СХ и если оно не равно 0 и флаг ZF установлен осуществляет переход на указанную метку вперед или назад в том же программном сегменте в диапазоне –128…+127 байт. Содержимое регистра СХ рассматривается как целое число без знака, поэтому максимальное число повторений последовательности команд в цикле составляет 65536. LOOPNE/LOOPNZ Команда выполняет декремент содержимого регистра СХ и если оно не равно 0 и флаг ZF сброшен осуществляет переход на указанную метку вперед или назад в том же программном сегменте в диапазоне –128…+127 байт. Содержимое регистра СХ рассматривается как целое число без знака, поэтому максимальное число повторений последовательности команд в цикле составляет 65536. 5.10   Строковые команды Базовые строковые команды осуществляют элементарную операцию со строками байтов или слов, выполняя каждый раз действие только с одним элементом. При помощи этих команд могут быть обработаны строки длиной до 128 Кбайт. Сводная таблица строковых команд приведена ниже. Таблица 8 Строковые команды Строковые операции REP Повторение REPE Повторение, пока равно REPZ Повторение, пока нуль REPNE Повторение, пока не равно REPNZ Повторение, пока не нуль MOVS Строковая пересылка байта или слова MOVSB/ Строковая пересылка байта/слова MOVSW CMPS Строковое сравнение байта или слова SCAS Строковое сканирование байта или слова SCASB SCASW STOS Строковая загрузка байта или слова STOSB STOSW LODS Строковое сохранение байта или слова LODSB LODSW Строковая команда может иметь операнд-источник, операнд назначения или оба. Операнд-источник по умолчанию всегда находится в текущем сегменте данных. При использовании сегментного префикса это назначение может быть изменено. Операнд назначения всегда должен находиться в текущем дополнительном сегменте. Ниже в таблице показано использование регистров процессора в строковых командах. Таблица 9 Использование регистров в строковых командах SI Индекс (смещение) строки-источника DI Индекс (смещение) строки назначения CX Счетчик повторений AL/AX Значение сканирования Регистр назначения для LODS Регистр-источник для STOS Флаги DF 0 – автоинкремент SI, DI 1 – автодекремент SI, DI ZF Завершение сканирования/сравнения Строковые команды автоматически изменяют значение регистров SI и/или DI так, чтобы каждый из этих регистров указывал на очередной элемент строки. Значение флага направления DF определяет направление изменения содержимого регистров SI и DI. Если флаг направления сброшен (DF = 0) автоматически выполняется инкремент регистров SI и DI. При установленном флаге направления (DF = 1) автоматически выполняется декремент этих регистров. Если в команде используется префикс повторения, значение регистра CX уменьшается на 1 после выполнения каждой строковой команды. REP/REPE/REPZ/REPNE/REPNZ Префикс повторить/повторить пока равно/повторить пока нуль/повторить пока не равно/повторить пока не нуль определяет условие повторения строковой команды. Префикс REP используется в сочетании с командами MOVS (переслать строку) и STOS (сохранить строку). При этом он трактуется "Повторять, пока не кончилась строка" (СХ не нуль). Префиксы REPE и REPZ совершенно идентичны. Они используются с командами CMPS (сравнить строку) и SCAS (просканировать строку) и действуют точно так же, как префикс REP, однако перед каждым следующим повторением проверяется состояние флага нуля (ZF). Если флаг взведен, команда повторяется, если флаг сброшен, повторения не будет. Префиксы REPNE и REPNZ также идентичны. Они совпадают с префиксами REPE и REPZ, однако действие флага ZF на них прямо противоположно. MOVS (строка назначения),(строка-источник) Команда MOVS (переслать строку) пересылает байт или слово из операнда-источника (адресуемого регистром SI) в операнд назначения (адресуемый регистром DI) и изменяет содержимое этих регистров так, чтобы каждый указывал на следующий элемент строки. При использовании этой команды вместе с префиксом повторения осуществляется блочная пересылка память-память. Операнды, указанные в команде определяют только формат пересылаемой единицы данных (байт или слово). MOVSB, MOVSW Команды MOVSB (переслать строку байтов) и MOVSW (переслать строку слов) полностью соответствуют команде MOVS, но не имеют операндов, так как формат пересылаемых данных явно указан в мнемонике команды (MOVSB – байты, MOVSW – слова). CMPS (строка назначения),(строка-источник) Команда CMPS (сравнить строки) вычитает байт или слово источника (адресуемого регистром SI) из байта или слова назначения (адресуемого регистром DI). Сами операнды при этом не меняются. Команда CMPS воздействует на флаги AF, CF, OF, PF, SF и ZF, а также изменяет содержимое регистров SI и DI так, чтобы каждый из них указывал на следующий элемент соответствующей строки. Действие команды CMPS на флаги аналогично действию команды CMP. Если команде CMPS предшествует префикс REPE или REPZ, операция трактуется так: "производить сравнение, пока не достигнут конец строки (СХ не равен нулю) и пока элементы строк равны". Если команде предшествует префикс REPNE или REPNZ – трактовка такова: "производить сравнение, пока не достигнут конец строки и элементы строк различны". SCAS (строка назначения) Команда SCAS (сканировать строку) вычитает элемент строки назначения (байт или слово), адресуемый регистром DI, из содержимого регистра AL (если строка состоит из байтов) или АХ (если строка состоит из слов). Содержимое элемента строки назначения и аккумулятора при этом остается неизменным. Команда SCAS воздействует на флаги AF, CF, OF, PF, SF и ZF, а также изменяет содержимое регистра DI так, чтобы он указывал на следующий элемент строки. Если команде SCAS предшествует префикс REPE или REPZ, операция трактуется так: "производить сравнение пока не достигнут конец строки (СХ не равен нулю) и пока элементы строки равны содержимому аккумулятора". Если команде предшествует префикс REPNE или REPNZ трактовка такова: "производить сравнение пока не достигнут конец строки и элементы строки не равны содержимому аккумулятора". LODS (строка-источник) Команда LODS (загрузка строки) пересылает элемент строки (байт или слово), адресуемый регистром SI в регистр AL или AX, и изменяет содержимое регистра SI так, чтобы он указывал на следующий элемент строки. STOS (строка назначения) Команда STOS (сохранение строки) пересылает (байт или слово) из регистра AL или AX в элемент строки, адресуемый регистром DI, и изменяет содержимое регистра DI так, чтобы он указывал на следующий элемент строки. Эта команда удобна для инициализации некоторой области памяти какой-либо константой. Пример 1. mov CX, 10 rep movs dest, source ;Команда movs выполняется 10 раз Пример 2. mov CX, 10 repе cmps dest, source ;Поэлементно сравниваются строки ;dest и source до тех, пока не будет просмотрено 10 пар ;элементов или ;пока процессор не обнаружит в строке ;dest элемент, не совпадающий с соответствующим ;элементом строки source Пример 3. cld mov CX, 10 repnе cmps dest, source   ;Найти совпадение jne not_found             ;Совпадение обнаружено? …                         ;Если да, то продолжить …                         ;обработку здесь … not_found …               ;Иначе, продолжить здесь … 5.11   Контрольные вопросы 1.  Из чего состоит программа на языке ассемблера? 2.  Чем отличаются операторы и директивы языка ассемблера? 3.  Что такое переменная и как ее можно интерпретировать? 4.  Для чего используются директивы размещения данных? 5.  Что такое константа и чем она отличается от переменной? 6.  Что определяет директива .MODEL? 7.  Назовите известные режимы адресации операндов. 8.  Что такое регистровая адресация операндов? 9.  Что такое косвенная регистровая адресация операндов? 10. Назовите основные арифметические команды языка ассемблера 11. Назовите основные команды управления процессором. 12. Какие существуют команды пересылки данных? 13. Назовите команды, предназначенные для логических вычислений. 14. Как можно организовать цикл с помощью команды LOOP? 15. Чем отличаются команды безусловного перехода от команд условного перехода? 16. Назовите основные команды для работы со стеком. 17. Как скопировать одну строку в другую? 18. Что выполняет команда TEST? 19. Для чего нужна команда CMP? Тема 6. Процедуры 6.1  Использование процедур Необходимость использования процедур возникает, как только программа становится большой и труднопонимаемой, и поэтому ее приходится разбивать на небольшие логические блоки. Процедура (или подпрограмма) представляет собой совокупность команд, которая написана один раз, но при необходимости может быть использована в любом месте программы. Процесс передачи управления из основной части программы в процедуру называется вызовом. При вызове процедуры микропроцессор исполняет ее команды, а затем возвращается к тому месту, откуда был сделан вызов. Команды, обеспечивающие исполнение процедур, должны выполнить следующие действия: · Сохранить содержимое указателя команд IP. Когда процедура выполнена, находившийся в этом указателе адрес (адрес возврата) используется процессором для возврата к месту вызова. · Заставить процессор начать выполнение процедуры. · Использовать сохраненное содержимое указателя команд IP для возврата в программу и обеспечить продолжение исполнения с этого места. На рисунке показан процесс вызова и исполнения процедуры из основной программы. Рисунок 16 Вызов процедуры Все эти действия выполняются двумя командами CALL и RET. Команда CALL передает управление внешней процедуре, предварительно сохранив в стеке информацию для последующего возврата в вызывающую процедуру при помощи команды RET. Команда CALL имеет различную форму записи в зависимости от типа вызываемой процедуры (дальняя или ближняя). Внутрисегментный вызов обычно называется ближним (NEAR), а межсегментный – дальним (FAR). Команда RET, которой завершается вызываемая процедура, должна иметь тот же тип (дальний или ближний), что и вызывающая процедуру команда CALL. Адрес вызываемой процедуры может быть задан непосредственно в команде CALL, в памяти или в регистре. Команды имеют следующий синтаксис. CALL (имя процедуры) RET (необязательное значение) Директивы Proc Endp отмечают начало и конец процедуры.  Описание процедуры в главной программе может иметь следующий вид. .CODE main PROC ;Главная программа mov AX, @Stack_ mov SS, AX mov AX, @Data mov DS, AX CALL Mysub mov AL, 0 mov AH, 4Ch ; MS DOS "exit" int 21h main ENDP mysub PROC        ;Подпрограмма … … RET mysub endp end main При внутрисегментной непосредственной команде CALL в стеке сохраняется текущее содержимое счетчика команд (IP), который указывает на первый байт следующей за CALL командой. Относительное смещение вызываемой процедуры содержится в самой команде (диапазон плюс - минус 32К). При внутрисегментной косвенной команде CALL в стеке сохраняется текущее содержимое счетчика команд (IP), который указывает на первый байт следующей за CALL командой. Относительное смещение вызываемой процедуры может содержаться в слове памяти или в 16-разрядном регистре. При межсегментной непосредственной команде CALL в стеке сохраняется текущее содержимое регистра CS, в регистр CS помещается значение сегмента из команды CALL, затем в стеке сохраняется текущее содержимое регистра IP, и в него записывается значение смещения из команды. При межсегментной косвенной команде CALL происходит то же, что описано выше, но значения сегмента и смещения берутся из памяти или из регистров, причем первое слово содержит смещение, а второе - сегмент вызываемой процедуры. Команда RET возвращает управление из вызванной процедуры команде, следующей за командой CALL. Если возврат осуществляется из ближней процедуры, возврат является внутрисегментным (содержимое регистра CS остается неизменным). При возврате из дальней процедуры возврат является межсегментным (из стека восстанавливаются значения CS и IP). Если в команде задано необязательное значение, команда RET добавляет это значение к указателю стека SP. Это позволяет пропускать параметры, передаваемые через стек перед командой CALL. 6.2  Передача параметров процедур в регистрах В языке ассемблера наиболее общим способом для передачи аргументов в подпрограмму является размещение аргументов в регистрах. Этот метод эффективен, поскольку вызванная подпрограмма может прямо использовать переданные значения, и при этом обращение к регистрам значительно быстрее, чем обращение к памяти. Таким образом, перед вызовом процедуры необходимо заполнить нужными значениями регистры, выбранные для передачи параметров. Например, если некоторая процедура SUM (суммирование элементов массива) требует, чтобы регистр ВХ содержал смещение массива, а СХ – количество элементов массива, то вызов процедуры должен производиться следующим образом. Пример. .DATA mas DW 2,3,54,6 .CODE mov BX, offset mas mov CX, 4 CALL SUM Процедура должна отвечать за защиту значений, размещенных в регистрах, от случайного изменения, чтобы вызывающая программа не столкнулась с неожиданным изменением состояния регистров. При написании процедур всегда необходимо сохранять и восстанавливать все регистры, которые могут изменяться в процедуре. Например, предыдущий пример можно дополнить следующим образом. Пример. .DATA mas DW 2,3,54,6 .CODE push BX push CX mov BX, offset mas mov CX, 4 CALL SUM pop CX pop BX   Для возвращения значения, вычисляемого подпрограммой, также можно использовать определенный регистр. В таком случае этот регистр нельзя помещать в стек и извлекать из стека, поскольку возвращаемое процедурой значение будет потеряно. Например, в предыдущий пример для возврата значения суммы элементов массива можно использовать регистр АХ. Пример. SUM PROC      ;Подпрограмма xor AX,AX L1: add AX,[BX] add BX,2 loop L1 RET SUM endp   6.3  Контрольные вопросы 1.  Что такое процедура? 2.  Для чего используется процедура? 3.  Как описать процедуру в программе? 4.  Как вызвать процедуру в головной программе? 5.  Какие действия выполняет команда RET? 6.  Как можно передать параметры процедуре? Тема 7. Прерывания 7.1  Команды прерывания Различают два вида прерываний – аппаратные прерывания и программные прерывания. Аппаратное прерывание – это сигнал от любого устройства системы для процессора, который по этому сигналу должен обслужить данное устройство. Программное прерывание создается программами BIOS или DOS для вызова сервисных подпрограмм. Программное прерывание вырабатывается специальной микросхемой – контроллером прерываний, который посылает сигнал процессору на приостановку выполнения текущей программы и переход к выполнению программы прерывания. Команды прерывания позволяют вызывать процедуры обслуживания прерываний из программ так же как это сделало бы устройство. Программные прерывания имитируют действие аппаратных прерываний. INT (тип прерывания) Команда INT (прерывание) инициирует выполнение процедуры обработки прерывания, определенного в операнде "тип прерывания". Эта команда сохраняет в стеке регистр флагов, очищает флаги TF и IF для запрещения пошагового выполнения и маскируемых прерываний. Флаги сохраняются в том же формате, что и в команде PUSHF. Затем в стеке сохраняется текущее содержимое регистра сегмента кода CS, вычисляется адрес вектора прерывания путем умножения "типа прерывания" на четыре, и второе слово этого вектора помещается в регистр сегмента кода CS. Далее в стеке сохраняется текущее содержимое счетчика команд IP, и в этот регистр записывается первое слово вычисленного вектора прерывания. Рисунок 17 Вызов обработчика прерывания INTO Команда INTO (прерывание при переполнении) генерирует программное прерывание, если установлен флаг переполнения (OF), в противном случае управление передается следующей команде. Вектор прерывания INTO расположен по адресу 10h. Действие этой команды аналогично действию команды INT. IRET Команда IRET (возврат из прерывания) возвращает управление в точку, откуда прерывание было вызвано, заполняя из стека регистры IP, CS и регистр флагов. Команда IRET используется для выхода из процедур обработки как программных, так и аппаратных прерываний. При написании программ для 16-разрядного режима можно использовать прерывание int 21h, предназначенное для вызова функций DOS. Существует около 90 различных функций. Номер функции предварительно помещается в регистр AH. Каждая функция использует входные параметры, передающиеся через регистры, которые должны быть проинициализированы перед вызовом прерывания int 21h. Рассмотрим несколько групп функций DOS: функции ввода, функции вывода, функции даты и времени. 7.2  Функции вывода Рассмотрим некоторые функции DOS, которые используются для вывода символьной информации на экран. Далее указывается номер функции и описание функции с примером использования. Средства DOS позволяют выводить на экран только черно-белый текст, возможности позиционирования текста на экране ограничиваются использованием символов возврата каретки (0Dh) и перевода строки (0Ah). Вывод символа (02h) Функция посылает символ на стандартное устройство вывода. В регистр DL помещается выводимый символ. Регистр AL модифицируется системой DOS. Если в процессе вывода символа на экран с клавиатуры поступает код -C, срабатывает стандартная процедура обработки этого прерывания и вывод прекращается (как и программа в целом) Пример. mov AH, 2h    ;Выбор функции 2 mov DL,’*’    ;Отображаемый символ int 21h       ;Вызов DOS для исполнения Прямой вывод (06h) Функция может читать из стандартного входного устройства или выводить на стандартное устройство, при этом исключает стандартная реакция системы на ввод -C. В случае вывода код ASCII передаваемого символа засылается в регистр DL, при вводе DL=FFh. Пример. mov AH, 6h    ;Выбор функции 6 mov DL,’*’    ;Отображаемый символ int 21h       ;Вызов DOS для исполнения Вывод строки (09h) Функция передает строку символов на стандартное устройство вывода. В регистр DX помещается смещение строки. Строка должна оканчиваться символом доллара ($). Управляющие символы (табуляция, возврат каретки) распознаются системой DOS. Если в процессе вывода сообщения на экран с клавиатуры поступает код -C, срабатывает стандартная процедура обработки этого прерывания и вывод прекращается (как и программа в целом) Пример. mov AH, 9h            ;Выбор функции 9 mov DX,offset string  ;Адрес строки int 21h               ;Вызов DOS .DATA string DB ‘Строка 1’,0dh,0Ah,’$’ 7.3  Функции ввода Рассмотрим некоторые функции DOS, которые используются для ввода символьной информации с клавиатуры. Далее указывается номер функции и описание функции с примером использования. Фильтрующий ввод с дублированием на экране (01h) Функция ожидает, пока символ будет считан с устройства ввода, посылает символ на стандартный выход (дисплей) и сохраняет его в регистре AL. Если символ уже находится в буфере клавиатуры, то оно сразу пересылается в регистр AL. Пользователь может прекратить ввод нажатием комбинации клавиш CTRL+Break. Пример. mov AH, 1h            ;Выбор функции 1 int 21h               ;Вызов DOS mov char, AL          ;Сохранение символа   Прямой ввод без ожидания (06h) Функция не ожидает поступления очередного символа, а сама обращается в стандартному входному буферу за следующим символом. Комбинация клавиш CTRL+Break неактивна. Перед вызовом прерывания в регистр DL необходимо поместить значение 0FFh. Если обнаружен символ во входном буфере, то он перемещается в регистр AL и флаг ZF сбрасывается. Если символ не обнаружен, то ZF=1. Пример. mov AH, 6h            ;Выбор функции 6 mov DL, 0FFh          int 21h               ;Вызов DOS Прямой ввод с неактивной CTRL+Break (07h) Функция ожидает нефильтрованный символ со стандартного входа без эхо-символа. Комбинация клавиш CTRL+Break неактивна. Регистр AL содержит вводимый символ. Пример. mov AH, 7h            ;Выбор функции 7 int 21h               ;Вызов DOS Прямой ввод с активной CTRL+Break (08h) Функция ожидает нефильтрованный символ со стандартного входа без эхо-символа. Комбинация клавиш CTRL+Break активна. Регистр AL содержит вводимый символ. Буферизованный ввод (0Аh) Функция 0Аh считывает строку символов размером до 255 символов со стандартного входа и сохраняет ее в буфере. Клавиша может использоваться для стирания символов и возврата курсора. Пользователь может прервать ввод нажатием клавиши . Все вводимые символы отображаются на экране. Не пропускаются нажатие клавиш, которые не создают символы ASCII. Байт со смещением 0 содержит максимальное число символов, которое можно ввести, включая клавишу . В байте со смещением 1 сохраняется количество введенных символов. Сами символы будут размещены в буфере со смещением 2. Пример. .DATA keyboard LABEL BYTE maxkeys DB 32 charsinput DB ? buffer DB 32 dup (0) .CODE … mov DX,offset keyboard mov AH, 0Ah       ;Выбор ввода с консоли int 21h           ;Вызов DOS Получение статуса ввода (0Вh) Функция 0Вh проверяет стандартный буфер ввода на наличие в нем символов. Если есть символ, то регистр AL=0FFh, в противном случае AL=0. Пример. mov AH, 0Вh       ;Проверка статуса ввода int 21h           ;Вызов DOS Чтение из файла или входного устройства (3Fh) Функция может использоваться для чтения строки символов из файла или входного устройства. Регистр DX содержит смещение входного буфера, размер которого больше или равен значению величины, помещенной в регистр СХ. Регистр ВХ определяет стандартное входное устройство или индекс файла. Для стандартной клавиатуры значение регистра ВХ=0. В регистре СХ находится значение максимального количества байтов для чтения. В регистре АХ возвращается число реально считанных символов. Функция может считывать символы и прекращает работу при нажатии клавиши . Пример. .DATA buffer DB 127 dup (0) .CODE … mov AH, 3Fh       ;Чтение из файла/консоли mov BX,0 mov CX,127 mov DX,offset buffer int 21h           ;Вызов DOS Клавиши, не имеющие соответствующего кода ASCII, называются управляющими клавишами. В их число входят клавиши перемещения курсора, клавиши , , , и другие. При нажатии управляющей клавиши первым символом, помещаемым во входной буфер, будет 00h. Чтобы получить скан-код нажатой клавиши, необходимо получить из буфера еще один символ. Пример 1. mov AH, 07h       ;Функция ввода с консоли int 21h           ;Вызов DOS, AL=0 int 21h           ;AL содержит скан-код mov scan, AL   Пример 2. Ожидание ввода пробела loop1: mov ah,7 ; нефильтр. ввод без эха int 21h cmp al,' ' ; Пробел ? jnz loop1 ; Нет ! 7.4  Функции DOS даты/ времени Рассмотрим функции DOS для работы с датами и временем. Получение даты (2Аh) Функция возвращает текущую системную дату, помещая год в регистр СХ, а номер месяца – в регистр DH. Номер дня помещается в регистр DL, а день недели – в регистр AL. Для дней недели используются числовые обозначения: 0 – воскресенье, 1 – понедельник и т.д. Пример. mov AH, 2Аh       int 21h           mov year, CX mov month, DH mov day, DL mov dayofweek, AL   Установка даты (2Вh) Функция устанавливает текущую системную дату, используя те же регистры, что и для функции 2Ah. Функция возвращает значение 0 в регистр AL, если изменение прошло успешно, или значение 0FFh, если данные не были изменены. Пример. mov AH, 2Вh       mov CX, year mov DH, month mov DL, day mov AL, dayofweek int 21h           cmp AL, 0 jne baddate   Получение времени (2Сh) Функция возвращает текущее системное время, помещая часы в регистр CH, минуты – в регистр CL, секунды – в DH и сотые доли секунд – в DL. Пример. mov AH, 2Сh       int 21h           mov hours, CH mov minutes, CL mov seconds, DH Установка времени (2Dh) Функция устанавливает текущее системное время, используя те же регистры, что и для функции 2Сh. Функция возвращает значение 0 в регистр AL, если изменение прошло успешно, или значение 0FFh, если данные не были изменены. Пример. mov AH, 2Dh       mov CH, hours mov CL, minutes mov DH, seconds int 21h cmp AL, 0 jne badtime 7.5  Ввод и вывод числовой информации Арифметические команды могут обрабатывать четыре типа чисел – беззнаковые двоичные, знаковые двоичные, беззнаковые упакованные десятичные и беззнаковые неупакованные десятичные. Двоичные числа могут быть 8- и 16-разрядными. Десятичные упакованные числа содержат в байте две цифры, неупакованные – одну. Упакованные десятичные числа содержат в каждом байте две десятичных (0 – 9) цифры. В старшем полубайте содержится старшая значащая цифра, в младшем – младшая. Каждая десятичная цифра представляется в двоичном (или, что то же самое, в шестнадцатеричном) коде. Диапазон представления упакованных десятичных чисел в байте 0 – 99. Сложение и вычитание упакованных десятичных чисел осуществляется в два этапа. Сначала байты складываются или вычитаются как беззнаковые двоичные числа, а затем соответствующая команда коррекции приводит результат к виду правильного упакованного десятичного числа. Команды коррекции для умножения и деления упакованных десятичных чисел отсутствуют. Неупакованные десятичные числа содержат в байте одну десятичную цифру в младших четырех разрядах. Старшие четыре разряда должны быть нулями. Ниже приведена арифметическая интерпретация 8-разрядных двоичных чисел. Таблица 10 Шестнадца-теричный код Двоичный код Беззнаковое двоичное Знаковое двоичное Неупакован-ное десятичное Упакован-ное десятичное 07 00000111 7 +7 7 7 89 10001001 137 -119 недействит. 89 С5 11000101 197 -59 недействит. недействит. Неупакованное десятичное число легко может быть преобразовано в ASCII-представление соответствующей цифры. Для этого в старший байт неупакованного десятичного числа следует поместить значение 3. Рассмотрим команды для работы с этими форматами чисел. ААА Команда ААА (коррекция сложения неупакованных десятичных чисел) приводит содержимое регистра AL к виду правильного неупакованного десятичного числа, старший полубайт при этом обнуляется. Команда ААА изменяет значение флагов FC и AC; содержимое флагов OF, PF, SF и ZF после выполнения команды ААА неопределено. Пример. mov AX, 0605h ;неупакованное десятичное 65 add AL, 09h   ;AХ=060Eh aaa           ;AX=0704h DAA Команда DAA (десятичная коррекция сложения) приводит содержимое регистра AL к виду правильного упакованного десятичного числа после предшествующей команды сложения. Команда DAA изменяет значение флагов AF, CF, PF, SF и ZF; содержимое флага OF после выполнения команды DAA не определено. Пример. mov AL, 87h   ;упакованное десятичное 87 add AL, 04h   ;AL=8Bh daa           ;AX=91h AAS Команда AAS (коррекция вычитания неупакованных десятичных чисел) корректирует результат предшествующего вычитания двух правильных неупакованных десятичных чисел. Операндом назначения в команде вычитания должен быть регистр AL. Команда AAS приводит значение в AL к виду правильного неупакованного десятичного числа; старший полубайт при этом обнуляется. Если результат вычитания оказывается меньше 0, выполняется декремент содержимого регистра АН. AAS воздействует на флаги AF и CF; Значение флагов OF, PF, SF и ZF после выполнения команды AAS не определено. Пример. mov AX, 0708h mov CL, 09h sub AL, CL    ;AX=07FFh, CF=1 aas           ;AX=0609h DAS Команда DAS (десятичная коррекция вычитания) корректирует результат предшествующего вычитания двух правильных упакованных десятичных чисел. Операндом назначения в команде вычитания должен быть регистр AL. Команда DAS приводит значение в AL к виду двух правильных упакованных десятичных чисел. Команда DAS воздействует на флаги AF и CF. Значение флагов OF, PF, SF и ZF после выполнения команды DAS не определено. Пример. mov AL, 55h   sub AL, 19h   ;AL=3Ch das           ;AL=36h ААМ Команда ААМ (коррекция умножения неупакованных десятичных чисел) приводит результат предшествующего умножения к двум правильным неупакованным десятичным цифрам. Для получения правильного результата после выполнения коррекции старшие полубайты умножаемых операндов должны быть нулевыми, а младшие должны быть правильными двоично-десятичными цифрами. Команда ААМ воздействует на флаги PF, SF и ZF. Содержимое флагов AF, CF и OF после выполнения команды ААМ неопределено. Пример. mov AL, 08h   mov CL, 07h mul CL        ;AX=0038h=56 aam           ;AL=0506h AAD Команда AAD (коррекция деления неупакованных десятичных чисел) модифицирует содержимое регистра AL перед выполнение деления так, чтобы при выполнении деления в частном получилось правильное неупакованное десятичное число. Для получения правильного результата после выполнения деления содержимое регистра AH должно быть нулевым. Команда ААD воздействует на флаги PF, SF и ZF. Содержимое флагов AF, CF и OF после выполнения команды ААD неопределено. Пример. mov AX, 0207h mov DL, 06h aad           ;AX=001Bh=27 div DL        ;AX=0304h   Пример 1. Вывод неупакованного десятичного числа на экран mov AX, 0605h ;неупакованное десятичное 65 add AL, 09h   ;AХ=060Eh aaa           ;AX=0704h or AX, 3030h mov DL,AH ;Отображаемый символ push AX mov AH, 6h    ;Выбор функции 6 int 21h       ;Вызов DOS для исполнения pop AX mov DL,AL ;Отображаемый символ mov AH, 6h    ;Выбор функции 6 int 21h       ;Вызов DOS для исполнения Пример 2. Вывод упакованного десятичного числа на экран mov AL, 65h   ;упакованное десятичное 65 add AL, 09h   ; daa           ;AL=74h push AX sar AL, 4 or AL,30h mov DL,AL ;Отображаемый символ mov AH, 6h    ;Выбор функции 6 int 21h       ;Вызов DOS для исполнения pop AX and AL,0Fh or AL, 30h mov DL,AL ;Отображаемый символ mov AH, 6h    ;Выбор функции 6 int 21h       ;Вызов DOS для исполнения 7.6  Контрольные вопросы 1.  Чем отличаются аппаратные и программные прерывания? 2.  Что такое обработчик прерывания? 3.  Каково назначение команды INT 21h? 4.  Какие подпрограммы в прерывании 21h обеспечивают вывод одного символа на консоль? 5.  Как можно ввести строку символов с клавиатуры? 6.  Как можно установить новые системные дату и время? ЛИТЕРАТУРА 1.  Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера. – М.: Радио и связь. 1991. 2.  Галисеев Г. В. Самоучитель. Ассемблер IBM PC. – М., СПб, Киев: Диалектика. 2004. 3.  Финогенов К.Г. Самоучитель по системным функциям MS-DOS. – М.: Малип. 1993. 4.  Белецкий Я. Турбо Ассемблер. Версия 2.0. – М.: Машиностроение. 1994. 5.  Степаненко О.С Персональный компьютер. Учебный курс. – М., СПб, Киев: Диалектика. 2002. 6.  Данкан Р. Профессиональная работа в MS-DOS. – М.: Мир. 1993. 7.  Джодейн Р. Справочник программиста персональных компьютеров IBM PC, XT и АТ. – М.: Финансы и статистика. 1992.
«Аппаратное обеспечение современного компьютера. Архитектура современного компьютера» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Помощь с рефератом от нейросети
Написать ИИ

Тебе могут подойти лекции

Смотреть все 588 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot