Вы находитесь на странице: 1из 56

К.П. ВАХЛАЕВА, А.Н.

САВИН,
А.Г. ФЕДОРОВА

ОРГАНИЗАЦИЯ
И ПРОГРАММНАЯ МОДЕЛЬ
ПРОЦЕССОРА INTEL 8086

Учебное пособие для студентов высших учебных заведений,


обучающихся по направлениям
«Информатика и вычислительная техника», «Фундаментальная
информатика и информационные технологии», «Математическое
обеспечение и администрирование информационных систем»,
«Программная инженерия»

Саратов
ООО Издательский Центр «Наука»
2013
УДК 004.31(072.8)
ББК 32.973.26-02я73
В 22

Вахлаева К.П., Савин А.Н., Федорова А.Г.

В 22 Организация и программная модель процессора Intel 8086:


Учеб. пособие. – Саратов: ООО Издательский Центр «Наука», 2013. – 56 с.

ISBN 987-5-9999-1585-6

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


практических занятий, проводимых авторами в Саратовском государственном
университете им. Н.Г. Чернышевского. В пособии приведены сведения об
архитектуре компьютеров IBM PC. Рассмотрена организация и программная
модель процессора Intel 8086.
Пособие предназначено для студентов высших учебных заведений,
изучающих дисциплины «Архитектуры вычислительных систем», «Машинно-
зависимые языки программирования».

Рекомендует к печати:

кафедра информатики и программирования


Саратовского государственного университета
им. Н.Г. Чернышевского

Рецензент:

кандидат физ.-мат. наук, доцент А.С. Иванов

Работа издана в авторской редакции

УДК 004.31(072.8)
ББК 32.973.26-02я73

ISBN 987-5-9999-1585-6
© К.П. Вахлаева, 2013
© А.Н. Савин, 2013
© А.Г. Федорова, 2013

2
Предисловие
В основу учебного пособия положены материалы лекций, семинарских и
практических занятий, проводимых авторами в Саратовском государственном
университете им. Н.Г. Чернышевского со студентами факультета
компьютерных наук и информационных технологий, обучающимися по
направлениям «Информатика и вычислительная техника», «Фундаментальная
информатика и информационные технологии», «Математическое обеспечение и
администрирование информационных систем», «Программная инженерия».
При написании пособия авторами использованы источники, приведенные в
списке литературы.
Эффективная разработка программ для ЭВМ предполагает знание ее
архитектуры, структуры процессора, его программной модели, системы команд
и принципов их выполнения.
Программист в ходе разработки программ должен уметь адаптировать и
подбирать алгоритмы именно под конкретное аппаратное обеспечение.
Успешное решение данной задачи требует от программиста знания
архитектуры ЭВМ, четкого представление структуры узлов ЭВМ, понимания
принципов выполнения машинных команд. Как правило, получение этих
знаний связано с отслеживанием исполнения машинных инструкций с
использованием специализированных программ, называемых отладчиками.
Отладчики обеспечивают прямой доступ к устройствам, памяти и командам
ЭВМ и соответственно позволяют понять принципы работы процессора, роль
регистров и порядок выполнения команд. В данном пособии с помощью
отладчика DEBUG компании Microsoft изучается программная модель и
система команд процессора Intel 8086, на основе которого построены ЭВМ с
архитектурой IBM PC.
Материал в пособии излагается таким образом, что после ознакомления с
теоретической частью каждого раздела студентам необходимо выполнить свой
вариант практического задания, используя при этом информацию из
предыдущих разделов. Такой подход способствует эффективному изучению
студентами архитектуры компьютеров IBM PC, а также структуры и принципов
функционирования процессора Intel 8086.
Авторы выражают свою глубокую признательность канд. физ.-мат. наук,
доценту А.С. Иванову за сделанные при рецензировании учебного пособия
замечания, способствующие улучшению его содержания.

3
1. Лабораторная работа №1 «Архитектура IBM PC-совместимого
персонального компьютера. Отладчик DEBUG»
Цель работы:
 Изучение архитектуры процессора Intel 8086.
 Изучение возможностей системного отладчика DEBUG.
Краткие теоретические сведения:
1.1. Архитектура компьютеров IBM PC
Современная промышленность выпускает много различных типов
компьютеров. Их структурные схемы принципиально мало различаются: у всех
компьютеров есть оперативная память, процессор, источник питания, внешние
устройства. Различными являются способы, средства и используемые ресурсы,
с помощью которых компьютер функционирует как единый механизм.
Оценку возможностей конкретной модели компьютера и его
отличительные особенности от компьютеров других типов удобно проводить,
сравнивая их архитектуры, характеризующие компьютеры с точки зрения их
функциональных свойств.
Понятие архитектуры возникло с середины 60-х годов, когда
существенно изменился подход к созданию ЭВМ. Вместо независимой
разработки аппаратуры и некоторых средств математического обеспечения
стала проектироваться система, состоящая из совокупности аппаратных
(hardware) и программных (software) средств. При этом на первый план
выдвинулась концепция их взаимодействия. Так возникло принципиально
новое понятие – архитектура ЭВМ.
Под архитектурой ЭВМ понимается совокупность общих принципов
организации аппаратно-программных средств и их характеристик,
определяющая функциональные возможности ЭВМ при решении
соответствующих классов задач.
Основные компоненты архитектуры ЭВМ можно представить в виде
схемы [1], показанной на рис. 1.
Архитектура ЭВМ

Аппаратные средства Программное обеспечение Вычислительные и


логические возможности

Структура ЭВМ Системное ПО Система команд


Организация памяти (операционная система, Форматы данных
Организация ввода/вывода средства программирования) Быстродействие
Прикладное ПО

Рис. 1. Основные компоненты архитектуры ЭВМ.


В основе современных компьютеров IBM PC лежит архитектура,
предложенная Джоном фон Нейманом в 1946 г. при создании электронной

4
вычислительной машины (ЭВМ) EDVAC (Electronic Discrete Variable Automatic
Computer).
Основные принципы концепции Джона фон Неймана следующие [2]:
 Компьютер должен состоять из следующих модулей: управляющий блок,
арифметический блок, память, блоки ввода/вывода (см. рис. 2).
 Строение компьютера не должно зависеть от решаемой задачи.
 Инструкции и их операнды (то есть данные) должны храниться в той же
памяти (Гарвардская концепция компьютеров, основанная на концепции фон
Неймана, предполагает отдельную память для программы и данных).
 Память делится на ячейки одинакового размера, порядковый номер ячейки
считается ее адресом (1 ячейка равна 1 байту).
 Программа состоит из серии элементарных инструкций, которые обычно не
содержат значения операнда (указывается только его адрес), поэтому
программа не зависит от обрабатываемых данных (это уже прототип
переменных). Инструкции выполняются одна за другой, в том порядке, в
котором они находятся в памяти (современные микропроцессоры позволяют
осуществлять параллельное выполнение нескольких инструкций).
 Для изменения порядка выполнения инструкций используются инструкции
условного или безусловного перехода.
 Инструкции и данные (то есть операнды, результаты или адреса)
представляются в виде двоичных сигналов и в двоичной системе счисления.
Внешнее
запоминающее
устройство (ВЗУ)

Процессор
Арифметико- Управляющее
Устройство логическое устройство Устройство
ввода устройство (УУ) вывода
(АЛУ)

Оперативное
запоминающее
устройство (ОЗУ)
Рис. 2. Архитектура ЭВМ, построенной по принципам фон Неймана:
сплошные линии со стрелками указывают направление потоков информации,
пунктирные – управляющих сигналов от процессора к остальным узлам ЭВМ.
1.2. Процессор Intel 8086
Развитие микроэлектроники в 70-е годы привело к созданию
интегральных схем и в 1978 г. компания Intel выпустила 16-разрядный
процессор Intel 8086. Процессор функционировал на частотах 5–10 МГц и
5
благодаря 20-разрядной шине адреса позволял адресовать 1 Мб оперативной
памяти и 65536 устройств ввода/вывода. Процессор Intel 8086 работал в
реальном режиме (real mode) с выполнением только одной программы
одновременно и с действительной (real) адресацией сегментных регистров.
Этот процессор стал родоначальником семейства Intel 80x86, применявшегося в
персональных компьютерах с архитектурой IBM PC. Архитектура процессоров
семейства Intel 80x86 получила название x86.
В 1981 году на основе процессора Intel 8088 (функциональный аналог
процессора Intel 8086, но с 8-и разрядной шиной данных и 16-и разрядными
внутренними регистрами) и 8-и разрядной системной шины ISA (Industrial
Standard Architecture) компанией IBM был выпущен персональный компьютер
IBM PC XT. Это был полноценный персональный компьютер – с монитором,
клавиатурой и системным блоком. Его архитектура получила название IBM PC.
Дальнейшая модернизация архитектуры IBM PC неразрывно связана с
развитием процессоров семейства Intel 80x86.
Процессор Intel 8086 выполнен в виде микросхемы с 40 выводами.
Внешний вид микросхемы процессора Intel 8086 и ее условное графическое
изображение, используемое в принципиальных электрических схемах ЭВМ,
приведены на рис. 3, назначение выводов указано в табл. 1, структурная схема
показана на рис. 4. Подробную информацию о процессоре можно найти в [3, 4].

Рис. 3. Внешний вид и условное графическое изображение


микросхемы процессора Intel 8086 и его аналога – КР1810ВМ86.
6
Таблица 1.
Вывод Обозначение Тип Функциональное назначение
микросхемы вывода выводов
1,20 GND – Общий
2 – 16, A / D0  Вход/ Канал адреса данных
39 A / D15 выход*
17 NMI Вход Немаскируемый запрос прерывания
18 INT Вход Маскируемый запрос
прерывания
19 C Вход Тактовый сигнал
21 SR Вход Сигнал «Установка»
22 RDY Вход Сигнал «Готовность»
23 TEST Вход Сигнал «Проверка»
32 RD Выход* Сигнал «Чтение»
33 MN / MX Вход Режим минимального
максимального включения
34 ВНЕ / SA7 Выход Разрешение передачи по старшей
*

половине канала данных D15 –


D8/сигнал состояния
35 – 38 A19 /SA6;A18 /SA5; Выходы Канал адреса/сигналы состояния
*

A17 /SA4;A16 /SA3


40 UC C – Напряжение питания +5 В
24 INTAQS1 Выход Подтверждение прерывания
(сигналы состояния очереди
команд)
25 ALE QS 0  Выход Стробирующий сигнал адреса
(сигналы состояния очереди
команд)
26  
DEN SA0 Выход Разрешение передачи данных
*

(сигналы состояния цикла канала)


DT / R SA1 Выход Выдача/прием данных (сигналы
*
27
состояния цикла канала)
M / IOSA2 Выход Память/внешнее устройство
*
28
(сигналы состояния цикла канала)
WR LOCK  Выход Запись (канал занят)
*
29
30 HLDARQ / GT1 Выход Подтверждение захвата
(запрос/разрешение доступа к
магистрали)
31 
HLD RQ / GT 0  Вход Захват (запрос/разрешение доступа
к магистрали)

*
С тремя состояниями: вход, выход, «отключен».
7
Структура процессора Intel 8086 ориентирована на параллельное
выполнение функций выборки и команд: состоит из устройства сопряжения
канала (УСК), устройства обработки (УО) и устройства управления и
синхронизации.
____ _____
A/D15-A/D0 A19/SA6-A16/SA3 ВНЕ/SA7 ALE/QS0 INTA/QS1

___
Буферная схема RD
адреса/данных Устройство
управления и синхронизации ___ _____
WR(LOCK)
__ ___
Внутренняя магистраль (16) M/IO(SA2)
__ ___
DT/R(SA1)
Сумматор 1 ____ ___
адреса DEN(SA0)
CS 2 _____
DS Регистры TEST
3
очереди
SS
команд 4 RDY
ES
(6×8 разрядов)
IP 5 SR
Регистр
обмена 6
CLK

Магистраль команд (8)


INT

Внутренняя магистраль данных (16) NMI


УСК
УО HLDA
___ ___
AH AL Микропрог- 16-разрядное (RQ/GT1)
BH BL раммное арифметико-
HLD
CH CH устройство логическое ___ ___
DH DL управления устройство (RQ/GT0)
SP Регистр ___
BP
флагов MN/MX

SI
DI
Рис. 4. Структурная схема процессора Intel 8086.

8
Устройство сопряжение канала (в некоторых источниках называется
шинным интерфейсом) предназначено для формирования физического адреса
памяти, выборки команд из памяти и записи их в очередь команд, чтения
операндов команд из памяти или регистров ввода/вывода, записи результатов
выполнения команд в память или регистры ввода/вывода.
В УСК входят шесть 8-разрядных регистров очереди команд, четыре 16-
разрядных сегментных регистра, 16-разрядный регистр указателя команды, 16-
разрядный регистр обмена, 16-разрядный сумматор адреса.
Устройство обработки предназначено для выполнения операций по
обработке данных. Команды, выбранные из памяти и записанные в регистры
очереди команд УСК, по запросам от УО поступают через 8-разрядную
магистраль команд на микропрограммное устройство управления, которое
декодирует команды и вырабатывает соответствующую последовательность
микрокоманд, управляющую процессом выполнения текущей операции. УО не
имеет непосредственной связи с внешней магистралью системы и обменивается
данными через регистр обмена с УСК.
1.3. Программная модель процессора Intel 8086
Программирование любого компьютера на низкоуровневом языке
(например, на Ассемблере) требует знания того, какая часть компьютера
оставлена видимой и доступной для программирования на этом языке. Это так
называемая программная модель компьютера, частью которой является
программная модель используемого процессора.
Программная модель процессора Intel 8086 состоит из 14 полностью
доступных прикладным программам регистров, называемых поэтому
пользовательскими. К пользовательским относятся следующие группы
регистров.
Основные функциональные регистры:
 регистры общего назначения AX, BX, CX, DX, SP, BP, SI, DI;
 сегментные регистры CS, SS, DS, ES;
 указатель команд IP;
 регистр флагов FLAGS.
Как указано выше, пользовательские регистры программист без
ограничений может использовать при написании прикладных программ.
Восемь 16-битных регистров (подгруппа регистров общего назначения)
используются для хранения данных и адресов. Они имеют следующий формат:

9
H L
15 8 7 0
AX Аккумулятор
AH AL
BX База
Регистры BH BL
общего назначения

данных CX Счетчик
Регистры

CH CL
DX Данные
DH DL

SP Указатель стека
Указатели Указатель базы
BP
и индексные
регистры SI Индекс источника
DI Индекс приемника

Рис. 5. Формат регистров общего назначения процессора Intel 8086.


Программист может обращаться к различным частям этих регистров (см.
рис. 5). У регистров AX, BX, CX, DX отдельно доступны старшие и младшие 8-
битные части.
Большинство из регистров общего назначения могут использоваться при
программировании для хранения операндов практически в любых сочетаниях.
Но некоторые команды используют фиксированные регистры для выполнения
своих действий. Это позволяет более компактно кодировать машинное
представление команд.
Регистры общего назначения используются в процессоре Intel 8086
следующим образом:
 AX/AH/AL (Accumulator register) – аккумулятор. Применяется для хранения
промежуточных данных. Использование этого регистра обязательно в,
например, командах обмена данными с устройствами ввода и вывода (IN и
OUT);
 BX/BH/BL (Base register) – базовый регистр. Применяется для хранения
базового адреса некоторого объекта в памяти;
 CX/CH/CL (Count register) – регистр-счетчик. Применяется в командах,
производящих повторяющиеся действия (сдвигах и циклах). Например,
команда организации цикла LOOP кроме передачи управления команде,
находящейся по некоторому адресу, анализирует и уменьшает на единицу
значение регистра CX;
 DX/DH/DL (Data register) – регистр данных. Так же, как и регистр
AX/AH/AL, он хранит промежуточные данные. В некоторых командах его
использование обязательно, а для некоторых команд это происходит неявно.
Следующие два регистра используются для поддержки операций,
производящих последовательную обработку цепочек элементов, каждый из

10
которых может иметь длину 16 или 8 бит:
 SI (Source Index) – индекс источника. Этот регистр в цепочечных операциях
содержит текущий адрес элемента в цепочке-источнике;
 DI (Destination Index) – индекс приемника. Этот регистр в цепочечных
операциях содержит текущий адрес в цепочке-приемнике.
В архитектуре процессора Intel 8086 на программно-аппаратном уровне
поддерживается такая структура данных, как стек. Для работы с ним есть
специальные команды, а в программной модели процессора для этого
существуют специальные регистры:
 SP (Stack Pointer) – регистр указателя стека. Содержит указатель вершины
стека в текущем сегменте стека;
 BP (Base Pointer) – регистр указателя базы кадра стека. Предназначен для
организации произвольного доступа к данным внутри стека.
Процессор Intel 8086 аппаратно поддерживает структурную организацию
программы в виде трех частей, называемых сегментами кода, стека и данных
(такая организация памяти называется сегментной). Логика обработки
машинной команды построена так, что при выборке команды, доступе к
данным или к стеку неявно используются адреса в соответствующих
сегментных регистрах.
Для того чтобы указать на сегменты, к которым программа имеет доступ
в конкретный момент времени, в процессоре Intel 8086 есть четыре сегментных
регистра: CS, SS, DS, ES. В этих регистрах содержатся сегментные части
адресов памяти, с которых начинаются сегменты кода, стека и данных,
соответственно.
Формат сегментных регистров следующий:

CS Сегмент кода

Сегментные DS Сегмент данных


регистры SS Сегмент стека
ES Дополнительный сегмент
данных
Рис. 6. Формат сегментных регистров процессора Intel 8086.
Содержимое этих регистров задает значение базового адреса
соответствующего сегмента.
Рассмотрим подробнее назначение сегментов, поддерживаемых
процессором Intel 8086 (см. рис. 6):
 Сегмент кода – содержит машинные команды программы, к которым имеет
доступ процессор (то есть эти команды загружаются в его конвейер). Для
доступа к сегменту кода служит регистр CS (Code Segment).
 Сегмент стека – представляет собой область памяти, называемую стеком.
Работу со стеком процессор организует по принципу LIFO (последний
записанный в эту область элемент выбирается первым). Для доступа к
сегменту стека служит регистр SS (Stack Segment).

11
 Сегмент данных – содержит обрабатываемые текущей программой данные.
При этом алгоритмы выполнения большинства машинных команд неявно
предполагают, что обрабатываемые ими данные расположены в сегменте
данных. Для доступа к сегменту данных служит регистр DS (Data Segment).
 Дополнительный сегмент данных – если программе недостаточно одного
сегмента данных, то она имеет возможность использовать еще один
дополнительный сегмент данных. В отличие от основного сегмента данных,
адрес которого содержится в сегментном регистре DS, при использовании
дополнительного сегмента данных его адрес в команде требуется указывать
явно с помощью специальных префиксов переопределения сегментов. Адрес
дополнительного сегмента данных содержится в регистре ES (Extension data
segment register).
В группу основных функциональных регистров процессора Intel 8086
включены регистры, которые постоянно содержат информацию о состоянии,
как самого процессора, так и программы, команды которой в данный момент
загружены на конвейер. К этим регистрам относятся регистр указателя команды
IP и регистр флагов FLAGS. Используя эти регистры, можно получать
информацию о результатах выполнения команд и влиять на состояние самого
процессора.
Указатель команд IP (Instruction Pointer) представляет собой 16-
разрядный регистр (см. рис. 7), содержимое которого используется при
определении адреса следующей выполняемой команды. Смещение задается
относительно базового адреса сегмента кода, находящегося в регистре CS.

IP Регистр указателя команд

Рис. 7. Формат регистра указателя команд IP процессора Intel 8086.


Указатель команд IP непосредственно недоступен программисту. Его
содержимое изменяется автоматически при выполнении команд программы или
при выполнении команд передачи управления и обработке прерываний.
Регистр флагов FLAGS (рис. 8) содержит ряд битов, которые имеют
определенное функциональное назначение и называются флагами.

12
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF Флаги:
переноса
четности
вспомогательного переноса
нуля
знака
трассировки
разрешения прерывания
направления
переполнения

Рис. 8. Формат регистра флагов FLAGS процессора Intel 8086.


Исходя из функционального назначения, флаги регистра FLAGS можно
разделить на флаги состояния, управления и системные.
Флаги состояния CF, PF, AF, ZF, SF, OF отражают особенности
результата исполнения арифметических или логических операций. Это дает
возможность анализировать состояние вычислительного процесса и
реагировать на него с помощью команд условных переходов и вызовов
подпрограмм. Назначение флагов состояния следующее:
 CF (Carry Flag) – флаг переноса. Принимает значение CF=1 при
возникновении переноса из старшего разряда обрабатываемых операндов;
 PF (Parity Flag) – флаг паритета (четности). Принимает значение PF=1, если
младшие восемь разрядов результата содержат четное число единичных бит;
 AF (Auxiliary carry Flag) – вспомогательный флаг переноса (полупереноса).
Используется только для команд, работающих с двоично-десятичными
(BCD) числами. Принимает значение AF=1, если при выполнении операции
возникает перенос между младшими тетрадами обрабатываемых операндов
(из разряда 3 в разряд 4);
 ZF (Zero Flag) – флаг нуля. Принимает значение ZF=1 при нулевом
результате операции;
 SF (Sign Flag) – флаг знака. Принимает значение старшего (знакового)
разряда результата операции (SF=0 – положительное число, SF=1 –
отрицательное);
 OF (Overflow Flag) – флаг переполнения. Принимает значение OF=1 в случае
переполнения разрядной сетки при обработке операндов со знаком. При
этом в результате операции происходит перенос (заем) в (из) старшего,
знакового бита результата (биты 7 или 15 для 8- или 16-разрядных
операндов соответственно);
 DF (Direction Flag) – флаг направления. Устанавливается пользователем и
определяет порядок обработки строк символов при выполнении цепочечных
команд. Значение DF=0 вызывает автоматический инкремент содержимого
индексных регистров SI и DI после выполнения команды обработки
13
символа, а при DF=1 – декремент. Соответственно, обеспечивается
обработка символов от начала строки к концу (от младших адресов к
старшим), либо от конца строки к ее началу (от старших адресов к
младшим).
Системные флаги TF, IF устанавливаются операционной системой, которая
с их помощью определяет режимы выполнения ряда операций:
 TF (Trap Flag) – флаг трассировки. Предназначен для организации
пошаговой работы процессора. При значении TF=1 процессор
переключается в режим пошагового выполнения команд с реализацией
прерывания с номером 1 после каждой команды;
 IF (Interrupt Flag) – флаг разрешения прерывания. Значение IF=1 разрешает
обслуживание аппаратных прерываний, значение IF=0 – запрещает.
1.4. Сегментация памяти и вычисление адресов
Память логически организована как одномерный массив байтов, каждый
из которых имеет 20-разрядный физический адрес, который однозначно
определяет положение каждого байта в пространстве памяти емкостью
1 Мбайт=220=1048576 байт.
Для того чтобы 16-разрядный процессор смог обратиться в любую точку
20-разрядного адресного пространства, в нем предусмотрена сегментная
адресация памяти. Пространство памяти емкостью 1 Мбайт представляется как
набор сегментов. Сегмент состоит из смежных ячеек памяти и является
независимой и отдельно адресуемой единицей памяти емкостью
64 Кбайт=216=65536 байт. Начальные адреса четырех (по числу сегментных
регистров) сегментов, являющиеся адресом первого байта сегмента в
пространстве памяти, записываются в сегментные регистры CS, DS, SS и ES.
Сегмент всегда начинается на адресе, кратном 16, поэтому четыре младших
бита начального адреса сегмента всегда равны нулю, или, что тоже самое, в
шестнадцатеричной записи этих адресов последняя цифра всегда нулевая, то
есть они имеют вид xxxx0h, где x – любая цифра. Поэтому в сегментных
регистрах хранят только первые четыре шестнадцатеричные цифры начального
адреса сегмента, то есть старшие 16 битов.
Отметим, что взаимное расположение сегментов данных в памяти может
быть любым. Сегменты данных могут быть соседними (смежными),
неперекрывающимися, частично или полностью перекрывающимися.
Физическая ячейка памяти может принадлежать одному или нескольким
сегментам данных.
Полная информация, необходимая для определения физического адреса
ячейки памяти, содержится в адресной паре сегмент:смещение, которая
включает сегментную часть адреса или базовый адрес, и 16-разрядное
внутрисегментное смещение, определяющее расстояние от начала сегмента до
ячейки памяти. Для вычисления физического адреса процессор умножает
базовый адрес на 16, что эквивалентно сдвигу числа на четыре двоичных
разряда влево, и к полученному таким образом адресу сегмента прибавляет
смещение, как показано на рис. 9.
14
Сегмент Базовый адрес
xxxx xxxx xxxx xxxx 0000
+
Смещение xxxx xxxx xxxx xxxx

Физический адрес xxxx xxxx xxxx xxxx xxxx


Рис. 9. Вычисление физического адреса.
Сегменты по умолчанию, смещения и содержащие их регистры для
различных типов обращения к памяти приведены в табл. 2.
Таблица 2.
Тип обращения к памяти Сегмент Смещение
(по умолчанию)
Выборка команды CS IP
Стековая операция SS SP
Ячейка памяти DS исполнительный адрес (ИА),
вычисляемый в соответствии с
заданным способом адресации.1
Цепочка-источник DS SI
Цепочка-приемник ES DI
BP как базовый регистр SS ИА
Операнды команд, как правило, размещаются в текущем сегменте данных
и обращение к ним осуществляется по адресу DS:ИА. Однако программист
может обратиться к данным, находящимся в другом текущем сегменте с
помощью явного переопределения сегмента, например, указание «ES:» заменит
обычное использование регистра DS регистром ES.
1.5. Команды программы DEBUG для разработки и отладки программ в
машинных кодах и в мнемокодах
Программа DEBUG обеспечивает интерактивную отладку программ в
формате .ЕХЕ- и .СОМ-файлов. Для запуска отладчика DEBUG из командной
строки следует набрать debug и, если необходимо, имя файла, с которым мы
будем работать, например debug prog.com. Появление на экране символа-
приглашения в виде дефиса свидетельствует о готовности программы DEBUG
для приема команд. После набора каждой команды следует нажимать <Enter>.
Основные правила использования программы DEBUG:
 DEBUG не различает строчные и заглавные буквы.
 DEBUG воспринимает все вводимые числа как шестнадцатеричные, поэтому
вводить завершающую букву h не нужно.
 Пробелы используются в командах только для разделения параметров.

1
Способы адресации рассматриваются в лаб. р. №2.
15
 Регистры CS, DS, ES и SS будут инициализированы адресом 256-байтового
(100h) префикса программного сегмента (Program Segment Prefix, PSP) и
рабочая область памяти начинается с адреса PSP+100h. На рис. 10 приведена
screen-копия окна программы DEBUG после выполнения команды
просмотра содержимого регистров R (Registers). Из-за различий в
конфигурациях компьютеров содержимое регистров на вашей машине
может отличаться от приведенного на рисунке. Заметьте, что регистры CS,
DS, ES и SS содержат один и тот же адрес сегмента, потому что DEBUG
рассматривает весь введенный код как программу .СОМ, хранящую данные,
стек и код в одном сегменте. Регистр IP должен показывать 0100, указывая,
что выполнение инструкций начинается со смещения 100h с учетом размера
PSP.

Рис. 10. Просмотр начального состояния регистров, флагов и следующей


выполняемой инструкции с помощью команды R.
 DEBUG отображает значения флагов следующим образом [5, 6, 7]:
Таблица 3.
Используемые отладчиком DEBUG мнемокоды значений флагов
Флаг Имя флага Установлен Сброшен
OF Переполнение (да/нет) OV NV
DF Направление (уменьш./увелич.) DN UP
IF Прерывания (вкл./откл.) EI DI
SF Знак (отриц./полож.) NG PL
ZF Нуль (да/нет) ZR NZ
AF Вспомогательный перенос (да/нет) АС NA
PF Четность (четн./нечетн.) РЕ PO
CF Перенос (да/нет) CY NC
 Ссылка на память может задаваться в виде сегмент:смещение, например,
DS:120, или в виде только смещения, например, 120. Можно также
напрямую обращаться к адресам в памяти, например, 0040:0017,
воспринимается как сегмент 40[0]h (то есть 400, с отброшенным младшим
шестнадцатеричным разрядом) плюс смещение 17h.
 DEBUG реализует пошаговый режим исполнения, показывая машинный код
и соответствующий ему ассемблерный мнемонический код, определенный
DEBUG из машинного кода. Например, по адресу xxxx:0100 может
находиться код 3C3D, которому соответствует команда CMP AL,3D,
выполняющая сравнение двух числовых величин, одна из которых хранится
в регистре AL.

16
 Нажатие клавиши F1 в окне отладчика воспроизводит последнюю команду
по одной букве за нажатие, а F3 – целиком.
Набор команд программы DEBUG позволяет выполнять такие полезные
операции, как просмотр, ввод в память и пошаговое выполнение программы.
Далее в алфавитном порядке перечислены необходимые нам команды DEBUG:
A (Assemble)
Переводит DEBUG в режим приема ассемблерных команд и трансляции
их в машинные коды. Операция особенно полезна при написании и
тестировании маленьких программ на ассемблере и для изучения небольших
фрагментов кода. Адрес начала кода по умолчанию – CS:0100.
Формат команды:
A [адрес]
где адрес по умолчанию равен 100h.
DEBUG поддерживает следующие возможности:
 определение элементов данных с помощью команд DB и DW;
 операнд в квадратных скобках, например, [12E], указывает адрес (смещение)
в памяти;
 оператор PTR можно использовать для указания байта или слова, например,
MOV WORD PTR [120],25.
Можно применять все виды косвенной адресации с использованием
регистров, например, [BP+DI] или 25[BX].
Ниже приведен пример создания маленькой ассемблерной программы из
пяти инструкций, при этом DEBUG указывает адрес сегмента кода (показанный
в виде хххх:) и смещения, начиная со 100h:
A 100 <Enter>
xxxx:0100 MOV CX,[10D] <Enter> ; Поместить в CX значение из DS:10D
xxxx:0104 ADD CX,1A <Enter> ; Прибавить к содержимому CX
; непосредственное значение 1A
xxxx:0107 MOV [10D],CX <Enter> ; Поместить содержимое CX в DS:10D
xxxx:010B JMP 100 <Enter> ; Вернуться к началу программы
xxxx:010D DW 2500 <Enter> ; Определение элемента данных
; по адресу DS:10D
<Enter>
С учетом размера PSP DEBUG устанавливает IP равным 100h, и
инструкции программы начинаются с этого адреса. Последнее нажатие <Enter>
(два <Enter> подряд) указывает DEBUG, что ввод программы завершен. Теперь
можно при необходимости использовать команды U (Unassemble) для
просмотра машинного кода или T (Trace) для наблюдения за выполнением
программы.
Можно заменять любые введенные команды или элементы данных, при
условии, что инструкции или элементы будут иметь ту же длину. Например,
чтобы заменить инструкцию ADD, расположенную по адресу 104h, на SUB,
введите

17
A 104 <Enter>
xxxx:0104 SUB CX,1A <Enter> <Enter>
D (Display или Dump)
Выводит на экран содержимое указанной области памяти в
шестнадцатеричной и ASCII-формах. Регистр по умолчанию – DS.
Команда D без параметров выводит 8 строк данных, по 16 байт в каждой,
то есть всего 128 байт, начиная с адреса конца последней выведенной области
[5]:
Адрес Шестнадцатеричное представление ASCII-коды
хххх:хх00 хх ………… хх-хх ………… хх х..…………х
хххх:хх10 хх ………… хх-хх ………… хх х..…………х
хххх:хх20 хх ………… хх-хх ………… хх х..…………х
… х..…………х
хххх:хх70 хх ………… хх-хх ………… хх х..…………х
Рис. 11. Формат информации, выводимой с помощью команды D.
В левой части каждой строки будет показан адрес в форме
сегмент:смещение первого слева байта. Основную часть строки, в центре,
занимает шестнадцатеричное представление данных, начинающихся с
указанного в начале строки байта. Справа эти же данные выведены в коде
ASCII для облегчения интерпретации шестнадцатеричной записи. Помните, что
шестнадцатеричная цифра занимает половину байта, поэтому
шестнадцатеричное представление байта показано в виде хх.
Адрес слева относится только к первому байту в строке, адреса
последующих байтов могут быть легко найдены простым счетом: например,
если адрес первого байта – 0159:0240h, то одиннадцатый байт в строке имеет
адрес 0159:024Аh (увеличиваем адрес на 10). При просмотре содержимого
памяти байты разделяются пробелами, кроме того восьмой и девятый байты
разделяет дефис, то есть разделяются группы по 8 байт. Поэтому, например,
если нужно найти байт со смещением хх13h, то нужно начать с байта хх10h и
найти третий после него байт.
Можно также последовательно просматривать память, повторно вводя D.
При этом будут выводиться 128 байт, следующих за последними
просмотренными.
Команду D можно также использовать, указывая длину или диапазон.
Можно указывать начальный адрес с необязательной длиной (длина по
умолчанию 128 (80h) байт):
D [начальный_адрес [L длина]]
Примеры использования:
D 200 Вывести 80h байт, начиная с адреса DS:200h.
D CS:150 Вывести 80h байт, начиная с адреса CS:150h.
D DS:20 L5 Вывести 5 байт, начиная с адреса DS:20h.
Можно указать диапазон:
D [начальный_адрес конечный_адрес]

18
Пример:
D 300 32C Вывести байты, начиная с 300h, и заканчивая 32Сh.
E (Enter)
Позволяет вводить в память данные или инструкции машинного кода.
Регистр по умолчанию – DS.
Формат команды:
E адрес [список]
Команда предоставляет две возможности: заменять байты на указанные в
списке и последовательно редактировать байты.
Примеры использования:
E 105 13 3A 21 Ввести три байта, начиная с адреса DS:105h.
E CS:211 21 2A Ввести два байта, начиная с адреса CS:211h.
E 12C Просмотреть и, при необходимости, изменить содержимое
байта DS:12Ch. Операция будет ожидать ввода с
клавиатуры одного или нескольких байтов, разделенных
пробелами, в шестнадцатеричной форме (рис. 12). DEBUG
также позволяет нажать <Enter>, чтобы оставить старое
значение байта.

Сегмент Записываемое значение

Смещение Старое значение в памяти

Рис. 12. Ввод нового значения по адресу 12C с помощью команды E.


G (Go)
Выполняет программу на машинном языке вплоть до указанной точки
останова. Регистр по умолчанию – CS.
Формат команды:
G [=начальный_адрес] [адрес_останова]
Начальный адрес указывать не обязательно, например, команда G 11A
выполнит программу, начиная с адреса, заданного в IP, и заканчивая адресом
11Ah. При отсутствии параметра адрес_останова программа выполняется до
конца. Программа будет при необходимости вызывать требуемые обработчики
прерываний и останавливаться в ожидании, например, ввода с клавиатуры.
H (Hexadecimal)
Вычисляет сумму и разность двух шестнадцатеричных величин,
указанных как H значение_1 значение_2. Например, H 14F 22 выведет в
качестве результата 171 (сумму) и 12D (разность).
L (Load)
Загружает файл в память. Файл можно загрузить одним из двух способов:
указав имя файла в качестве аргумента при запуске DEBUG, или из
запущенного DEBUG командой N (Name).
Формат команды загрузки из уже указанного файла:
L [адрес]

19
Параметр адрес указывает, по какому адресу загрузить в память файл.
Если адрес не указан, файл загружается начиная с адреса CS:100h. Чтобы
загрузить файл, не указанный при запуске DEBUG, его необходимо
предварительно указать (см. команду N):
N имя_файла Указать файл.
L Загрузить указанный файл, начиная с адреса CS:100h.
N (Name)
Объявление имени файла, который вы хотите прочитать с диска или
записать на диск. Команда используется как N имя_файла, тип программы
должен быть .COM, например:
N C:\SAM.COM
Операция сохраняет введенное имя по адресу CS:80h в PSP. Первый байт
(по адресу CS:80h) содержит длину, за ним следует пробел и имя файла. Для
чтения файла используется команда L (Load), для записи – W (Write).
P (Proceed)
Продолжить или выполнить группу связанных инструкций. По
умолчанию используется пара регистров CS:IP.
Формат команды:
P [=адрес] [значение]
Необязательный операнд =адрес указывает адрес начала, а значение –
необязательное количество инструкций, которые необходимо выполнить. Если
адрес не указывается, используется текущий адрес из пары CS:IP, а если не
указано значение, выполняется одна инструкция.
Например, для выполнения обработчика прерываний INT используйте P,
и он выполнится вплоть до следующей инструкции.
Q (Quit)
Завершить сеанс работы с DEBUG. Операция не сохраняет файлы, для
этого необходимо применять команду W.
R (Register)
Выводит содержимое регистров, флагов, адрес следующей инструкции, ее
машинный код и мнемокод.
Формат команды:
R [имя_регистра]
Примеры использования:
R Вывести значения всех регистров.
R DX Вывести и, при необходимости, изменить значение DX:
DEBUG позволяет нажать <Enter>, чтобы оставить
содержимое регистра неизменным, или ввести от одной до
четырех шестнадцатеричных цифр, которые будут
записаны в DX.
R IP Вывести и, при необходимости, изменить значение IP
(можно ввести другое значение с клавиатуры).
RF Вывести состояние флагов.

20
T (Trace)
Пошагово выполняет программу. По умолчанию адрес следующей
инструкции содержится в паре регистров CS:IP. После выполнения команды T
изменяется значение регистра IP.
Формат команды:
T [=адрес] [значение]
Необязательный операнд =адрес указывает DEBUG, откуда начинать
пошаговое выполнение, а значение – количество команд, которые необходимо
выполнить. Если операнды отсутствуют, DEBUG выполняет одну инструкцию
и выводит значения регистров.
Примеры использования:
T Выполнить одну следующую инструкцию.
T 10 Выполнить следующие 10h (16) инструкций.
U (Unassemble)
Дизассемблирует машинный код, то есть преобразует его в
соответствующие символьные инструкции ассемблера. По умолчанию
используются регистры CS:IP.
Формат команды:
U [начальный_адрес]
или
U [начальный_адрес конечный_адрес]
Примеры использования:
U 100 Дизассемблировать 32 байта, начиная с адреса CS:100.
U Дизассемблировать 32 байта, начиная с адреса,
на котором закончилась последняя команда U,
если она была.
U 100 140 Дизассемблировать команды из адресов с CS:100
до CS:140.
W (Write)
Записывает файл из DEBUG. Необходимо заранее задать имя файла, если
он не был загружен. По умолчанию используется регистр CS.
Формат команды:
W [адрес [диск начальный_сектор число_секторов]]
Программы можно записывать только в виде .COM файлов. Записывать
файлы из DEBUG можно в двух случаях:
В первом случае, после загрузки программы в память машины и ее
модификации необходимо сохранить измененный вариант. Для этого следует:
 Загрузить программу по ее имени:
DEBUG имя_файла
 Просмотреть программу с помощью команды D и внести изменения с
помощью команд E.
 Командой W записать на диск измененную программу.

21
Во втором случае, необходимо с помощью DEBUG написать небольшую
по объему программу и сохранить ее на диске. Для этого следует:
 С помощью команд A (Assemble) и E (Enter) ввести требуемые инструкции.
 Ввести имя программы командой:
N имя_файла.com
Расширение файла обязательно должно быть COM.
 Поскольку только программист знает, где действительно кончается его
программа, указать отладчику длину программы в байтах в паре регистров
BX:CX. Например:
хххх:0100 MOV CL,42
хххх:0102 MOV DL,2A
хххх:0104 ADD CL,DL
хххх:0106 JMP 100
хххх:0108
 Хотя вводятся символьные инструкции, DEBUG преобразует их в
машинный код, и именно машинный код будет записан в файл. Поскольку
длина последней инструкции, JMP 100, составляет два байта, размер
программы равен 8 байтам.
 С помощью команды R BX просмотрите значение BX и введите 0, чтобы
очистить его.
 Командой R CX просмотрите содержимое регистра CX. DEBUG выведет
значение CX и запросит новое. Введите размер программы, 8.
 Ведите команду W <Enter>, чтобы записать программу на диск.
В обоих случаях DEBUG выдает сообщение "Writing nnnn bytes." (Запись
nnnn байтов). Если nnnn равно 0, то произошла ошибка при вводе длины
программы, и необходимо повторить запись снова.
Порядок выполнения лабораторной работы:
1. Изучите архитектуру и программную модель процессора Intel 8086,
используя приведенный в п. 1.1 – п. 1.3 материал.
2. Изучите способ сегментирования памяти процессора Intel 8086, используя
приведенный в п. 1.4 материал.
3. Изучите команды отладчика DEBUG, используя приведенный в п. 1.5
материал.
4. Выполните задания I – VIII согласно варианту. Результаты выполнения
заданий оформите в виде отчета в редакторе Microsoft Word. Отчет должен
содержать ответы на задания и результаты, полученные после ввода каждой
команды DEBUG.
1.6. Задания к лабораторной работе №1
I. Объясните значение терминов:
1. сегмент;
2. физический адрес;
3. базовый адрес;
4. смещение;
22
5. слово памяти;
6. прерывание.
II. Укажите, какие регистры можно использовать для выполнения
следующих действий:
1. сложение и вычитание;
2. подсчет числа циклов;
3. умножение и деление;
4. адресация сегментов;
5. сравнение строк;
6. адресация выполняемой команды.
III. Определите, какие флаги затрагиваются произошедшим событием:
1. арифметическая сумма равна 0;
2. арифметическая сумма отрицательна;
3. строковые данные просматриваются слева направо;
4. арифметическое переполнение;
5. перенос из старшего разряда при выполнении арифметической операции;
6. блокировка прерываний.
IV. Вычислите физический адрес, формируемый заданными значениями:
1. значение SS равно 2AB4h и значение SP равно 24h;
2. значение CS равно 2BC3h и значение IP равно 3Ah;
3. значение DS равно 13C6h и смещение равно 1ABBh;
4. значение DS равно 045Fh и смещение равно 32h;
5. значение DS равно 4FC5h и смещение равно 10Bh;
6. значение DS равно 038Eh и смещение равно 32h.
V. Напишите команду DEBUG для выполнения заданного действия:
1. просмотреть содержимое всех регистров;
2. просмотреть содержимое регистра IP и установить его в 0100h;
3. просмотреть данные, хранящиеся в памяти, начиная со смещения 2BCh в
сегменте данных;
4. просмотреть данные, находящиеся в памяти, начиная с ячейки с адресом
3AFh;
5. дизассемблировать символьный код по адресам от 100h до 12Bh;
6. ввести A63Bh в сегмент данных, начиная с адреса 18Ah.
VI. Просмотрите ячейки памяти из области данных BIOS, используя
команду D для дампа памяти:
1. Определите размер доступной для работы памяти, который находится в
области данных BIOS по адресу 0040:0013h. Слово, расположенное по
данному адресу (в ячейках с адресами 0040:0013h и 0040:0014h),
содержит размер памяти в килобайтах и в шестнадцатеричном
представлении, причем байты располагаются в обратной
последовательности. Определите размер доступной памяти в десятичном
представлении.

23
2. Просмотрите сведения об авторском праве и определите серийный номер
компьютера, записанный в ROM BIOS по адресу FE00:0000h. В
зависимости от производителя компьютера будет выведена строка в
формате ASCII и серийный номер в виде шестнадцатеричного числа.
Строка, с указанием авторских прав может быть длиннее, чем
показанный участок памяти, в этом случае для просмотра непоказанной
части снова введите D и нажмите <Enter>. Выпишите серийный номер
компьютера.
3. Определите и выпишите дату производства BIOS в формате мм/дд/гг,
которая находится по адресу FFFF:0005.
4. Первый байт для хранения признаков нажатия (флагов) управляющих
клавиш клавиатуры находится в области данных BIOS по адресу
0040:0017h (см. табл. 4). Просмотрите и выпишите содержимое этого
байта при включенных и выключенных режимах Num Lock и Caps Lock.

Таблица 4.
Назначение битов 1-го байта флагов клавиатуры (0040:0017h)
Биты Назначение бита
0 Нажата правая клавиша Shift
1 Нажата левая клавиша Shift
2 Нажата любая клавиша Ctrl
3 Нажата любая клавиша Alt
4 Режим Scroll Lock активен
5 Режим Num Lock активен
6 Режим Caps Lock активен
7 Режим Insert активен
5. Порт – это устройство, соединяющее процессор с внешним миром. Через
порт процессор принимает сигналы от устройства ввода и передает
сигналы устройствам вывода. К портам обращаются по их адресам
(процессор Intel 8086 позволяет адресовать 64К портов). Первые 16 байт
области данных BIOS, начиная с адреса 0040:0000h содержат адреса
параллельных и последовательных портов. Введите команду просмотра
этих байтов и определите адреса последовательных (COM) и
параллельных (LPT) портов. Адреса портов хранятся в словах памяти в
обратной (с переставленными байтами) последовательности.
6. Слово состояния оборудования расположено в области данных BIOS по
адресу 0040:0010h в байтах с адресами 0040:0010h и 0040:0011h (см.
табл. 5). Введите команду просмотра этих байт и интерпретируйте
содержащиеся в них шестнадцатеричные значения для получения
информации о присутствующих в системе устройствах.

24
Таблица 5.
Слово конфигурации оборудования в области данных BIOS
Биты Устройства
15, 14 Число обнаруженных LPT-портов: 00 – 0, ..., 11 – 3
13 Наличие внутреннего модема: 0 – нет, 1 – есть
12 Наличие игрового адаптера (джойстика): 0 – нет, 1 – есть
11-9 Число обнаруженных СОМ-портов: 000 – 0, ..., 111 – 7
8 Наличие контроллера DMA: 0 – нет, 1 – есть
7, 6 Число обнаруженных дисководов (FDD): 00 – 1,..., 11 – 4
5, 4 Начальный видеорежим: 00 – не используется, 01 – 4025,
цветной, 10 – 8025, цветной, 11 – 8025, монохромный
3 Не используется в IBM PC AT
2 Наличие устройства указания (мыши): 0 – нет, 1 – есть
1 Наличие математического сопроцессора: 0 – нет, 1 – есть
0 Наличие дисковода (FDD): 0 – нет, 1 – есть
VII. Введите в область сегмента данных, начиная со смещения 200h,
последовательность ASCII-кодов символов строки, используя кодовую
таблицу ASCII (см. Приложение А) и команду E.
Замечание. Для проверки правильности введенных кодов символов
строки используйте команду D.
1. 'Hello, World!'
2. 'Coffee Break'
3. 'Good Morning'
4. 'Good Afternoon'
5. 'Good Evening'
6. 'Welcome!'
VIII. Используйте DEBUG для ввода программы и трассировки ее
выполнения. Каков результат работы программы? Объясните, как он
получился. Сохраните программу из отладчика на диск.
Замечание. Введите программу, состоящую из символьных инструкций,
используя команду A 100 для ввода выражений на языке Ассемблера в память.
Дизассемблируйте инструкции программы командой U для просмотра
созданного DEBUG машинного кода. Поместите результат дизассемблирования
в отчет. Выполните пошаговую трассировку программы вплоть до команды
JMP. Начните с ввода команды R для просмотра содержимого регистров и
первой инструкции программы. Убедитесь, что IP установлен в 100h.
Используйте команду T для выполнения отдельной инструкции программы,
или команду P для выполнения всей подпрограммы обработки прерывания INT.
Остановите выполнение, когда дойдете до команды JMP. Для повторного
выполнения программы введите еще раз команду T, программа DEBUG
выполнит инструкцию JMP и перейдет к началу введенной программы. При

25
необходимости используйте команду E для очистки ячеек памяти и команду R
для очистки регистров. Для завершения работы с DEBUG введите Q.
1. MOV AX,0123
ADD AX,0025
MOV BX,AX
ADD BX,AX
MOV CX,BX
SUB CX,AX
SUB AX,AX
JMP 100
2. MOV AH,09
MOV DX,109
INT 21
JMP 100
DB 'Coffee Break', '$'
3. MOV AH,02
MOV DX,23
INT 21
JMP 100
4. MOV AH,02
MOV DX,2A
INT 21
JMP 100
5. MOV BX,25
ADD BX,30
SHL BX,1
SUB BX,22
JMP 100
6. MOV DX,2E
ADD DX,1F
SHL DX,1
SUB DX,BA
JMP 100

26
2. Лабораторная работа №2 «Способы адресации памяти и их
применение при пересылке данных»
Цель работы:
 Изучение режимов адресации данных процессоров Intel 8086 и их
применение при пересылке данных.
Краткие теоретические сведения:
2.1. Режимы адресации памяти в процессорах Intel 8086
Команды процессора Intel 8086 имеют разнообразные способы адресации
операндов, что повышает гибкость их применения и расширяет возможности
отдельных команд, а также упрощает организацию и использование сложных
структур данных.
В табл. 6 приведены форматы операндов для семи режимов адресации,
реализуемых процессором Intel 8086, и для каждого формата указано, какой из
сегментных регистров используется по умолчанию для вычисления адреса
операнда.
Таблица 6.
Режимы адресации процессора Intel 8086
Режим адресации Формат операнда Сегментный регистр
Регистровый регистр Не используется
Непосредственный данное Не используется
Прямой смещение DS
Косвенный регистровый [ВХ] DS
[ВР] SS
[DI] DS
[SI] DS
Базовый [ВХ] + смещение DS
[ВР] + смещение SS
Индексный [DI] + смещение DS (или ES)
[SI] + смещение DS
Базовый индексный [BX] [SI] + смещение DS
[ВХ] [DI] + смещение DS
[ВР] [SI] + смещение SS
[ВР] [DI] + смещение SS
Регистровая адресация. Операнд содержится в определяемом командой
регистре общего назначения, например:
MOV AX,BX ; Запись содержимого регистра BX, в регистр AX
Непосредственная адресация. Операнд длиной байт или слово является
частью команды, например:
MOV AX,1234 ; Константа 1234 пересылается в регистр AX

27
Непосредственный операнд (константа 1234) помещается в последние
байты машинного представления команды, причем младший байт следует
первым (находится по меньшему адресу), таким образом, символьной команде
MOV из предыдущего примера соответствует машинный код B83412.
Прямая адресация. Эффективный адрес операнда является сегментным
смещением. DS – сегментный регистр, по умолчанию используемый для
адресации данных в памяти, например:
MOV AX,[0000] ; Запись слова с адресом DS:0000 в регистр AX
Если известен физический адрес, начиная с которого размещается
операнд, то в команде можно непосредственно указать этот адрес, таким
образом, обеспечивается доступ к произвольной ячейке во всем пространстве
адресов 1 Мбайт. Доступ к данным, находящимся в сегменте, отличном от
указанного в регистре DS, осуществляется посредством прямой адресации, в
которой задается сегментный регистр, содержащий базовый адрес требуемого
сегмента, и внутрисегментное смещение. Пример такого формата:
MOV AX,ES:0001 ; Запись слова с адресом ES:0001 в регистр AX
Косвенная регистровая адресация. Эффективный адрес операнда,
являющийся сегментным смещением, находится в базовом регистре BX,
регистре указателя базы BP или индексном регистре (SI или DI). Косвенные
регистровые операнды заключаются в квадратные скобки, что определяет
обращение к памяти:
MOV AX,[BX] ; Содержимое ячейки памяти с адресом,
; находящимся в регистре BX, пересылается в AX
В приведенном примере, как и в случае с прямой адресацией, для
организации доступа к операнду по умолчанию используется сегментный
регистр DS, однако при необходимости можно явно указать требуемый
сегментный регистр, например, ES:[BX].
Если в команде указывается адрес из регистра BP, то в качестве
сегментного регистра применяется SS. Таким образом, косвенная адресация
через регистр BP предназначена для работы со стеком.
При модификации содержимого регистра одна и та же команда оперирует
различными ячейками памяти, таким образом, данный способ адресации
позволяет вычислять адреса во время выполнения программы, что часто
требуется, например, для обращения к различным элементам структур данных.
Базовая адресация. Эффективный адрес операнда является суммой
содержимого регистра BX или BP и указанного в команде числа, которое
называют смещением, например:
MOV AX, [BX+10] ; Запись содержимого ячейки памяти с ИА,
; определяемым как сумма содержимого BX
; и смещения в команде в регистр AX
Другая форма записи предыдущей команды:
MOV AX, 10[BX]
При использовании BX происходит обращение к операнду в сегменте
данных, а при использовании BP – в сегменте стека.
28
Базовая адресация обычно используется для доступа к элементам
структуры данных, когда смещение (номер) элемента известно на стадии
разработки программы, а базовый (начальный) адрес структуры вычисляется
при выполнении программы.
Индексная адресация. Эффективный адрес операнда является суммой
смещения, находящегося в команде, и содержимого индексного регистра SI или
DI, например:
MOV AX,0100[SI] ; Запись содержимого ячейки памяти с ИА,
; определяемым как сумма содержимого SI
; и смещения в команде в регистр AX.
Данный способ обычно применяется для обращения к различным
элементам одномерного массива, когда смещение определяет начальный адрес
массива, а индексный регистр определяет элемент массива.
Базовая индексная адресация. Эффективный адрес равен сумме
содержимого базового регистра BX или BP, индексного регистра SI или DI и
смещения, находящегося в команде (в частном случае смещение может
отсутствовать), например:
MOV AX,0100[BX][SI] ; Запись содержимого ячейки памяти с ИА,
; определяемым как сумма
; содержимого регистров SI, BX
; и смещения в команде в регистр AX
Так как в этом режиме можно варьировать два компонента адреса, он
удобен для адресации двумерных массивов, то есть матриц. Начальный адрес
матрицы определяется значением смещения, переход от одной строки матрицы
к другой осуществляется с помощью базового регистра BX, а переход от одного
элемента к другому внутри строки – с помощью индексного регистра SI.
Кроме семи перечисленных в табл. 6 способов, адресация операндов в
командах, оперирующих с данными, может быть неявной.
Неявная адресация. Операнд указывается с помощью первого байта
команды вместе с кодом операции. Этот способ адресации часто применяется в
однобайтовых командах, где адресуемым операндом является аккумулятор,
регистр флагов или отдельные флаги.
2.2. Команды пересылки данных
Команды пересылки данных предназначены для передачи данных между
регистрами и памятью. Основной командой пересылки данных является
команда MOV.
Команда MOV имеет следующий формат:
MOV операнд_1, операнд_2
По команде MOV на место первого операнда пересылается значение
второго операнда. Оба операнда должны быть одного и того же размера. В
качестве второго операнда может использоваться: непосредственный операнд,
операнд, находящийся в памяти, регистр общего назначения или сегментный

29
регистр; в качестве первого – регистр общего назначения, сегментный регистр
(кроме CS) или ячейка памяти. На приведенном ниже рисунке представлены
различные способы, которыми можно пересылать данные. Стрелки показывают
пути пересылки данных.

Непосредственные
операнды

Регистры
Память общего
назначения

Сегментные
регистры
Рис. 13. Возможные комбинации операндов команды MOV.
Отметим характерные особенности команды MOV:
1. Запрещены пересылки из одной ячейки памяти в другую, из одного
сегментного регистра в другой, запись непосредственного операнда в
сегментный регистр (рис. 13). Но, если возникает необходимость произвести
одно из таких действий, то оно реализуется в два этапа, с использованием в
качестве промежуточного какого-нибудь из регистров общего назначения.
2. Командой MOV нельзя менять содержимое сегментного регистра CS. Это
связано с тем, что регистровая пара CS:IP определяет адрес следующей
выполняемой команды, поэтому изменение любого из этих регистров есть
операция перехода.
3. Команда MOV учитывает, что числа размером в слово хранятся в памяти в
обратном порядке с переставленными байтами, а в регистрах – в обычном
порядке.
4. Команда MOV определяет размер (тип) пересылаемой величины по одному
из операндов, при этом никаких преобразований типов не производится.
2.3. Использование оператора указания типа
В предыдущих примерах, помещавших посредством команды MOV
данные в регистр AX согласно различным способам адресации, DEBUG мог
определить, исходя из типа регистра AX, сколько байтов было необходимо
переслать. Рассмотрим ситуацию, когда по операндам команды MOV нельзя
определить размер пересылаемой величины, например, требуется поместить
непосредственное значение в ячейку памяти, адрес которой хранится в регистре
BX. Поскольку в команде вроде MOV [BX],30 ни по первому, ни по второму
операнду нельзя понять размер пересылаемой величины, DEBUG не сможет
определить на какую конкретную машинную команду заменить эту
символьную инструкцию. В подобных ситуациях DEBUG фиксирует ошибку,

30
чтобы этого не произошло необходимо явно указать тип хотя бы одного из
операндов команды. Для этой цели можно использовать оператор указания типа
PTR, который записывается следующим образом:
тип PTR выражение
где тип – это спецификатор типа BYTE или WORD, а выражение – это
число или адрес.
Например, чтобы поместить непосредственное значение 30h в байт
памяти по адресу из регистра BX, надо использовать команду:
MOV BYTE PTR[BX],30
а если надо переслать непосредственное значение 30h в слово памяти по
адресу из регистра BX, то команду:
MOV WORD PTR[BX],30
Обычно принято уточнять тип операнда-адреса, а не тип
непосредственного операнда:
MOV WORD PTR[120],25 ; Запись непосредственного значения 25h
; в ячейки памяти
; по адресу DS:120h и DS:121h
MOV BYTE PTR[122],30 ; Запись непосредственного значения 30h
; в ячейку памяти по адресу DS:122h
Порядок выполнения лабораторной работы:
1. Изучите режимы адресации памяти в процессорах Intel 8086, используя
приведенный в п. 2.1 материал.
2. Изучите возможности, предоставляемые командой пересылки данных MOV,
используя приведенный в п. 2.2 – п. 2.3 материал.
3. Выполните задания I – IV согласно двухзначному варианту. Результаты
выполнения заданий оформите в виде отчета в редакторе Microsoft Word.
Отчет должен содержать ответы на задания и результаты, полученные после
ввода каждой команды DEBUG.
2.4. Задания к лабораторной работе №2
I. Введите в DEBUG программу (с адреса 100h), которая, начиная со
смещения 200h, пересылает в память число заданного размера заданное
количество раз (см. табл. 7), используя указанный способ адресации (см.
табл. 8).
Таблица 7.
Первая цифра варианта
№ Число Размер Количество
0 08h байт 15
1 1878h слово 11
2 02h байт 14
3 1461h слово 13
4 05h байт 17
5 1912h слово 12
31
6 0511h слово 11
7 12h байт 13
8 19h байт 12
9 0813h слово 11
Таблица 8.
Вторая цифра варианта
№ Вид адресации
0 Непосредственная
1 Базовая
2 Косвенная регистровая
3 Регистровая
4 Базовая индексная
II. Перед выполнением программы определите при помощи
дизассемблирования машинный код для команд MOV, выполняющих
действия по пересылке данных. Поместите результат
дизассемблирования в отчет.
III. Выполните программу в DEBUG с помощью команд T или команды G
(см. п. 1.5).
IV. Сохраните программу из отладчика на диск под именем mas.com.

32
3. Лабораторная работа №3 «Инструкции для выполнения
арифметических операций сложения и вычитания»
Цель работы:
 Изучение форматов и правил работы с командами сложения и вычитания
процессоров Intel 8086.
Краткие теоретические сведения:
3.1. Команды сложения и вычитания, их воздействие на флаги
В процессоре Intel 8086 имеется несколько команд сложения и
вычитания, основные из них [8] приведены в табл. 9:

Таблица 9.
Команды сложения и вычитания процессора Intel 8086
Группа Название Команда
Команды сложения Сложение ADD операнд_1, операнд_2
Сложение с переносом ADC операнд_1, операнд_2
Инкремент INC операнд
Команды вычитания Вычитание SUB операнд_1, операнд_2
Вычитание с займом SBB операнд_1, операнд_2
Декремент DEC операнд
Изменение знака NEG операнд
Сравнение2 CMP операнд_1, операнд_2
Команды сложения и вычитания устанавливают флаги в зависимости от
результата операции:
 флаг переноса CF равен 1, если при сложении (вычитании) чисел был
выполнен перенос (потребовался заем), в противном случае CF равен 0;
 флаг переполнения OF равен 1, если сложение (вычитание) чисел, имеющих
одинаковые (разные) знаки, приводит к результату вне допустимого
диапазона, в противном случае OF равен 0;
 флаг нуля ZF равен 1, если результат оказался нулевым, в противном случае
ZF равен 0;
 флаг знака SF равен 1, если результат оказался отрицательным (знаковый
бит равен 1), в противном случае SF равен 0;
 флаг четности PF равен 1, если результат имеет четное число битов со
значением 1, в противном случае PF равен 0;
 вспомогательный флаг переноса AF равен 1, если результат сложения
(вычитания) чисел, представленных двоично-десятичными кодами, требует
коррекции, в противном случае AF равен 0.
Команды сложения и вычитания работают как с числами размером в

2
Команда сравнения рассматривается в лаб. р. №5.
33
байт, так и с числами размером в слово, при этом размеры операндов должны
совпадать (либо байты, либо слова). На рис. 14 показаны допустимые
комбинации операндов, при этом числа могут быть как знаковыми, так и
беззнаковыми. В табл. 10. приведены диапазоны знаковых и беззнаковых
допустимых значений для целочисленных величин разного типа.

Таблица 10.
Формат Байт (8 разрядов) Слово (16 разрядов)
Беззнаковый 0 … 255 (FFh) 0 … 65536 (FFFFh)
Знаковый -128 (80h) … 127 (7Fh) -32768 (8000h) … 32767 (7FFFh)
Команды сложения ADD и сложения с переносом ADC. Команда ADD
выполняет целочисленное сложение двух операндов, представленных в
двоичном коде. Результат помещается на место первого операнда, второй
операнд не изменяется, например:
ADD AX,BX ; Сложение содержимого регистров BX и AX
; и запись результата в AX

Регистр + Регистр Регистр Ячейка + Регистр Ячейка


памяти памяти
Ячейка Непосред
памяти ственный
операнд
Непосред
ственный
операнд
Рис. 14. Возможные комбинации операндов команды ADD.
Команда ADD не различает числа со знаком и без знака, но используя
значения флагов CF (перенос при сложении беззнаковых чисел), OF
(переполнение при сложении знаковых чисел) применяется и для тех, и для
других. Если программист считает, что складываются беззнаковые числа, то
для него представляет интерес флаг CF и безразличен флаг OF, но если, по его
мнению, складываются знаковые числа, то он проверяет флаг OF и не обращает
внимания на флаг CF. Заметим, что в ходе одной операции могут быть
установлены оба флага CF и OF, тогда флаг переноса CF делает неправильным
результат суммирования беззнаковых чисел, а флаг переполнения OF –
результат суммирования знаковых.
Команда сложения с переносом ADC – это та же команда ADD, за
исключением того, что в сумму включается флаг переноса CF, который
прибавляется к результату. Для любой формы команды ADD существует
аналогичная ей команда ADC. Пара команд ADD и ADC используется для
сложения чисел повышенной точности.
Например, пусть первое число находится в паре регистров DX:AX, а
второе – в паре регистров CX:BX, тогда фрагмент программы сложения этих
34
двух чисел будет выглядеть так:
ADD AX, BX ; AX = AX + BX, CF = перенос
ADC DX, CX ; DX = DX + CX + CF
Первая команда выполняет сложение младших слов, а вторая складывает
DX и CX и прибавляет к их сумме флаг переноса.
Команды вычитания SUB и вычитания с займом SBB. Команда
вычитания SUB идентична команде сложения, только она из первого операнда
вычитает второй и помещает результат на место первого операнда, например:
SUB AX,BX ; Вычитание содержимого регистра BX из AX
; и запись результата в AX
Для команды вычитания SUB допустимы аналогичные комбинации
операндов рис. 14, если в них поменять знак «+» на «–». Команда SUB
устанавливает флаги CF и OF в соответствии с результатом операции.
Процессор Intel 8086 вычисляет разность путем сложения, поэтому
выполнение вычитания процессором проходит в два этапа. Сначала он
обращает знак у вычитаемого, а затем складывает уменьшаемое и обращенное
вычитаемое. Обращение знака числа заключается в получении его двоичного
дополнения инвертированием битов двоичного кода числа и добавлением
единицы. Обращение знака для вычитаемого числа выполняется процессором
автоматически, однако, если возникнет необходимость выполнить эту
операцию для конкретного операнда, то это можно сделать с помощью
команды NEG, которая будет рассмотрена далее.
Команда вычитания с займом SBB учитывает флаг CF, то есть значение
займа вычитается из результата. Последовательность команд SUB, SBB, SBB…
можно применить к вычитанию чисел любого размера, например для 32-
разрядных чисел в парах регистров DX:AX и CX:BX вычитание будет иметь
вид:
SUB AX, BX ; AX = AX - BX, CF = заем единицы
SBB DX, CX ; DX = DX - CX - CF
Первая команда SUB выполняет вычитание младших слов, если при этом
произошел заем, то он будет учтен второй командой SBB при вычитании
старших слов.
Команды инкремента INC и декремента DEC. Команды инкремента и
декремента изменяют значение своего единственного операнда (регистра или
ячейки памяти) на единицу. Команда INC прибавляет единицу к операнду, а
команда DEC вычитает единицу из операнда. Команды INC и DEC не влияют
на флаг переноса CF, остальные флаги (OF, SF, ZF, PF, AF) устанавливаются в
соответствии с результатом.
Примеры команд инкремента и декремента:
INC BL ; Увеличение на единицу
; содержимого регистра BL
DEC WORD PTR[120] ; Уменьшение на единицу значения
; слова памяти по адресу DS:120h
35
Команда обращения знака NEG. Команда NEG вычитает значение своего
операнда (регистра или ячейки памяти) из нулевого значения и тем самым
формирует его двоичное дополнение. При нулевом операнде флаг CF равен 0,
при ненулевом значении операнда флаг CF равен 1, остальные флаги (OF, SF,
ZF, PF, AF) устанавливаются в соответствии с результатом операции.
Команда NEG полезна для вычитания значения регистра или ячейки
памяти из непосредственного значения, например, чтобы вычесть значение
регистра AL из 100 можно обратить знак содержимого регистра AL и добавить
к нему 100:
NEG AL
ADD AL,100
3.2. Команды расширения знака
Команды расширения знака. Для выполнения арифметических операций,
в которых необходимо сложить байт и слово, вычесть слово из байта и т. д.
существуют команды, позволяющие выполнять расширение байта до слова, а
слова до двойного слова с сохранением величины числа.
Команда CBW используется для преобразования байтовой величины в
соответствующее ей слово путем дублирования знакового бита регистра AL во
всех битах регистра AH.
В следующем примере команда CBW распространяет знак из регистра AL
на регистр AH, создавая в регистре AX число 0060h. После этого к
содержимому регистра добавляется число 20h, и в регистре AX будет
содержаться значение 0080h (или +128):
MOV AL,60
CBW
ADD AX,20
Представленная операция суммирования, выполненная в регистре AL:
ADD AL,20 приведет к результату, расцениваемому как отрицательный,
поскольку значение 80h, или 10000000b, записанное в регистре AL, является
отрицательным числом, интерпретируемым как -128. Таким образом, операция
ADD устанавливает флаг знака SF=1, и флаг переполнения OF=1, указывая на
отрицательный результат сложения двух положительных чисел. Проблема в
том, что регистр AL имеет недостаточную емкость для хранения результата
операции, в таком случае нужно использовать регистр AX, как показано выше.
Команда CWD используется для преобразования знакового числа в
формате слова в двойное слово путем дублирования знакового бита регистра
AX во всех битах регистра DX.
В командах расширения знака операнды не указываются, так как их
местонахождение фиксировано, как и у результата выполнения команд: для
CBW операнд всегда находится в регистре AL, а результат записывается в
регистр AX; для CWD операнд всегда находится в регистре AX, а результат
записывается в пару регистров DX:AX.
Команды расширения знака не изменяют регистр флагов.

36
Порядок выполнения лабораторной работы:
1. Изучите команды сложения и вычитания, используя приведенный в п. 3.1
материал.
2. Изучите команды расширения знака, используя приведенный в п. 3.2
материал.
3. Выполните задание согласно трехзначному варианту. Результат выполнения
задания оформите в виде отчета в редакторе Microsoft Word. Отчет должен
содержать объяснение процесса вычислений, выполняемых с помощью
команд DEBUG для получения ответа.
3.3. Задания к лабораторной работе №3
I. Введите в DEBUG программу, начиная с адреса 100h , которая вычисляет
выражение F = КОН1 оп1 (КОН2 оп2 Х оп3 Y) оп4 Z оп5 КОН3, где
КОН1, КОН2, КОН3 – числовые константы;
оп1, оп2, оп3, оп4, оп5 – операции сложения и вычитания;
X, Y, Z – переменные, содержащие произвольные положительные
значения.
Числовые константы определяются согласно первой цифре варианта (см.
табл. 11), операции сложения и вычитания – согласно второй цифре
варианта (см. табл. 12), а тип переменных – согласно третьей цифре
варианта (см. табл. 13).
Переменные X, Y, Z хранятся в памяти последовательно, начиная с адреса
0900h. Результат вычисления выражения, полученный при выполнении
программы, должен располагаться в памяти с адреса 1000h.

Таблица 11.

Первая цифра варианта


№ 0 1 2 3 4 5 6 7 8 9
КОН1 12h 2569h 45h 12h 78h 4596h 6h 4589h 369h 458h
КОН2 1369h 12h 588h 11h 47h 589h 78h 29h 3856h 481h
КОН3 3699h 4589h 12h 3698h 15h 2385h 2852h 34h 336h 36h

Таблица 12.

Вторая цифра варианта


№ 0 1 2 3 4 5 6 7 8 9
оп1 + — — + + + + — — —
оп2 + + + — — + — — + +
оп3 — + — — + — + + — +
оп4 + + — — + — — + + +
оп5 — + + + — + + + + —

37
Таблица 13.
Третья цифра варианта
№ 0 1 2 3 4 5 6 7 8 9
X байт, байт, слово, слово, байт, слово, байт, слово, слово, байт
без без со со без без со со без со
знака знака знаком знаком знака знака знаком знаком знака знаком
Y слово, байт, слово, байт, байт, слово, слово, байт, байт, слово
без без со со без без со со без со
знака знака знаком знаком знака знака знаком знаком знака знаком
Z байт, слово, слово байт, байт, байт, слово, слово, байт, байт
без без со со без без со со без со
знака знака знаком знаком знака знака знаком знаком знака знаком

38
4. Лабораторная работа №4 «Инструкции для выполнения
арифметических операций умножения и деления»
Цель работы:
 Изучение форматов и правил работы с командами умножения и деления
процессора Intel 8086.
Краткие теоретические сведения:
4.1. Команды умножения и деления, их воздействие на флаги
В процессоре Intel 8086 предусмотрены по два варианта команд деления и
умножения. Это команды MUL и DIV для беззнаковых операндов и команды
IMUL и IDIV – для знаковых. Операндами команд умножения и деления могут
быть как байты, так и слова.
При умножении довольно часто возникает ситуация, когда результат
имеет удвоенный формат по отношению к сомножителям. С учетом этого
обстоятельства умножение в процессоре Intel 8086 организовано следующим
образом. До начала выполнения умножения первый операнд (множимое)
помещается в регистр AL при операции над байтами или в регистр AX при
операции над словами. Второй операнд (множитель) из памяти или другого
регистра указывается в команде умножения. Результат умножения байтов
записывается в регистр AX. Схема выполнения такого умножения приведена на
рис. 15. а. Операция с байтами игнорирует и уничтожает данные, ранее
хранившиеся в AH. Произведение слов записывается в пару регистров DX:AX,
при этом младшее слово записывается в регистр AX, а старшее – в регистр DX.
Схема выполнения такого умножения приведена на рис. 15. б. Операция со
словами уничтожает данные, ранее хранившиеся в DX.
AL * Регистр AX AX / Регистр остаток частное
AH AL
Ячейка Ячейка
памяти памяти

а в

AX * Регистр DX AX DX AX / Регистр остаток частное


DX AX
Ячейка Ячейка
памяти памяти

б г
Рис. 15. Схемы выполнения операций умножения и деления
а – умножение байтов, б – умножение слов,
в – деление на байт, г – деление на слово.
Очевидно, что для деления должна иметь место обратная ситуация, когда
делимое имеет двойной размер по отношению к делителю и результату
39
деления. Деление организуется следующим образом. Местонахождение
делимого фиксировано и поэтому в команде указывается только делитель,
который определяет, какая схема деления будет использоваться. Если в
команде указан делитель размером в байт, то процессор поделит слово в
регистре AX на операнд из команды, находящийся в регистре общего
назначения или ячейке памяти. Частное и остаток целочисленного деления,
полученные в результате выполнения команды, заносятся в регистр AX. При
этом частное занимает регистр AL, а остаток от деления – регистр AH. Схема
выполнения такого деления приведена на рис. 15. в.
Если в команде указан делитель размером в слово, то процессор поделит
двойное слово в паре регистров DX:AX (старшие два байта – в регистре DX,
младшие – в AX) на операнд из команды, находящийся в регистре общего
назначения или ячейке памяти. В этом случае предполагается, что делимое
размером в двойное слово получено в результате одной из предшествующих
команд умножения или же сформировано специально с помощью команд
CBW/CWD. После деления частное окажется в регистре AX, а остаток – в
регистре DX. Схема выполнения такого деления приведена на рис. 15. г.
Выполнение умножения и деления IMUL и IDIV для знаковых операндов
происходит по тем же схемам, что и у беззнаковых. При этом имеется
естественное отличие от беззнаковых команд в диапазоне операндов и
результатов, соответствующим 8- и 16-разрядным целым числам (см. табл. 10).
Примеры команд, задающих умножение и деление:
MUL BX ; Умножить AX на BX без знака
MUL WORD PTR[120] ; Умножить AX на содержимое слова памяти
; по адресу DS:120h без знака
IMUL DL ; Умножить AL на DL со знаком
IMUL BYTE PTR [122] ; Умножить AL на содержимое байта памяти
; по адресу DS:122h со знаком
DIV BX ; Разделить DX:AX на BX без знака
DIV BYTE PTR [122] ; Разделить AX на содержимое байта памяти
; по адресу DS:122h без знака
IDIV DL ; Разделить AX на DL со знаком
IDIV WORD PTR[200] ; Разделить DX:AX на содержимое слова памяти
; по адресу DS:120h со знаком
При выполнении умножения результат может занимать один байт при 8-
разрядных операндах и слово при 16-разрядных операндах. Размер результата
выясняется с помощью анализа флагов переноса CF и переполнения OF.
Команда MUL устанавливает флаги CF и OF в единицу, если старшая
половина результата не равна 0. Команда IMUL устанавливает флаги CF и OF
по тому же принципу, то есть если произведение не может быть представлено в
младшей половине результата, но только в том случае если старшая часть
результата не является расширением знака младшей. Значения флагов SF, ZF,
40
AF и PF после команд MUL и IMUL не определены.
После команды деления ни один из флагов CF, SF, ZF, AF и PF не
определен. Однако, в случае деления на 0 или переполнения при делении
большого числа на очень малое, когда частное больше того, что может быть
помещено в регистр результата, возникает ошибка, при которой процессор
прекращает выполнение программы.
Порядок выполнения лабораторной работы:
1. Изучите, используя приведенный в п. 4.1 материал.
2. Выполните задание согласно трехзначному варианту. Результат выполнения
задания оформите в виде отчета в редакторе Microsoft Word. Отчет должен
содержать объяснение процесса вычислений, выполняемых с помощью
команд DEBUG для получения ответа.
4.2. Задания к лабораторной работе №4
I. Введите в DEBUG программу, начиная с адреса 100h, которая вычисляет
выражение F = (КОН1 оп1 КОН2) оп2 Х оп3 (Y оп4 КОН3), где
КОН1, КОН2, КОН3 – числовые константы;
оп1, оп2, оп3, оп4 – операции сложения, вычитания, умножения и
деления;
X, Y – переменные, содержащие произвольные положительные или
отрицательные значения.
Числовые константы определяются согласно первой цифре варианта (см.
табл. 14), операции – согласно второй цифре варианта (см. табл. 15), а тип
переменных – согласно третьей цифре варианта (см. табл. 16).
Переменные X, Y хранятся в памяти последовательно, начиная с адреса
0900h. Результат вычисления выражения, полученный при выполнении
программы, располагается в памяти с адреса 1000h.

Таблица 14.

Первая цифра варианта


№ 0 1 2 3 4 5 6 7 8 9
КОН1 1369h 2569h 588h 12h 78h 4596h 785h 4589h 3856h 481h
КОН2 12h 49h 45h 4h 7h 589h 60h 29h 369h 58h
КОН3 36h 12h 6h 8h 15h 2h 5h 34h 3h 6h

Таблица 15.
Вторая цифра варианта
№ 0 1 2 3 4 5 6 7 8 9
оп1 / * — + * + — — / —
оп2 * * / — + / * + +
оп3 + + / * + * + / — /
оп4 — + — — / / * + * *

41
Таблица 16.
Третья цифра варианта
№ 0 1 2 3 4 5 6 7 8 9
X байт, байт, слово, слово, байт, слово, байт, слово, слово, байт,
без со без без со со без без со со
знака знаком знака знака знаком знаком знака знака знаком знаком
Y слово, байт, слово, байт, байт, слово, слово, байт, байт, слово,
без со без без со со без без со со
знака знаком знака знака знаком знаком знака знака знаком знаком

42
5. Лабораторная работа №5 «Логические операции и
управляющие структуры»
Цель работы:
 Изучить команду безусловного перехода JMP и команды условных
переходов.
 Изучить побитовые операции (логические операции, операции сдвига).
Краткие теоретические сведения:
5.1. Команды передачи управления
Команды передачи управления включают в себя безусловные переходы,
команды обращения к подпрограммам и возврата из них, а также команды
управления циклами. Команды управления циклами обеспечивают переход
только в области текущего сегмента. Команды безусловных переходов и
обращений к подпрограммам обеспечивают как внутрисегментные, так и
межсегментные переходы с прямой и косвенной адресацией. Для организации
переходов между сегментами изменяется и содержимое регистра IP, и
содержимое регистра CS. Во время выполнения внутрисегментных переходов
регистр CS не изменяется, меняется только содержимое регистра IP.
Безусловный переход – это переход, который передает управление всякий
раз, когда выполняется. Безусловные переходы подразделяются на собственно
переходы, которым соответствует команда JMP, и вызовы подпрограмм с
возвратом после их завершения – команды CALL и RET. Далее рассмотрим
команду безусловного перехода JMP.
Команда безусловного перехода JMP.
Формат команды JMP:
JMP [тип] адрес
В зависимости от типа перехода различают:
 Короткий переход (переход типа SHORT, по умолчанию в отладчике
DEBUG) – если адрес перехода находится в пределах от –128 до +127 байт
от команды JMP. Команда короткого перехода занимает 2 байта памяти: в
первом записывается код операции (EB), во втором – смещение к точке
перехода.
 Ближний переход (переход типа NEAR) – если адрес перехода находится в
том же сегменте, что и команда JMP. Команда, осуществляющая ближний
переход, занимает 3 байта памяти, так как под смещение к точке перехода
отводится два байта и один бай занимает код операции (E9).
 Дальний переход (переход типа FAR) – если адрес перехода находится в
другом сегменте. Команда дальнего перехода имеет длину 5 байтов и
включает, кроме кода операции (EA), полный адрес точки перехода, то есть
16-разрядный сегментный адрес (два байта), и 16-разрядное смещение (два
байта).
Команды условных переходов Jxx. Все команды условных переходов
обеспечивают только внутрисегментные переходы.
43
Условный переход проверяет текущее состояние флагов или регистров,
чтобы определить, передать управление в другую точку программы или нет,
поэтому обычно реализуется в два шага: сначала сравниваются некоторые
величины, в результате чего соответствующим образом формируются флаги, а
затем выполняется условный переход. В связи с этим рассмотрим и команду
сравнения CMP:
CMP операнд_1, операнд_2
Команда сравнения CMP работает почти также как команда SUB, но не
записывает на место первого операнда разность между первым и вторым
операндами, а лишь устанавливает в соответствии с результатом флаги нуля ZF,
переноса CF, знака SF и переполнения OF. Практически команда CMP
сравнивает первый операнд со вторым, например, позволяет выяснить,
действительно ли значение первого операнда больше, равно или меньше
значения второго?
Все команды условного перехода записываются единообразно:
Jxx адрес
Мнемокод команд условного перехода начинается буквой «J» (от
«Jump»), за которой следует одна или несколько букв, определяющих условие
передачи управления.
Команды условного перехода можно разделить на три группы:
 Команды перехода по результату команды сравнения CMP. В мнемокодах
этих команд с помощью определенных букв в сокращенном виде
описывается условие перехода. Сокращения «L» (less – меньше) и «G»
(greater – больше) применяются для чисел со знаком, а «A» (above – над) и
«B» (below – под) для чисел без знака. Сокращения «E» (equal – равно) и «N»
(not – отрицание) используются с любыми числами. Ниже в табл. 17
показаны команды условного перехода, используемые после команды
сравнения.
Таблица 17.
Мнемокод Содержательное условие для CMP Реальное условие перехода
Любые числа
JE операнд_1 = операнд_2 ZF=1
JNE операнд_1 <> операнд_2 ZF=0
Числа со знаком
JL/JNGE операнд_1 < операнд_2 SF<>OF
JLE/JNG операнд_1 < = операнд_2 SF<>OF или ZF=1
JG/JNLE операнд_1 > операнд_2 SF=OF и ZF=0
JGE/JNL операнд_1 = > операнд_2 SF=OF
Числа без знака
JB/JNAE операнд_1 < операнд_2 CF=1
JBE/JNA операнд_1 < = операнд_2 CF=1 или ZF=1
JA/JNBE операнд_1 > операнд_2 CF=0 и ZF=0
JAE/JNB операнд_1 = > операнд_2 CF=0

44
В следующем примере проверяется, равно ли содержимое регистра DX
нулю, если содержимое DX равно 0, CMP устанавливает флаг ZF в единицу, и
возможно, изменяет состояния других флагов в зависимости от их исходного
состояния. Команда JE проверяет только флаг ZF и если ZF=1, команда JE
загружает в регистр IP значение 110h, таким образом, следующая команда
имеет адрес CS:110h:
CMP DX,0
JE 110

В случае если ZF=0, новое значение в регистр IP не загружается и
выполняется команда, следующая по порядку за командой условного перехода
JE.
 Команды перехода по состоянию определенного флага. Флаги, проверяемые
командой, кодируются в ее мнемонике, например: JC – переход, если
установлен CF, а JNC – переход, если флаг CF сброшен.
Таблица 18.
Мнемокод Условие перехода Мнемокод Условие перехода
JZ ZF=1 JNZ ZF=0
JS SF=1 JNS SF=0
JC CF=1 JNC CF=0
JO OF=1 JNO OF=0
JP/JPE PF=1 JNP/JPO PF=0
Очевидно, получаем по табл. 17 и табл. 18 следующие эквивалентные
мнемокоды: JE/JZ, JNE/JNZ, JB/JC, JNB/JNC.
 Команда перехода по содержимому регистра CX. В эту группу входит
команда, проверяющая значение регистра CX:
JCXZ адрес ; Переход, если CX=0
5.2. Логические команды
Логические операции конъюнкции, дизъюнкции, отрицания и другие,
действующие по правилам формальной (булевой) логики, интенсивно
используются в программировании [9]. Соответствующие им логические
команды манипулируют битами операндов и устанавливают флаги CF, OF, PF,
SF, ZF соответственно вычисленной величине (флаг AF остается
неопределенным).
Команды AND, OR, XOR выполняют соответственно операции логическое
И (конъюнкцию), логическое ИЛИ (дизъюнкцию) и исключающее логическое
ИЛИ для двух операндов и помещают результат на место первого операнда.
При этом флаги CF и OF обнуляются, PF, SF и ZF устанавливаются в
соответствии с результатом, флаг AF не определен. В качестве операндов
логических команд могут выступать те же операнды, что и у команд сложения
и вычитания.
При использовании команды AND биты результата окажутся равными
нулю, если равны нулю биты одного из операндов:
45
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
Это свойство легко использовать для выделения отдельных битов первого
операнда, если указать в качестве второго операнда специальную маску.
Нулевые биты маски обнуляют соответствующие разряды первого операнда, а
единичные оставляют соответствующие биты первого операнда без изменения.
Маску можно извлекать из регистра или памяти и можно задавать
непосредственно в команде, например:
AND BL,0Fh ; Установка старших 4 битов регистра BL в 0
AND BL,00h ; Обнуление регистра BL
При использовании команды OR бит результата равен единице, когда
равен единице хотя бы один бит одного из операндов:
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
Эта команда обычно используется для установки в единицу заданных
битов первого операнда с помощью маски. Нулевые биты маски оставляют
биты первого операнда без изменения, а единичные устанавливают в единицу
соответствующие биты первого операнда, например:
OR BX,0C000h ; Установка 14 и 15 битов регистра BX в 1
Команда XOR соответствует логической операции исключающее ИЛИ,
которая описывается фразой «или то, или другое, но не то и другое
одновременно», то есть там, где биты имеют одинаковые значения, получается
ноль, там, где биты имеют различные значения – единица:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
Команда XOR используется, если надо выяснить, в каких битах значения
операндов различаются, или выполнить инверсию заданных битов.
В случае, когда операнды команды XOR совпадают, результатом будет
ноль, так как биты в одном и том же операнде попарно равны и результат
операции XOR над каждой парой бит будет нулевым. Например, команда
XOR AX,AX обнуляет регистр AX и выполняется быстрее по сравнению с
другими командами: MOV AX,0 или SUB AX,AX.
Использование команды XOR позволяет выполнить инверсию двоичных
разрядов, например:
XOR BX,0C000h ; Инверсия 14 и 15 битов регистра BX
Команда TEST производит те же действия, что и команда AND, но не
изменяет своих операндов, а лишь устанавливает соответствующие флаги. В
некоторых случаях команда AND не очень удобна, потому что «портит» число
46
в первом операнде, чтобы этого не произошло, применяется команда TEST,
которая только устанавливает флаги согласно операции логического И над
своими операндами. В результате команды TEST флаг ZF устанавливается в 1,
если получился нулевой результат, и флаг ZF сбрасывается в 0, если какие-либо
соответствующие биты обоих операндов одновременно равны 1.
Команда TEST обычно применяется для проверки, являются ли какие-то
разряды операнда нулевыми с последующими командами условного перехода
JZ/JNZ, например:
TEST BL,00000001b ; Проверка на нечетное число в регистре BL
JNZ адрес ; Переход, если BL нечетное число
Команда NOT выполняет инверсию каждого бита операнда, устанавливая
биты, равные нулю, в 1, а биты, равные 1, сбрасывая в 0:
0 NOT 1
1 NOT 0
Значения флагов при этом не изменяются.
5.3. Команды сдвига и циклического сдвига
Команды сдвига, являющиеся важным компонентом логических
возможностей компьютера, имеют два операнда. Первый операнд может быть
либо регистром, либо ячейкой памяти и рассматривается как набор битов,
которые будут сдвигаться на несколько позиций влево или вправо. Второй
операнд – счетчик сдвигов, его значение рассматривается как целое без знака и
может быть равным 1, или значением от 0 до 31 в регистре CL, таким образом,
данные команды могут сдвигать до 8 бит в байте, до 16 бит в слове или до 32
бит в двойном слове.
Общая черта всех команд сдвига – использование флага переноса CF для
хранения выдвигаемого бита. Команды сдвига и циклического сдвига можно
разделить на команды логического (без учета знака) и арифметического (с
учетом знака) сдвига.
Команды логического сдвига вправо SHR и влево SHL. Логические
команды выполняют сдвиг для беззнаковых данных. В команде логического
сдвига SHR (SHL) биты первого операнда перемещаются на указанное число
позиций вправо (влево), при этом младший (старший) бит, уходящий за
пределы операнда, заносится в флаг CF, а с другого конца на место старшего
(младшего) бита добавляется 0.
0 CF

SHR

CF 0

SHL
Рис. 16. Схемы команд логического сдвига SHR/SHL.

47
Команды арифметического сдвига вправо SAR и влево SAL. Команды
арифметического сдвига используются для действий над числами со знаком,
так как они выбирают бит для добавления на появившееся место таким
образом, чтобы сохранить знак операнда.
Команда SAR использует бит знака для заполнения крайних слева
освобождающихся битов, поэтому при ее использовании положительные и
отрицательные числа сохраняют свой знак. При сдвигах влево правые биты
заполняются нулями и результат команда SAL в точности совпадает с командой
SHL (точнее, SAL и SHL – это разные мнемонические названия одной и той же
машинной команды).
CF

SAR

CF 0

SAL
Рис. 17. Схемы команд арифметического сдвига SAR/SAL.
Следующая последовательность команд демонстрирует использование
SHR для сдвига беззнаковых данных:
Команда Комментарий Двоичное Десят. CF
MOV CL,2 ; Установка величины сдвига
MOV BH,10110111b ; Инициализация BH 10110111 183
SHR BH,1 ; Сдвиг BH на 1 бит вправо 01011011 91 1
SHR BH,CL ; Сдвиг BH еще на 2 бита вправо 00010110 22 1
Первая команда SHR сдвигает содержимое регистра BH вправо на 1 бит.
Выдвинутый бит попадает в флаг CF, а самый левый бит регистра BH
заполняется нулем. Вторая команда сдвигает содержимое регистра BH еще на 2
бита. Флаг CF в результате будет хранить 1, а в два левых бита в регистре BH
последовательно вводятся 2 нуля.
Рассмотрим действие команд арифметического сдвига вправо SAR при
работе с числами со знаком:
Команда Комментарий Двоичное Десят. CF
MOV CL,2 ; Установка величины сдвига
MOV BH,10110111b ; Инициализация BH 10110111 -73
SAR BH,1 ; Сдвиг BH на 1 бит вправо 11011011 -37 1
SAR BH,CL ; Сдвиг BH еще на 2 бита вправо 11110110 -10 1
Сдвиг вправо особенно полезен в качестве деления значений пополам и
выполняется значительно быстрее, чем операция деления. В приведенных
примерах сдвиг на один бит вправо производит деление на 2, а сдвиг на 2 бита
– деление на 4.
Деление пополам положительных нечетных чисел, например, 5 и 7
образует меньшие значения (2 или 3, соответственно) и устанавливает флаг CF

48
в 1. При делении пополам отрицательных нечетных чисел округление
происходит не в сторону нуля, а в сторону отрицательной бесконечности.
Например, при делении числа -5 на 2 командой SAR получим ответ -3,
записанный в дополнительном коде.
Сдвиг влево на одну позицию эквивалентен умножению на 2. Сдвиг влево
на k позиций умножает число на степень двойки, равную числу сдвигов.
Однако необходимо следить, чтобы результат сдвига умещался в отведенной
ему ячейке. Пытаясь сдвинуть число -65, занимающее один байт, получим
неправильный результат, потому что путем сдвига в одном байте можно
реализовать умножение на 2 знаковых чисел в диапазоне от -64 до 63 и
беззнаковых чисел, меньших 128.
В командах циклического сдвига в отличие от обычных сдвигов
«уходящий» бит не теряется, а возвращается в операнд, но с другого конца.
Команды циклического сдвига вправо ROR и влево ROL. В команде ROR
все биты сдвигаются вправо, причем самый правый бит возвращается в
освободившуюся позицию слева и одновременно заносится в флаг CF, а в
команде ROL все аналогично, только сдвиг выполняется влево. Команды
ROR/ROL выполняют циклический сдвиг битов логически (без учета знака).
CF

ROR

CF

ROL
Рис. 18. Схемы команд циклического сдвига ROR/ROL.
Приведенная ниже последовательность инструкций демонстрирует
использование команды ROR:
Команда Комментарий Двоичное CF
MOV BL,183b ; Инициализация BL 10110111
ROR BL,1 ; Циклический сдвиг BL на 1 бит вправо 11011011 1
MOV CL,3 ; Установка величины сдвига
ROR BL,CL ; Циклический сдвиг BL еще на 3 бита вправо 01111011 0
Первая инструкция ROR перемещает первый справа бит в крайнюю
левую позицию и одновременно заносит его в CF. Вторая инструкция ROR
перемещает по очереди 3 младших бита в первую справа позицию и
одновременно в CF.
Команды циклического сдвига вправо RCR и влево RCL с переносом.
Команды RCR/RCL трактуют флаг переноса CF как дополнительный бит в
операции сдвига, выполняя циклический сдвиг битов арифметически (с учетом
знака). По команде RCR все биты сдвигаются на одну позицию вправо, при
этом самый правый бит заносится в CF, а предыдущий бит из CF заносится в

49
освободившуюся позицию слева. В команде RCL все аналогично, только сдвиг
выполняется влево.
CF

RСR

CF

RCL
Рис.19. Схемы команд циклического сдвига RCR/RCL.
Команды циклического сдвига ROR/ROL обычно используются для
перестановки частей содержимого ячейки или регистра, команды RCR/RCL
обычно используются при переносе битов из одного регистра (или переменной)
в другой.
Сдвиги на единицу изменяют значение флага OF: для SAL, SHL и
ROR/ROL, RCR/RCL флаг OF устанавливается в 1, если после сдвига
изменилось значение самого старшего бита. SHR устанавливает OF в 0, а SAR –
в значение старшего бита исходного числа. Для сдвигов на несколько разрядов
значение OF не определено.
Для команд сдвига SHR/SHL, SAR/SAL флаги ZF, SF, PF
устанавливаются в соответствии с результатом, флаг AF – не определен.
Команды циклических сдвигов не меняют значения флагов ZF, SF, PF, AF.
После операции сдвига можно использовать инструкцию JC для проверки
состояния флага CF.
Порядок выполнения лабораторной работы:
1. Изучите команды безусловного (JMP) и условного (Jxx) переходов,
используя приведенный в п. 5.1 материал.
2. Изучите логические команды и команды сдвига, используя приведенный в
п. 5.2 – п. 5.3 материал.
3. Выполните задания I – V согласно варианту. Результаты выполнения
заданий оформите в виде отчета в редакторе Microsoft Word. Отчет должен
содержать тексты программ в машинном коде и в мнемокоде и включать
необходимые для выполнения задания команды DEBUG и результаты их
работы.
5.4. Задания к лабораторной работе №5
I. Загрузите в отладчике файл mas.com, начиная с адреса 100h (см. лаб. р.
№2). Выполните программу в DEBUG. Программа должна записывать в
память, начиная с адреса 200h, массив, состоящий из повторяющегося
несколько раз числа.
II. Введите в DEBUG программу (с адреса 100h), которая вычисляет сумму
элементов массива согласно Вашему варианту и помещает результат
вычислений в элемент массива с заданным номером (см. табл. 19).
Выполните программу в DEBUG.

50
Таблица 19.
Номер варианта для задания II
№ Элементы массива Результат,
от до эл-т №
0 1 3 8
1 2 5 7
2 3 5 4
3 5 9 4
4 6 11 10
5 3 10 5
6 7 10 6
7 2 11 8
8 4 9 1
9 4 7 3
III. Введите в DEBUG программу (с адреса 100h), которая вычисляет
произведение элементов массива с номерами согласно Вашему варианту
и помещает результат в элемент массива с заданным номером (см.
табл. 20). Выполните программу в DEBUG.
Таблица 20.
Номер варианта для задания III
№ Множимое, Множитель, Результат
эл-т № эл-т № Старшая часть, Младшая часть,
эл-т № эл-т №
0 1 3 2 5
1 2 7 1 3
2 6 4 3 2
3 3 2 7 10
4 3 2 7 10
5 5 5 9 8
6 6 1 2 8
7 8 2 4 5
8 2 5 5 11
9 3 5 8 1
IV. Введите в DEBUG программу (с адреса 100h), которая вычисляет
выражение F = Y оп1 КОН1 оп2 Х оп3 КОН2, где
КОН1, КОН2 – числовые константы;
оп1, оп2, оп3 – операции сложения, вычитания, умножения и деления.
Для выполнения операций умножения и деления необходимо
использовать команды сдвига;
X, Y – переменные, содержащие произвольные беззнаковые или
знаковые данные.
51
Числовые константы определяются согласно первой цифре варианта (см.
табл. 21), операции – согласно второй цифре варианта (см. табл. 22), а
тип переменных – согласно третьей цифре варианта (см. табл. 23).
Переменная Y хранится в памяти по адресу 0300h, X – по адресу 0400h.
Результат вычисления выражения, полученный при выполнении
программы, располагается по адресу 1000h.
Таблица 21.
Первая цифра варианта для задания IV 3

№ 0 1 2 3 4 5 6 7 8 9
КОН1 10 96 20 12 130 24 64 32 6 40
КОН2 32 16 8 4 128 64 36 22 14 72
Таблица 22.
Вторая цифра варианта для задания IV
№ 0 1 2 3 4 5 6 7 8 9
оп1 / / * * / * — + / *
оп2 — + — + — / * * + +
оп3 * * / / * + / / — —
Таблица 23.
Третья цифра варианта для задания IV
№ 0 1 2 3 4 5 6 7 8 9
X байт, байт, слово, слово, слово, байт, слово, байт, байт, слово,
со без со без со без без со со без
знаком знака знаком знака знаком знака знака знаком знаком знака
Y слово, слово, байт, байт, слово, слово, слово, слово, байт, байт,
со без со без со без без со со без
знаком знака знаком знака знаком знака знака знаком знаком знака
V. Выполните в DEBUG проверку полученного результата F на четность
либо нечетность и знак числа.

3
В табл. 21 числовые константы записаны в десятичном формате.
52
Приложение А. Набор символов ASCII
Аббревиатура ASCII расшифровывается как American Standard Code for
Information Interchange – Американский Стандартный Код для Обмена
Информацией. В табл. 24 приведены коды и графические представления для
256 символов ASCII (от 00h до FFh). Символы ASCII делятся на следующие
группы:
 00h – 1Fh – управляющие символы для дисплея, принтера и передачи
данных, предназначенные для запроса определенных действий;
 20h – 7Fh – символы букв английского алфавита, цифры и знаки пунктуации,
включая символ пробела – 20h;
 80h – FFh – символы расширенной таблицы ASCII, включая символы букв
национальных алфавитов, букв греческого алфавита, математических
символов и символов псевдографики.
Таблица 24.
Кодовая таблица ASCII – символов (номер 866)

53
Список литературы
1. Савин А.Н. Программирование аппаратных средств компьютеров IBM PC
AT: Учеб. пособие. – Саратов: ООО Издательский Центр «Наука», 2012. –
116 с.
2. Рудольф Марек. Ассемблер на примерах. Базовый курс. – СПб: Наука и
Техника, 2005. – 240 с.
3. Микропроцессорный комплект К1810: Структура, программирование,
применение: Справочная книга / Ю.М. Казаринов, В.Н. Номоконов,
Г.С. Подклетнов, Ф.В. Филиппов; Под ред. Ю.М. Казаринова. – М. : Высш.
шк., 1990. – 269 с.
4. Микропроцессоры и микропроцессорные комплекты интегральных
микросхем: Справочник: В 2 т. / Н.Н. Аверьянов, А.И. Березенко,
Ю.И. Борщенко и др.; Под ред. В.А. Шахнова. – М. : Радио и связь, 1988. –
T. 2 – 386 с.
5. Питер Абель. Ассемблер. Язык и программирование для IBM PC: пер. с
англ. – К. : Век.+, – М. : ЭНТРОП, К. : НТИ, 2003. – 736 с.
6. Бройдо В.Л., Ильина О.П. Вычислительные системы, сети и
телекоммуникации. – М. ; СПб. [и др.] : Питер, 2011. – 554 с.
7. Бройдо В.Л., Ильина О.П. Архитектура ЭВМ и систем. – М. ; СПб. [и др.] :
Питер, 2009. – 720 с.
8. Степанов А.Н. Архитектура вычислительных систем и компьютерных
сетей. – М. ; СПб. [и др.] : Питер, 2007. – 508 с.
9. Пильщиков В.Н. Программирование на языке ассемблера IBM PC. – М.:
Диалог-Мифи, 2008. – 286 с.

54
Оглавление
Предисловие ....................................................................................................................................... 3
1. Лабораторная работа №1 «Архитектура IBM PC-совместимого персонального
компьютера. Отладчик DEBUG»...................................................................................................... 4
1.1. Архитектура компьютеров IBM PC ................................................................................... 4
1.2. Процессор Intel 8086 ........................................................................................................... 5
1.3. Программная модель процессора Intel 8086 ..................................................................... 9
1.4. Сегментация памяти и вычисление адресов ................................................................... 14
1.5. Команды программы DEBUG для разработки и отладки программ в машинных
кодах и в мнемокодах .................................................................................................................. 15
1.6. Задания к лабораторной работе №1................................................................................. 22
2. Лабораторная работа №2 «Способы адресации памяти и их применение при пересылке
данных» ............................................................................................................................................. 27
2.1. Режимы адресации памяти в процессорах Intel 8086..................................................... 27
2.2. Команды пересылки данных ............................................................................................ 29
2.3. Использование оператора указания типа ........................................................................ 30
2.4. Задания к лабораторной работе №2................................................................................. 31
3. Лабораторная работа №3 «Инструкции для выполнения арифметических операций
сложения и вычитания» ................................................................................................................... 33
3.1. Команды сложения и вычитания, их воздействие на флаги ......................................... 33
3.2. Команды расширения знака ............................................................................................. 36
3.3. Задания к лабораторной работе №3................................................................................. 37
4. Лабораторная работа №4 «Инструкции для выполнения арифметических операций
умножения и деления» .................................................................................................................... 39
4.1. Команды умножения и деления, их воздействие на флаги ........................................... 39
4.2. Задания к лабораторной работе №4................................................................................. 41
5. Лабораторная работа №5 «Логические операции и управляющие структуры» ................ 43
5.1. Команды передачи управления ........................................................................................ 43
5.2. Логические команды ......................................................................................................... 45
5.3. Команды сдвига и циклического сдвига ......................................................................... 47
5.4. Задания к лабораторной работе №5................................................................................. 50
Приложение А. Набор символов ASCII ......................................................................................... 53
Список литературы .......................................................................................................................... 54
Оглавление........................................................................................................................................ 55

55
Учебное издание

ВАХЛАЕВА Клавдия Павловна


САВИН Александр Николаевич
ФЕДОРОВА Антонина Гавриловна

ОРГАНИЗАЦИЯ
И ПРОГРАММНАЯ МОДЕЛЬ
ПРОЦЕССОРА INTEL 8086

Учебное пособие для студентов высших учебных заведений,


обучающихся по направлениям
«Информатика и вычислительная техника»,
«Фундаментальная информатика и информационные технологии»,
«Математическое обеспечение и администрирование
информационных систем», «Программная инженерия»

Подписано в печать 25.02.2013. Формат 6084 1/16. Бумага офсетная.


Гарнитура Times New Roman. Печать RISO. Объем 3,5 печ л. Тираж 200 экз.
Заказ № 087.

ООО Издательский Центр «Наука»


410600, г. Саратов, ул. Пугачевская, 117, оф. 50

Отпечатано с готового оригинал-макета


Центр полиграфических и копировальных услуг
Предприниматель Серман Ю.Б. Свидетельство № 3117
410600, г. Саратов, ул. Московская, 152, офис 19, тел. 26-18-19, 51-16-28
56