лабораторный практикум

ЛАБОРАТОРНАЯ РАБОТА № 1
Архитектура ЭВМ на базе процессоров Intel
Цель работы: изучить структурную организацию ЭВМ, построенную на базе процессоров Intel, набор и доступность регистров процессора Intel 8086, организацию оперативной памяти, способы представления и форматы данных ЭВМ.
Основные понятия
Архитектура ЭВМ и ее структурная схема
Архитектура ЭВМ это абстрактное представление ЭВМ, которое отражает ее структурную, схемотехническую и логическую организацию. Понятие архитектуры ЭВМ является комплексным и включает в себя:
–  структурную схему ЭВМ;
–  средства и способы доступа к элементам структурной схемы ЭВМ;
–  организацию и разрядность интерфейсов ЭВМ;
–  набор и доступность регистров;
– организацию и способы адресации памяти;
–  способы представления и форматы данных ЭВМ;
–  набор машинных команд ЭВМ;
–  форматы машинных команд;
–  обработку нештатных ситуаций (прерываний).
Структурную схему ЭВМ можно представить в виде отдельных модулей, объединенных каналом обмена информации. Набор модулей, входящих в состав ЭВМ, может быть достаточно велик и изменяется в зависимости от назначения конкретной машины. Одна из возможных структур ЭВМ приведена на рис. 1.1.
Согласно этому рисунку, в состав ЭВМ входят центральный процессор, оперативная память и периферийные устройства ввода-вывода, такие, как, видео (монитор и видеоадаптер), аудио (адаптер звуковых устройств и динамики), накопители на жестком магнитном диске (НЖМД) и гибком магнитном диске (НГМД) с соответствующими адаптерами, принтер и модем, которые подключаются через ЭВМ через стандартные средства расширения. К таким стандартным средствам расширения относят параллельный и последовательный интерфейсы.
Все указанные устройства объединяются в систему посредством общего канала обмена информацией, называемого интерфейсом "общая шина".

13 EMBED Word.Picture.8 1415
Рис. 1.1. Структурная схема ЭВМ
Общая шина состоит из трех частей: шины адреса, шины данных и шины управления. Непосредственно для обмена информацией между отдельными устройствами ЭВМ предназначена шина данных. За исключением режима прямого доступа к памяти, управление обменом информации по шине данных осуществляет центральный процессор. В этом случае он выступает в качестве одной из сторон обмена (источником или приемником). Другая из сторон – оперативная память, или периферийное устройство. Центральный процессор использует шину адреса для указания, с каким именно устройством, и какой его частью происходит обмен. Шина управления предназначена для передачи в оперативную память или периферийное устройство управляющей информации о том, какая именно операция производится: считывание или запись.
Разрядности шины данных и шины адреса определяют такие характеристики ЭВМ, как разрядность центрального процессора и максимальный объем оперативной памяти соответственно.
Центральный процессор
Центральный процессор – основное устройство ЭВМ, выполняющее управление обменом информации по интерфейсу "общая шина" и все необходимые арифметико-логические операции обработки информации. Ниже будут рассмотрены основы архитектуры процессора Intel 8086 – родоначальника семейства процессоров Intel x86 и Intel Pentium. На базе этого семейства в настоящее время построено большинство персональных компьютеров (ПК).
В состав центрального процессора входят устройство управления и блок микрокоманд, регистровая память, арифметико-логическое устройство и кэш-память 1-го уровня.
Устройство управления предназначено для организации обмена информации между центральным процессором и остальными частями ЭВМ. С помощью этого устройства процессор считывает команды и данные из оперативной памяти и записывает данные в память. Другой его функцией является дешифрирование кодов команд.
Результат дешифрирования используется блоком микрокоманд, для генерации так называемой микропрограммы – последовательности внутренних сигналов процессора, обеспечивающих совместное функционирование устройств центрального процессора с целью исполнения той или иной команды.
Регистровая память используется центральным процессором для хранения данных и управляющей информации. Регистровая память образуется так называемыми регистрами, которые представляют собой ячейки памяти, входящие в состав процессора и доступные из машинной программы. Доступ к регистрам осуществляется значительно быстрее, чем к ячейкам оперативной памяти, поэтому использование регистров заметно уменьшает время выполнения программ.
Все регистры центрального процессора Intel 8086 имеют размер слова (два байта – 16 битов), за каждым из них закреплено определенное имя (AX, SP и т.п.).
По назначению и способу использования регистры можно разбить на следующие группы:
–  регистры общего назначения (AX, BX, CX, DX, BP, SI, DI, SP);
–  сегментные регистры (CS, DS, SS, ES);
–  счетчик команд (IP);
–  регистр флагов (Flags).
Запомнить названия регистров совсем не сложно, если учесть, что вторая буква 'X' в названиях регистров означает принадлежность к группе регистров, предоставляющих доступ к отдельным байтам, вторая буква 'S' – принадлежность к группе сегментных регистров. Дальнейшая расшифровка этих названий: A – accumulator (аккумулятор); B – base (база); C – counter (счетчик); D – data (данные); BP – base pointer (указатель базы); SI – source index (индекс источника); DI – destination index (индекс приемника); SP – stack pointer (указатель стека); CS – code segment register (сегментный регистр кода команд); DS – data segment register (сегментный регистр данных); SS – stack segment register (сегментный регистр стека); ES – extension segment register (дополнительный сегментный регистр данных); IP – instruction pointer (счетчик команд).
Регистры общего назначения применяются для хранения данных. Их можно использовать во всех арифметических и логических командах. В то же время каждый их них имеет определенную специализацию (некоторые команды "работают" только с определенными регистрами). Например, команды умножения и деления требуют, чтобы один из операндов находился в регистре AX или в регистрах AX и DX (в зависимости от размера операнда), а команды управления циклом используют регистр CX в качестве счетчика цикла. Регистры BX и BP очень часто используются как базовые регистры при обращении к памяти, а SI и DI – как индексные. Регистр SP обычно указывает на вершину стека – специально организованной области памяти, аппаратно поддерживаемой в ЭВМ.
Регистры AX, BX, CX и DX конструктивно устроены так, что возможен независимый доступ к их старшей и младшей половинам; можно сказать, что каждый из этих регистров состоит из двух байтовых регистров, обозначаемых AH, AL, BH и т.д. (H – high, старший; L – low, младший):
AX:
AH
AL

BX:
BH
BL

CX:
CH
CL

DX:
DH
DL

Биты:
15 8
7 0

Таким образом, с каждым из этих регистров можно работать как с единым целым, а можно работать и с его "половинками". Например, можно записать слово в AX, а затем считать только часть слова из регистра AH или заменить только часть в регистре AL и т.д. Такое устройство регистров позволяет использовать их для работы и с числами, и с символами.
Все остальные регистры на "половинки" не делятся, поэтому считать или записать их содержимое (16 битов) можно только целиком.
Сегментные регистры CS, DS, SS и ES используются при формировании адресов команд и данных, расположенных в оперативной памяти. Они не могут быть операндами никаких команд, кроме команд пересылки и стековых команд.
Счетчик команд IP всегда содержит адрес (смещение от начала программы) той команды, которая должна быть выполнена следующей (начало программы хранится в регистре CS). Содержимое регистра IP можно изменить только командами перехода.
В процессоре имеется особый регистр флагов. Флаг – это бит, принимающий значение 1 ("флаг установлен"), если выполнено некоторое условие, и значение 0 ("флаг сброшен") в противном случае. В процессоре Intel 8086 используется 9 флагов, каждому из них присвоено определенное имя (ZF, CF и т.д.). Все они собраны в 16-разрядном регистре флагов (каждый флаг – это один из разрядов регистра, часть его разрядов не используется). Формат регистра флагов, отражающий распределение отдельных флагов по битам этого регистра, приведен на рис. 1.2.

Рис. 1.2. Формат регистра флагов
Непосредственного доступа как к отдельным флагам, так и к регистру флагов в целом центральный процессор не предоставляет.
Некоторые флаги принято называть флагами условий; они автоматически меняются при выполнении команд и фиксируют те или иные свойства их результата (например, равен ли он нулю). Другие флаги называются флагами состояний; они меняются из программы и оказывают влияние на дальнейшее поведение процессора (например, блокируют прерывания).
К флагам условий относят:
–  CF (carry flag) – флаг переноса;
–  OF (overflow flag) – флаг переполнения;
–  ZF (zero flag) – флаг нуля;
–  SF (sign flag) – флаг знака;
–  PF (parity flag) – флаг четности;
–  AF (auxiliary carry flag) – флаг дополнительного переноса.
Флаг переноса (CF) принимает значение 1, если при сложении целых чисел появилась единица переноса, не "влезающая" в разрядную сетку, или если при вычитании чисел без знака первое из них было меньше второго. В командах сдвига в CF заносится бит, вышедший за разрядную сетку. CF фиксирует также особенности команды умножения.
Флаг переполнения (OF) устанавливается в 1, если при сложении или вычитании целых чисел со знаком получился результат, по модулю превосходящий допустимую величину (произошло переполнение мантиссы и она "залезла" в знаковый разряд).
Флаг нуля (ZF) устанавливается в 1, если результат команды оказался равным 0.
Флаг знака (SF) устанавливается в 1, если в операции над знаковыми числами получился отрицательный результат.
Флаг четности (PF) равен 1, если результат очередной команды содержит четное количество двоичных единиц. Учитывается обычно только при операциях ввода-вывода.
Флаг дополнительного переноса (AF) фиксирует особенности выполнения операций над двоично-десятичными числами.
К флагам состояний относят:
–  DF (direction flag) – флаг направления;
–  IF (interrupt enable flag) – флаг разрешения прерываний;
–  TF (trap flag) – флаг трассировки.
Флаг направления (DF) устанавливает направление просмотра областей памяти в цепочечных командах: при DF = 0 области просматриваются "вперед" (от начала к концу), при DF = 1 – в обратном направлении.
Флаг разрешения прерываний (IF): при IF = 0 процессор перестает реагировать на поступающие к нему прерывания, при IF = 1 блокировка прерываний снимается.
Флаг трассировки (TF): при TF = 1 после выполнения каждой команды процессор делает прерывание (с номером 1), чем можно воспользоваться при отладке программы для ее трассировки.
Арифметико-логическое устройство предназначено для организации переработки информации внутри центрального процессора. Оно позволяет выполнять арифметические и логические операции над данными, а также сдвиги. К арифметическим операциям относятся: сложение, вычитание, умножение и деление. В состав логических операций входят: отрицание, операция "И", операция "ИЛИ" и операция "ИСКЛЮЧАЮЩЕЕ ИЛИ".
Кэш-память является "посредником" между процессором и оперативной памятью. В ней хранятся наиболее часто используемые участки оперативной памяти. Время доступа процессора к кэш-памяти в несколько раз меньше, чем к обычной памяти. За счет этого среднее время доступа к памяти значительно сокращается.
Оперативная память
Оперативная память предназначена для хранения программ и данных. Ее можно рассматривать как конечную последовательность ячеек, имеющих размер 1 байт. Номер байта в этой последовательности называется физическим адресом (или просто адресом).
Физический адрес используется для получения доступа к конкретной ячейке памяти. Именно эта информация выставляется центральным процессором на шину адреса.
Для обеспечения доступа к оперативной памяти в процессоре Intel 8086 и процессорах последующих поколений, работающих в реальном режиме, используется так называемая сегментированная модель памяти.
В сегментированной модели вводится понятие "сегмента". Так называется любой участок памяти размером до 64 Кб и с начальным адресом, кратным 16. Физический адрес формируется процессором на основании этого начального адреса и смещения конкретной ячейки памяти относительно начала сегмента. Для хранения начального адреса сегмента применяются сегментные регистры процессора.
Процессор обеспечивает доступ к четырем сегментам одновременно. Эти сегменты называются сегментом кода, сегментом данных, сегментом стека и дополнительным сегментом данных.
Сегмент кода содержит команды программы. Для доступа к этому сегменту используется сегментный регистр cs. Он содержит адрес сегмента с машинными командами.
Сегмент данных содержит обрабатываемые программой данные. Для доступа к этому сегменту служит сегментный регистр DS, который хранит адрес сегмента данных текущей программы.
Сегмент стека – этот сегмент представляет собой область памяти, называемую стеком. Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этому сегменту служит сегментный регистр ss, содержащий адрес сегмента стека.
Дополнительный сегмент данных применяется в некоторых командах для организации обмена информации между этим сегментом и сегментом данных. Адрес дополнительного сегмента данных должен содержаться в сегментном регистре es.
Представление данных
С представлением данных в памяти ЭВМ тесно связано понятие типа данных.
Понятие типа данных носит двойственный характер. С точки зрения размерности микропроцессор аппаратно поддерживает следующие основные типы данных.
Байт – восемь последовательно расположенных битов, пронумерованных от 7 до 0, при этом бит 0 является самым младшим значащим битом.
Слово – последовательность из двух байт, имеющих последовательные адреса. Размер слова – 16 бит; биты в слове нумеруются от 15 до 0. Байт, содержащий нулевой бит, называется младшим байтом, а байт, содержащий 15-й бит, – старшим байтом. Процессоры Intel имеют важную особенность – младший байт всегда хранится по меньшему адресу. Адресом слова считается адрес его младшего байта. Адрес старшего байта может быть использован для доступа к старшей половине слова.
Двойное слово – последовательность из четырех байт (32 бита), расположенных по последовательным адресам. Нумерация этих бит производится от 31 до 0. Слово, содержащее нулевой бит, называется младшим словом, а слово, содержащее 31-й бит, старшим словом. Младшее слово хранится по меньшему адресу. Адресом двойного слова считается адрес его младшего слова. Адрес старшего слова может быть использован для доступа к старшей половине двойного слова.
Кроме трактовки типов данных с точки зрения их разрядности, процессор на уровне команд поддерживает логическую интерпретацию этих типов. С точки зрения логической интерпретации выделяют следующие типы данных.
1. Целый тип со знаком – двоичное значение со знаком, размером 8, 16 или 32 бита. Знак в этом двоичном числе содержится в 7, 15 или 31-м бите соответственно. Ноль в этих битах в операндах соответствует положительному числу, а единица – отрицательному. Отрицательные числа представляются в дополнительном коде. Числовые диапазоны для этого типа данных следующие:
–  8-разрядное целое – от – 128 до 127;
–  16-разрядное целое – от – 32 768 до 32 767;
–  32-разрядное целое – от – 231 до 231 – 1.
2. Целый тип без знака – двоичное значение без знака, размером 8, 16 или 32 бита. Числовой диапазон для этого типа следующий:
–  байт – от 0 до 255;
–  слово – от 0 до 65 535;
–  двойное слово – от 0 до 232 – 1.
3. Указатель на память (адрес) бывает двух типов.
Ближний тип – 16-разрядный логический адрес, представляющий собой относительное смещение в байтах от начала сегмента (короткий адрес).
Дальний тип – 32-разрядный логический адрес, состоящий из двух частей: 16-разрядной сегментной части и 16-разрядного смещения (полный адрес).
4. Цепочка представляет собой некоторый непрерывный набор байтов, или слов максимальной длиной до 64 Кбайт.
5. Символ – байт, в который записывается код символа – целое от 0 до 255. В ЭВМ используется система кодировки ASCII (American Standard Code for Information Interchange).
6. Строка – последовательность символов, которая размещается в соседних байтах памяти, так, что код первого символа строки записывается в первом байте, код второго символа - во втором байте и т.п. Адресом строки считается адрес ее первого байта.
7. Неупакованный двоично-десятичный тип – байтовое представление десятичной цифры от 0 до 9. Неупакованные десятичные числа хранятся как байтовые значения без знака по одной цифре в каждом байте. Значение цифры определяется младшим полубайтом.
8. Упакованный двоично-десятичный тип представляет собой упакованное представление двух десятичных цифр от 0 до 9 в одном байте. Каждая цифра хранится в своем полубайте.
СОДЕРЖАНИЕ РАБОТЫ
Ознакомиться с теоретическим материалом.
Дать определение архитектуры ЭВМ.
Описать состав и назначение основных блоков, составляющих структурную схему ЭВМ.
Описать регистровую структуру процессора Intel 8086 и назначение регистров.
Описать механизмы организации оперативной памяти.
Описать способы представления данных в ЭВМ.
ЛАБОРАТОРНАЯ РАБОТА № 2
Программа-отладчик DEBUG как средство практического изучения организации ЭВМ
Цель работы: изучить возможности программы-отладчика DEBUG и приобрести практические навыки работы с ней.
Основные понятия
DEBUG – это системная программа, позволяющая выполнять просмотр и изменение состояний процессора и памяти компьютера, побайтное тестирование и побайтную обработку дисковых файлов, что обеспечивает возможность выполнения отлаживаемых программ небольшими порциями. При этом программа выполняется под "наблюдением" отладчика.
Таким образом, основное назначение этой программы – отладка программ на уровне машинных кодов и языка ассемблера. Однако возможности, предоставляемые этой программой, делают ее удобным инструментом для изучения организации персональных компьютеров.
Запуск отладчика
Чтобы запустить отладчик, в командной строке Windows (Меню Пуск – Выполнить) вводится команда debug (см. рис. 2.1). В качестве параметра команда запуска отладчика может включать имя обрабатываемого файла, например debug lab1.com

Рис. 2.1. Диалог "Запуск программы debug"
Если обрабатываемый файл не записан в текущем каталоге, то в командной строке необходимо указать полный путь к нему.
После нажатия кнопки "OK" диалога запуска отладчик загружается в память машины и переходит в режим ожидания ввода команды.
Команды программы DEBUG
DEBUG – это программа, работающая по принципу "команда – действие", т.е., чтобы произвести некоторую операцию отладчик должен получить соответствующую команду. В качестве сигнала о готовности принять команду, отладчик посылает на экран стандартный запрос – дефис (-).
Для управления процессом отладки в DEBUG применяется набор команд, список которых можно получить, введя команду помощи (символ "Вопрос"). Окно отладчика, в котором выведен список поддерживаемых команд, приведено на рис. 2.2. Более подробное описание этих команд приведено в приложении.
13 EMBED PBrush 1415 Рис. 2.2. Окно программы DEBUG
Общими замечаниями по вводу команд отладчика является следующее:
–  все команды начинаются с буквы, заглавной или строчной;
–  большая часть команд требует введения дополнительных параметров, часть из которых является необязательными;
–  если два подряд расположенных параметра являются числами, то они разделяются пробелом или запятой (в противном случае параметры можно не отделять один от другого);
–  все числа должны вводиться в шестнадцатеричном представлении;
–  некоторые команды принимают в качестве параметра адрес, который может вводиться в двух формах: полный логический адрес – два шестнадцатеричных числа, записанные через двоеточие (первое число – сегментная компонента логического адреса, второе число – смещение) и короткий адрес – одно шестнадцатеричное число (смещение);
–  при указании полного логического адреса допускается в качестве сегментной компоненты приводить имя сегментного регистра, из которого данная компонента будет выбираться.
С точки зрения изучения организации ЭВМ, набор команд, предлагаемый отладчиком, является избыточным. Минимально необходимый набор включает команды:
–  (A)SSEMBLE – ассемблирование;
–  (U)NASSEMBLE – дизассемблирование;
–  (E)NTER – ввод данных в память;
–  (D)UMP – вывод содержимого участка памяти на экран;
–  (R)EGISTER – просмотр и изменение содержимого регистров;
–  (T)RACE – пошаговое выполнение программы;
–  (N)AME – задание имени файла программы;
–  (L)OAD – загрузки файла в память;
–  (W)RITE – запись области памяти в файл;
–  (Q)UIT – выход из отладчика.
Перечисленные команды представляют для нас наибольший интерес. Рассмотрим их подробнее.
Команда ассемблирования (перевод мнемокода ассемблера в машинный код)
Отладчик DEBUG можно использовать для введения операторов ассемблера непосредственно в память машины. Команду ASSEMBLE можно использовать при составлении коротких программ на ассемблере, а также при внесении изменений в существующие программы. Эта команда позволяет вводить мнемокод ассемблера непосредственно в память, избавляя от необходимости транслировать (ассемблировать) программу. Вводимый текст не может включать метки перехода в чистом виде.
При введении команды, необходимо набрать "а" или "A" и, через пробел, необязательный параметр – адрес первой команды загружаемой программы. Если указан короткий адрес, то адрес сегмента выбирается из регистра CS. Если адрес не задан вообще, то машинный код будет помещаться в память, начиная с того места, где закончилась обработка предыдущей командой ASSEMBLE. Если после старта отладчика команда вводится в первый раз и в командной строке отсутствует начальный адрес, то размещение машинного кода производится с адреса CS:0100.
После введения команды ассемблирования на экране появляется начальный адрес. Это сигнал на введение первой команды программы. Если команда введена без ошибок, на экран выдается адрес следующей команды и отладчик опять переходит в режим ожидания. В случае ошибки отладчик обозначает ее месторасположение. Если введены все команды программы, то нажимается Enter – команда ASSEMBLE заканчивает работу и возвращает управление отладчику.
Пример ассемблирования небольшой программы:
-a 097
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
0976:0119 <---- Нажимается Enter
-
Команда дизассемблирования (перевод машинного кода в мнемокод ассемблера)
Команда UNASSEMBLE служит для перевода машинного кода на язык ассемблера. При введении команды необходимо набрать "u" или "U" и, через пробел, необязательные параметры – начальный адрес обрабатываемого кода, конечный адрес обрабатываемого кода или его размер.
В командной строке UNASSEMBLE можно не указывать начальный адрес обрабатываемого кода. Если указан короткий адрес, то адрес сегмента выбирается из регистра CS. Если адрес не задан вообще, то машинный код обрабатывается с того места, где закончилась обработка предыдущей командой UNASSEMBLE. Если после старта отладчика команда вводится в первый раз и в командной строке отсутствует начальный адрес, то обработка машинного кода производится с адреса CS:0100.
Обрабатываемый участок памяти можно определить начальным и конечным адресами. При этом, в не зависимости от формы начального адреса, конечный адрес должен быть коротким.
Другой вариант задания обрабатываемого участка памяти – задание его начального адреса и размера. Чтобы отличить размер от короткого конечного адреса перед ним вводится символ "L".
Если размер участка памяти, обрабатываемой командой UNASSEMBLE, не определен, то по умолчанию длина обрабатываемого участка равна 32 байтам.
Результатом выполнения команды дизассемблирования является листинг программы, сгруппированный в три колонки. В листинге слева (первая колонка) указывается полный логический адрес команды. Затем (вторая колонка) – значение составляющих команду байтов в машинном коде. В третьей колонке находится соответствующая этому коду инструкция ассемблера.
Пример дизассемблирования небольшой программы, введенной в предыдущем примере:
-u CS:0100 L19
0976:0100 B02A MOV AL,2
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·Команда ввода данных в память
Ввод данных осуществляется с помощью команды ENTER. Эта команда позволяет побайтно корректировать содержимое памяти. Команда состоит из буквы e (или E) и адреса первого байта корректируемого блока. Если указан короткий адрес, то адрес сегмента выбирается в регистре DS.
Вводимые данные также включаются в командную строку. Они представляют собой последовательность чисел в шестнадцатеричном представлении и/или символьных значений, разделенных пробелом или запятой. Символьные значения заключаются в апострофы.
Проиллюстрируем работу ENTER на следующем примере:
-e DS:0000 20 2A 44 41 54 41 20 'IS' 20 48 45 52 45 2A 20
Команда вводит 16 значений. Данные последовательно заполняют память (побайтно), начиная с адреса DS:0000. Четырнадцать байтов занимают числа в шестнадцатеричном формате, два байта отводятся под символьную константу 'IS'.
Команда ENTER может использоваться для отображения и, в случае необходимости, корректировки значения конкретного байта. В этом случае команда состоит из буквы e (или E) и следующего за ней адреса. При введении команды на экране появляется адрес байта и его значение:
-e DS:0000
0958:0000 20.
При нажатии на клавишу пробела на экране появляется значение следующего байта:
-e DS:0000
0958:0000 20. 2A.
Значение байта можно изменить. Для этого вводится новое шестнадцатеричное число. Однако символьные переменные в этом случае вводить нельзя.
Чтобы завершить выполнение команды, нажимается Enter. Появление дефиса (-) – стандартного запроса отладчика, свидетельствует о его готовности принять следующую команду.
Команда вывода содержимого участка памяти на экран
Команда DUMP (d или D) служит для отображения на экране содержимого участка памяти. Полученный кусочек памяти – дамп, представляет собой последовательность значений байтов в шестнадцатеричном представлении, а также – в коде ASCII:
-d
0958:0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0958:0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0958:0120 00 00 00 00 00 00 00 00
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·

Адрес Значения в шестнадцатеричном виде, в виде символов
Числа в первом столбце, разделенные двоеточием – это полный логический адрес памяти, следующие 16 столбцов – значения, последовательно содержащиеся в памяти, начиная с этого адреса (в шестнадцатеричном виде), и, наконец, строка из 16 символов – символьное представление этих значений.
Значения, не имеющие символьного представления в коде ASCII, обозначаются символом "точка". В рассмотренном примере изображены только точки, поскольку в коде ASCII не существует печатных символов со значением 00. Дамп отображает содержимое 128 последовательно расположенных байтов. В приведенном выше примере начальный адрес дампа – 0958:0100, конечный – 0958:017F.
Если вводить команду "d" не указывая параметров, DEBUG будет последовательно выводить по 128 байтов памяти. То есть начальный адрес дампа будет на единицу превышать конечный адрес дампа, полученного при введении предыдущей команды "d". Если команда "d" вводится первоначально, то дамп выводится, начиная с адреса, по которому был загружен обрабатываемый файл.
Команда DUMP может использоваться с параметрами, которые задают начальный адрес дампа и его размер. Использование параметров аналогично использованию параметров в команде UNASSEMBLE. За тем исключением, что, если начальный адрес дампа задан в коротком формате, то сегментная компонента адреса выбирается из регистра DS.
Команда просмотра и изменения содержимого регистров
Команда REGISTER (r или R) выводит на экран и корректирует значения регистров и флагов состояния процессора. Эта команда также выдает информацию о следующей выполняемой команде:
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0958 ES=0958 SS=0958 CS=0958 IP=0100 NV UP DI PL NZ NA PO NC
0958:0100 0000 ADD [BX+SI],AL DS:0000=CD
-
С помощью "r" можно изменить значение регистра. В этом случае в командной строке указывается его имя. Значение регистра выводится на экран. Теперь можно вводить новое число. Чтобы сохранить старое значение регистра, нажмите Enter.
-r CX
CX 0000
:245D
-r
AX=0000 BX=0000 CX=245D DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0958 ES=0958 SS=0958 CS=0958 IP=0100 NV UP DI PL NZ NA PO NC
0958:0100 0000 ADD [BX+SI],AL DS:0000=CD
-
Команда "rf" выводит на экран флаги состояния процессора. Получив значения флагов, их можно изменить. Для этого вводится одно или несколько новых значений.
Мнемонические обозначения состояний флагов приведены в табл. 2.2.
Таблица 2.2
Мнемонические обозначения состояний флагов
Флаг
Установлен
Сброшен

Переполнение (есть/нет)
OV
NV

Направления (увеличение/уменьшение)
DN
UP

Прерывания (разрешение/запрещение)
EI
DI

Знака (минус/плюс)
NG
PL

Нуля (да/нет)
ZR
NZ

Дополнительного переноса (да/нет)
AC
NA

Паритета (чет/нечет)
PE
PO

Переноса (да/нет)
CY
NC

Символьные значения вводятся в любом порядке через пробел или вообще без разделителя. Установим, например, значения флагов переполнения, знака и переноса:
-rf
NV UP DI PL NZ NA PO NC -OV NG CY <- Подчеркнутое вводит пользователь
-r
AX=0000 BX=0000 CX=245D DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0958 ES=0958 SS=0958 CS=0958 IP=0100 OV UP DI NG NZ NA PO CY
0958:0100 CD20 INT 20
-
Команда пошагового выполнения программы
Команда TRACE (t или T) – трассировка осуществляет пошаговое выполнение программы в машинном коде. При трассировке после выполнения каждой команды производится останов работы программы и на экран выводятся регистры и флаги состояния процессора. Полученная картинка аналогична картинке, получаемой с помощью команды REGISTER. Разница заключается только в том, что при введении TRACE перед появлением картинки, выполняется одна команда отлаживаемой программы.
Проиллюстрируем работу TRACE на примере нашей программы. Если она не загружена в память, то запустим DEBUG и введем:

-e CS:0100 B0 2A BF 00 02 B9 1D 00 FC F2 AA B0 24
-e CS:010D AA 06 1F BA 00 02 B4 09 CD 21 CD 20
-
Чтобы узнать адрес программы, введем команду REGISTER:
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0976 ES=0976 SS=0976 CS=0976 IP=0100 NV UP DI PL NZ NA PO NC
0976:0100 B001 MOV AL,2A
-
При введении "t" выполняется команда по адресу CS:IP. После этого на экран выводятся регистры и флаги состояния:
-t
AX=002A BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0976 ES=0976 SS=0976 CS=0976 IP=0102 NV UP DI PL NZ NA PO NC
0976:0102 BF0002 MOV DI,0200
-t
AX=002A BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0200
DS=0976 ES=0976 SS=0976 CS=0976 IP=0105 NV UP DI PL NZ NA PO NC
0976:0105 B91D00 MOV CX,001D
-
В командной строке TRACE можно указать адрес выполняемой команды. В этом случае после t набирается знак равенства (=) и нужный адрес. Если указан короткий адрес, то адрес сегмента выбирается из регистра CS:
-t=0100
AX=002A BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0200
DS=0976 ES=0976 SS=0976 CS=0976 IP=0102 NV UP DI PL NZ NA PO NC
0976:0102 BF0002 MOV DI,0200
-
В этом случае выполнена команда по адресу CS:0100. Адрес следующей команды находится в регистрах CS:IP. Он равен 0976:0102.
Одной командой TRACE можно одновременно трассировать несколько команд отлаживаемой программы. Для этого при введении "t" просто указывается их количество. После выполнения каждой команды на экране появляется картинка с содержимым регистров и флагов состояния. При заполнении экрана новые данные выводятся в нижней его части, сдвигая данные в верхней части за пределы экрана. Чтобы остановить движение данных вдоль экрана, нажимаются клавиши Ctrl-NumLock. Чтобы возобновить движение, нажимается любая клавиша.
При нажатии Ctrl-C трассирование прекращается и на экране появляется стандартный запрос отладчика.
Пример:
-t6
A
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·NA PO NC
0976:0109 F2 REPNZ
0976:010A AA STOSB
-
Команда задания имени файла программы
Команда NAME (n или N) присваивает имя обрабатываемому файлу. Затем этот файл загружается в память командой LOAD или записывается на диск командой WRITE. (LOAD и WRITE рассматриваются ниже.)
Чтобы идентифицировать файл, наберите "n" и, через пробел – имя файла. Воспользуемся NAME, чтобы присвоить нашей программе имя "mytest.pro":
-n mytest.pro
Команда загрузки файла в память
Загрузка файла в память осуществляется, если в командной строке DEBUG указать имя файла. Другой способ – использование команды LOAD (l или L).
При использовании команды LOAD необходимо специфицировать файл с помощью команды NAME.
В командной строке LOAD можно указать начальный адрес, по которому загружается файл. Если указан короткий адрес, то адрес сегмента выбирается из регистра CS. При отсутствии начального адреса, загрузка производится по адресу CS:0100.
После загрузки отладчик запоминает количество занятой файлом памяти (в байтах) в регистрах BX (старшее слово) и CX (младшее слово).
К примеру, загрузим в память файл "mytest.pro" по адресу CS:0100:
-n mytest.pro
-L
-r
AX=0000 BX=0000 CX=00CF DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0958 ES=0958 SS=0958 CS=0958 IP=0100 NV UP DI PL NZ NA PO NC
0958:0100 2A2A SUB CH,[BP+SI] SS:0000=CD
-
В регистрах BX и CX находится значение 207 (000000CF). Это значит, что файл занял 207 байт. Тот же результат можно получить при введении спецификации файла в командной строке команды старта отладчика ("debug mytest.pro").
Команда записи области памяти в файл
Команда WRITE (w или W) переписывает на диск данные, выбирая их из памяти. При этом спецификация создаваемого файла должна задаваться с помощью команды NAME.
Перед введением команды WRITE в регистры BX и CX записывается размер занимаемой файлом памяти в байтах (шестнадцатеричное число, занимающее 4 байта). Поэтому перед записью необходимо проверить содержимое этих регистров (с помощью REGISTER).
В командной строке WRITE можно указать начальный адрес памяти, по которому производится чтение данных с последующей записью их на диск. Если указан короткий адрес, то адрес сегмента выбирается из регистра CS.
Если начальный адрес не указан, то запись производится, начиная с адреса CS:0100.
Команда выхода из отладчика
Чтобы выйти из отладчика и передать управление операционной системе, на его стандартный запрос вводится команда q:
-q
СОДЕРЖАНИЕ РАБОТЫ
1. Ознакомиться с теоретическим материалом.
2. В соответствии со своим вариантом (пример для ассемблирования) опробовать команды debug.
Варианты заданий
1.
MOV AL,20
MOV BL,10
ADD AL,BL
SUB BL,3
AND AX,BX
2.
INC DH
MOV DL,00
AND AX,DX
NOT AX
MOV BX,AX


3.

MOV AX,1111
MOV BX,2
MUL BX
INC AX
XOR AX,FFFF

4.

MOV AL,03
DEC AL
CMP
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·X
DEC BX
ADD AX,BX
AND AX,43
NOT AX


25.

LAHF
STI
CLC
SAHF
MOV DX,FFF0





Лабораторная работа № 3
Формат команд и способы адресации в реальном режиме работы процессора
Цель работы: изучить способы адресации 16-разрядного режима работы процессора и их представление в кодах команд.
Основные понятия
Теоретические основы адресации памяти в реальном режиме
Данные, над которыми процессор выполняет свои операции, могут располагаться как в регистрах, так и в оперативной памяти компьютера. Для работы с памятью используются шина адреса и шина данных (см. рис. 3.1).
13 EMBED Word.Picture.6 1415
Рис. 3.1. Организация взаимодействия процессора и оперативной памяти

Физически память устроена таким образом, что возможно обращение к отдельным байтам, 16-разрядным словам (два смежных байта памяти), 32-разрядным двойным словам (четыре смежных байта памяти). Максимальный размер данных определяется разрядностью шины данных и режимом работы процессора. В современных персональных компьютерах шина адреса 32-разрядная, но в реальном (16-разрядном) режиме работы процессора максимальный размер обрабатываемых данных – 16 бит, т.е. слово.
Важной характеристикой оперативной памяти является ее объем, т.е. количество доступных байт памяти. Оперативное запоминающее устройство (ОЗУ) на логическом уровне рассматривается как непрерывная последовательность байт. Каждый байт в этой последовательности имеет свой порядковый номер, называемый физическим адресом ячейки памяти. Для доступа к определенной ячейке памяти на шину адреса выставляется ее физический адрес.
Разрядность шины адреса определяет максимальный объем оперативной памяти. В современных персональных компьютерах шина адреса так же 32-разрядная, и, следовательно, процессор имеет возможность одновременно обращаться к 232 = 4 Гбайт оперативной памяти. Однако в реальном режиме работы из шины адреса используется только 20 младших разрядов. Таким образом объем адресуемой памяти в реальном режиме работы процессора составляет 220 = 1 Мбайт.
Так как адреса принято записывать в шестнадцатеричной системе счисления, то мы можем записать диапазон физических адресов для 20-разрядной шины адреса следующим образом:
00000h ( [физический адрес] ( FFFFFh.
Здесь и далее буква "h", записанная после числа, подчеркивает, что данное число записано в шестнадцатеричной системе счисления.
Однако все регистры процессора в реальном режиме 16-разрядные. Возникает проблема представления 20-разрядного физического адреса памяти при помощи 16-разрядных регистров.
Для разрешения этой проблемы используется двухкомпонентный логический адрес. Логический адрес состоит из 16-разрядных компонент: компоненты сегмента памяти и компоненты смещения внутри сегмента.
Для получения 20-разрядного физического адреса к сегментной компоненте (сегменту) приписываются справа четыре нулевых двоичных разряда (для расширения до 20 разрядов), затем полученное число складывается с компонентой смещения (см. рис. 3.2). Перед сложением к компоненте смещения (смещению) слева дописываются четыре нулевых бита (так же для расширения до 20 разрядов).
Логический адрес принято записывать в форме <сегмент : смещение>.
Например, пусть у нас есть логический адрес 1234h:0123h. Сегментная компонента равна 1234h, а компонента смещения – 0123h. Вычислим физический адрес, соответствующий нашему логическому адресу:
расширяем до 20 бит сегментную компоненту, дописывая справа 4 нулевых бита, получаем число 12340h (здесь четыре двоичных разряда представляются одним шестнадцатеричным разрядом);
расширяем до 20 бит компоненту смещения, дописывая справа 4 нулевых бита, получаем число 00123h;
для получения физического адреса складываем полученные числа:
12340h + 00123h = 12453h.

13 EMBED Word.Picture.6 1415
Рис. 3.2. Формирование 20-разрядного физического адреса
Одному физическому адресу может соответствовать несколько логических. Например, полученному нами физическому адресу 12453h соответствует логический 1245h:0003h.
Фактически в схеме адресации памяти реального режима первый мегабайт памяти как бы разбивается на сегменты. Физический адрес начала сегмента (базовый адрес сегмента) равен расширенному до 20 бит сегментной компоненте адреса.
Сегменты могут начинаться только с физического адреса, который кратен 16 байтам. Поэтому он может начинаться только с границы параграфа (один параграф – это 16 идущих подряд байта). Компонента смещения при такой схеме адресации является смещением внутри сегмента памяти, а сам сегмент задается сегментной компонентой адреса (см. рис. 3.3).
Логический адрес в реальном режиме должен находиться в следующих пределах: 0000h:0000h ( [логический адрес] ( FFFFh:000Fh.
Архитектура современных процессоров фирмы Intel, работающих в реальном режиме, предполагает хранение сегментной компоненты адреса в сегментных регистрах: CS – сегмент кода; DS – сегмент данных; ES – дополнительный сегмент данных; SS – сегмент стека.
Компонента смещения логического адреса текущей исполняемой команды всегда располагается в указателе команд IP, а компонента смещения логического адреса вершины стека в регистре SP. Компонента смещения логического адреса ячейки памяти, рассматриваемой как данные, может располагаться в регистрах BX, BP, SI, DI.
13 EMBED Word.Picture.6 1415
Рис. 3.3. Схема адресации в реальном режиме
Режимы адресации
Набор команд процессоров фирмы Intel обеспечивает выполнение операций над операндами, которые находятся в регистрах, памяти и непосредственно в команде. В набор входят безадресные, которые не имеют операндов, одно- и двухадресные команды (по количеству операндов). Для одноадресных команд операнд может располагаться в регистре или в памяти. Для двухадресных команд возможны следующие схемы расположения операндов:
–  регистр регистр;
–  регистр память;
–  память регистр;
–  регистр непосредственные данные;
–  память непосредственные данные.
Существует несколько способов задания операндов команд процессора, которые обычно называют режимами адресации. Эти способы содержат конкретное указание процессору откуда брать или куда помещать данные. В частности для операндов, находящихся в памяти, режимы адресации определяют правила формирования логического адреса данных.
Рассмотрим следующие режимы адресации реального режима:
–  регистровая адресация;
–  непосредственная адресация;
–  прямая адресация;
–  косвенная адресация;
–  адресация по базе;
–  индексная адресация;
–  базово-индексная адресация.
В табл. 3.1 приведены форматы операндов языка ассемблера для всех семи режимов адресации, реализуемых процессором в реальном режиме, и для каждого формата указано, какой из сегментных регистров по умолчанию используется для вычисления физического адреса. Обратите внимание, что во всех режимах предполагается доступ к сегменту данных (т.е. сегментным регистром служит регистр DS), и только в тех случаях, когда используется регистр ВР, предполагается доступ к сегменту стека (т.е. сегментным регистром служит регистр SS).
Таблица 3.1
Форматы операндов
Режим адресации
Формат операнда
Сегментный регистр

Регистровый
AL, AH, AX
BL, BH, BX
CL, CH, CX
DL, DH, DX
SP
BP
SI
DI
Не используется

Непосредственный
Данное
Не используется

Окончание табл. 3.1
Режим адресации
Формат операнда
Сегментный регистр

Прямой
Сдвиг
Метка
DS
DS

Косвенный
[BX]
[BP]
[DI]
[SI]
DS
SS
DS
DS

По базе
[BX + сдвиг]
[BP + сдвиг]
DS
SS

Индексная
[DI + сдвиг]
[SI] + сдвиг
DS
DS

Базово-индексная
[BX + SI + сдвиг]
[BX + DI + сдвиг]
[BP + SI + сдвиг]
[BP + DI + сдвиг]
DS
DS
SS
SS

Регистровая адресация
В данном режиме процессор принимает данные из регистра или помещает данные в регистр. При этом данные могут быть восьмиразрядными (в этом случае используются 8 восьмиразрядных регистров общего назначения: AL, AH, BL, BH, CL, CH, DL и DH), а также шестнадцатиразрядными (используются 8 шестнадцатиразрядных регистра общего назначения: AX, BX, CX, DX, SP, BP, SI, и DI).
Непосредственная адресация
В этом режиме процессор выбирает данные непосредственно из самого кода команды. Этот режим адресации применяется для задания константных значений в качестве операнда – источника данных (только в двухадресных командах). При этом разрядность непосредственного операнда определяется разрядностью операнда – приемника данных.
Например, первый операнд (приемник данных) команды MOV AX,34h имеет регистровую адресацию, т.е. результат ее выполнения помещается в регистр (в данном случае AX), а второй операнд (источник данных) имеет непосредственную адресацию, т.е. является константой 0034h и располагается в коде этой команды. Таким образом данная команда помещает константу 0034h в регистр AX.
Прямая адресация
При этом режиме адресации операнд располагается в оперативной памяти, а адрес операнда (точнее компонента смещения логического адреса) располагается в коде команды. Для обращения к такому операнду процессор формирует физический адрес, выбирая компоненту сегмента из сегментного регистра DS. Поскольку обращение к операнду требует от процессора выполнения определенных действий, компоненту смещения адреса операнда принято называть исполнительным адресом.
Обычно прямая адресация применяется, если операндом является метка (имя ячейки памяти). Ассемблер, встроенный в debug, не поддерживает метки, и при применении прямой адресации необходимо прямо указывать смещение конкретной ячейки памяти. Чтобы различать непосредственные данные и исполнительный адрес последний берется в квадратные скобки. Например, команда MOV AX,[0034h] в отличие от предыдущего случая помещает в регистр AX не константу 0034h, а содержимое слова, находящегося по адресу DS:0034h.
Косвенная адресация
Как и в случае прямой адресации, операнд, имеющий косвенную адресацию располагается в памяти, однако исполнительный адрес операнда находится не в коде команды, а в одном из базовых или индексных регистров: BX, BP, SI и DI. При вычислении физического адреса операнда процессор использует содержимое сегментного регистра DS, если исполнительный адрес располагается в BX, SI, либо DI, и содержимое сегментного регистра SS, если исполнительный адрес находится в регистре BP.
Чтобы различать регистровую и косвенную адресацию, при косвенной адресации имя регистра заключается в квадратные скобки. Например, команда MOV [BX],BX, в которой первый операнд имеет косвенную адресацию, а второй регистровую, помещает содержимое регистра BX в ячейку памяти с адресом DS:BX.
Адресация по базе
Этот режим адресует данные в памяти. При адресации по базе процессор вычисляет исполнительный адрес с помощью сложения значения сдвига, который находится в коде команды с содержимым регистров BX или BP.
Данный режим адресации удобно использовать при доступе к структурированным записям данных, расположенным в разных областях памяти. В этом случае базовый адрес записи помещается в базовый регистр и доступ к ее отдельным элементам осуществляется по их сдвигу относительно базы. А для доступа к разным записям одной и той же структуры достаточно соответствующим образом изменить содержимое базового регистра. Например, команда MOV byte ptr [BP + 4],3Fh, в которой первый операнд имеет адресацию по базе, а второй непосредственную адресацию, помещает значение константы 3Fh в байт, имеющий адрес SS:BP + 4h. Для указания того, что в данном случае мы работаем именно с байтами, используется префикс byte ptr (word ptr префикс используется для указания того, что действия производятся над словами). Первый операнд этой команды можно трактовать как поле некоторой записи, располагаемой в сегменте стека. Базовый исполнительный адрес этой записи размещен в регистре BP, а сдвиг поля относительно этой базе, равный 4h, размещен в коде команды.
Индексная адресация
И этот режим адресует данные в памяти. В этом случае исполнительный адрес вычисляется как сумма значений сдвига, который находится в коде команды, и индексного регистра (DI или SI). Этот режим адресации удобен для доступа к элементам массива, когда сдвиг указывает на начало массива, а индексный регистр – на его элемент.
Индексная адресация отличается от базовой только используемыми регистрами и трактовкой содержимого регистра и сдвига.
Базово-индексная адресация
Как и в предыдущих случаях адресуется операнд в памяти. При базово-индексной адресации исполнительный адрес вычисляется как сумма значений базового регистра, индексного регистра и, возможно, сдвига, который находится в коде команды. Так как в этом режиме адресации складывается два отдельных смещения, то он удобен при адресации двумерных массивов, когда базовый регистр содержит начальный адрес массива, а значения сдвига и индексного регистра суть смещения по строке и столбцу. Возможна и другая трактовка базово-индексной адресации. Применение то же – для обращения к элементам двумерного массива, но начальный исполнительный адрес задается сдвигом, а базовый и индексный регистры задают смещения в массиве по строке и столбцу.
Например, команда MOV AL,[BX + SI + 006Dh] имеет два операнда, первый из которых, – регистр AL, а второй – байт, расположенный в памяти. Для обращения ко второму операнду применяется базово-индексная адресация. Данный байт можно рассматривать как элемент двумерного массива (матрицы), который расположен в сегменте данных со смещением от начала 006Dh. Регистр BX задает смещение строки от начала матрицы, а регистр SI – смещение элемента относительно начала строки. Таким образом, данная команда помещает в AL содержимое байта, расположенного по адресу DS:BX + SI + 006Dh.
В нашем примере для обращения к произвольным элементам матрицы, имеющей размер n ( m, содержимое BX следует изменять от нуля (первая строка матрицы) до (n – 1) ( m (последняя строка матрицы) с шагом m (количество элементов в строке), а содержимое SI – от нуля (первый элемент строки) до m – 1 (последний элемент строки) с шагом 1 (размер элемента, равный 1 байту).
Форматы команд
Процессор узнает о режимах адресации операндов команды из ее кода. Рассмотрим два обобщенных формата команд, описывающих все рассмотренные режимы адресации. Большинство двухадресных команд имеют такие форматы.
Формат команды, имеющий два операнда, один из которых располагается в регистре, а другой в регистре или памяти. В общем случае такие команды могут занимать от двух до четырех байт памяти. Весь этот массив байт разбит на поля, каждое из которых несет определенную информацию (см. рис. 3.4).
Байт
0
1
2
3

Бит
72
1
0
76
543
210
70
70

Поле
Code
d
w
mod
reg
R/m
disp_low
disp_high

Рис. 3.4. Формат двухадресной команды без непосредственной адресации
Поля формата имеют следующее применение:
–  поле code содержит код операции, описывающий операцию, выполняемую командой (под это поле отводится 6 старших бит нулевого байта кода команды);
–  поле d (первый бит нулевого байта кода) определяет направление передачи результата:
1) при d = 1 первый операнд определяется полем reg, т.е. всегда является регистром, а второй операнд определятся полем r/m, т.е. может быть ячейкой памяти или регистром;
2) при d = 0 – наоборот, первый операнд определяется полем r/m, а второй – полем reg;
–  поле w (нулевой бит нулевого байта кода) определяет размер операндов:
1) при w = 0 – байты;
2) при w = 1 – слова;
–  поле mod (два старших бита первого байта кода) определяет режим адресации и, в частности, смысл поля r/m и существование полей disp_low и disp_high:
1) при mod = 00 – поля disp_low и disp_high отсутствуют, а поле r/m определяет операнд в памяти;
2) при mod = 01 – поле disp_high отсутствует, а поле r/m определяет операнд в памяти;
3) при mod = 10 – оба поля disp_low и disp_high присутствуют в коде команды, а поле r/m определяет операнд в памяти;
4) при mod = 11 – поле r/m определяет операнд в регистре, а поля disp_low и disp_high естественно отсутствуют;
–  поле reg (пятый, четвертый и третий биты первого байта кода) кодирует операнд располагаемый в регистре:
Поле reg
w = 0
w = 1

000
AL
AX

001
CL
CX

010
DL
DX

011
BL
BX

100
AH
SP

101
CH
BP

110
DH
SI

111
BH
DI

–  поле r/m (младшие три бита первого байта кода) используется совместно с полем mod:
1) при значении поля mod = 11 поле r/m определяет операнд в регистре и кодирует регистр так же как и поле reg (см. выше);
2) при значении поля mod отличном от 11 поле r/m определяет операнд в памяти и колирует режим адресации следующим образом:
Поле r/m
Режим адресации
Исполнительный адрес

000
Базово-индексная
BX + SI + disp

001
То же
BX + DI + disp

010
>>
BP + SI + disp

011
>>
BP + DI + disp

100
Косвенная или индексная
SI + disp

101
То же
DI + disp

110
Косвенная или по базе
BP + disp (при mod ( 00)

111
То же
BX + disp

Если поле mod = 00 и поле r/m = 110, то исполнительный адрес операнда определяется полями disp_low и disp_high, которые в данном случае обязательно присутствуют в коде команды. Этот случай определяет прямую адресацию;
–  поля disp_low и disp_high являются соответственно младшим и старшим байтом компоненты исполнительного адреса (сдвига), присутствующей в коде команды. Наличие этих полей в коде команды отличают базовую и индексную адресацию от косвенной. Если в коде команды присутствует только поле disp_low, то при вычислении исполнительного адреса, оно расширяется до слова, старший байт которого равен нулю.
Например, команда MOV AL,[BX + DI + 3Fh] имеет код 8A413Fh. Выделим поля этого кода и удостоверимся, действительно это та самая команда. Переведем код команды в двоичную систему счисления:
13 EMBED Equation.3 1415
Выделим поля кода команды:
code = 100010 – код операции пересылки (MOV);
d = 1 – первый операнд располагается в регистре (см. поле reg), а второй в регистре или памяти (см. поле r/m);
w = 0 – операнды имеют размер в 1 байт;
mod = 01 – поле r/m определяет операнд в памяти и поле disp_high в коде команды отсутствует;
reg = 000 – при w = 0 это регистр AL;
r/m = 001 – при mod = 01 это ячейка памяти с исполнительным адресом BX + DI + disp;
disp_low = 00111111 – младший байт компоненты сдвига в исполнительном адресе операнда;
disp (сдвиг) = 00000000 00111111 – получается расширением disp_low (в шестнадцатеричной системе это число 003Fh).
Таким образом, приходим к выводу, что это код команды mov AL,[BX + DI + 003Fh].
Формат команды, имеющий два операнда, один из которых располагается в регистре или памяти, а другой непосредственно в коде команды. Этот формат применяется для команд, один из операндов которых имеет непосредственную адресацию (см. рис. 3.5). Длина кода этого формата от 3 до 6 байт.

Байт
0
1
2
3
4
5

Бит
72
1
0
76
543
210
70
70
70
70

Поле
code
s
w
mod
reg
r/m
disp_ low
disp_ high
data_ low
data_ high

Рис. 3.5. Формат двухадресной команды, второй операнд которой имеет непосредственную адресацию
Поля формата имеют следующее применение:
–  поле code вместе с reg, а иногда и с s, определяет выполняемую операцию;
– поле s вместе с полем w определяет размер второго операнда и, тем самым, наличие поля data_high:
1) при s = 0 размер второго операнда определяется полем w;
2) при s = 1 размер второго операнда равен 1 байту, причем при w = 1 этот байт расширяется до слова путем размножения старшего разряда младшего байта в старший байт;
– поле w определяет размер первого операнда:
1) при w = 0 – байт;
2) при w = 1 – слово;
–  поля mod и r/m используются как в рассмотренном ранее формате;
–  поле reg является частью кода операции;
–  поля disp_low и disp_high используются как в рассмотренном ранее формате (в частности могут отсутствовать);
–  поля data_low и data_high – соответственно младший и старший байт непосредственного (второго) операнда (поле data_high может отсутствовать).
СОДЕРЖАНИЕ РАБОТЫ
1. Ознакомиться с теоретическим материалом.
2. В соответствии со своим вариантом опробовать в debug и пояснить команды.
3. Осуществить ассемблирование и дизассемблирование указанных преподавателем команд.
Варианты заданий
1.
MOV BX,100
MOV BP,[BX]
MOV DX,[BP + 2]
MOV AX,DX
ADD AX,[BX
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·Лабораторная работа № 4
команды пересылки
Цель работы: изучить команды пересылки данных и особенности их применения.
Основные понятия
Команды передачи данных можно подразделить на следующие группы:
–  команды пересылки общего назначения;
–  команды ввода/вывода через порт;
–  команды пересылки адреса;
–  команды пересылки содержимого регистра флагов.
В табл. 4.1 приведена мнемоника этих команд и описание выполняемых ими действий.
Таблица 4.1
Мнемоника команд передачи управления
Обозна-чение
Выполняемая функция

Команды пересылки общего назначения

mov
Пересылка значения второго операнда в первый операнд

push
Помещение значения операнда в стек

pop
Извлечение значения из стека и помещение его в операнд

xchG
Обмен значениями между операндами

xlat
Табличное преобразование одного кода в другой (перекодировка)

Команды ввода/вывода через порт

in
Ввод данных (чтение порта)

out
Вывод данных (запись в порт)

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

lea
Загрузка в первый операнд исполнительного адреса второго операнда

lds
Загрузка первого операнда и регистра DS значением второго операнда

les
Загрузка первого операнда и регистра ES значением второго операнда

Команды пересылки содержимого регистра флагов

lahf
Пересылка в регистр AH флагов из регистра признаков

sahf
Запись содержимого регистра AH в регистр флагов

pushf
Сохранение содержимого регистра флагов в стеке

popf
Извлечение слова из стека и помещение его в регистр флагов

Команда MOV имеет следующий формат в мнемонике ассемблера:
MOV dest,src ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти. Кроме этого в качестве dest и src могут быть использованы любые сегментные регистры, кроме CS. В этом случае, если один из операндов является сегментным регистром, то второй должен иметь либо регистровую адресацию, либо адресовать данные в памяти (кроме непосредственной адресации).
Эта команда пересылает значение второго операнда в первый операнд. При этом содержимое регистра флагов не изменяется.
Команда MOV имеет следующие форматы машинных кодов:
пересылка аккумулятора (AX или AL) в память или памяти в аккумулятор при прямой адресации памяти
101000dw
adr_low
adr_high

пересылка из регистра в регистр или память или наоборот
100010dw
mod reg r/m
disp_low
disp_high

пересылка непосредственных данных в память
1100011w
mod 000 r/m
disp_low
disp_high
data_low
data_high

пересылка непосредственных данных в регистр
1011w reg
data_low
data_high

пересылка сегментного регистра в регистр или память или наоборот
100011d0
mod 0 seg r/m
disp_low
disp_high

Примеры использования команды MOV:
MOV [123],AX
; пересылка содержимого аккумулятора
; в ячейку памяти со смещением 123h
; относительно начала сегмента данных

MOV AX,[123]
; пересылка содержимого ячейки памяти со
; смещением 123h относительно начала
; сегмента данных в аккумулятор

MOV DX,[BX + SI + 2]
; пересылка содержимого ячейки памяти
; в регистр

MOV [BX + SI + 2],DX
; пересылка содержимого регистра в
; ячейку памяти

MOV word ptr [123],12
; пересылка непосредственных данных в память

MOV CX,123
; пересылка непосредственных данных в регистр

MOV DS,AX
; пересылка содержимого регистра в
; сегментный регистр

MOV SS,[BX + 123]
; пересылка содержимого ячейки памяти в
; сегментный регистр

MOV AX,DS
; пересылка содержимого сегментного регистра
; в регистр

MOV [BX + 123],SS
; пересылка содержимого сегментного регистра
; в память

Команда PUSH имеет следующий формат в мнемонике ассемблера:
PUSH scr,
где операнд scr может иметь любой режим адресации, кроме непосредственной, или быть сегментным регистром.
Эта команда уменьшает содержимое регистра SP на 2 и затем пересылает слово, адресуемое своим операндом в элемент стека, находящийся по адресу SS:SP. При этом содержимое регистра флагов не изменяется. Важно заметить, что команда PUSH всегда помещает в стек 16-разрядные данные, т.е. при регистровой адресации ее операнда должны быть использованы только 16-разрядные регистры.
Команда PUSH имеет следующие форматы машинных кодов:
сохранение в стеке содержимого регистра
01010 reg

сохранение в стеке содержимого ячейки памяти
11111111
mod 101 r/m
disp_low
disp_high

сохранение в стеке содержимого сегментного регистра
000 seg 110

Примеры использования команды PUSH:
PUSH AX
; помещение в стек содержимого регистра

PUSH [BX + DI + 1]
; помещение в стек содержимого ячейки памяти

PUSH CS
; помещение в стек содержимого CS


Команда POP имеет следующий формат в мнемонике ассемблера:
POP dest,
где операнд dest может иметь любой режим адресации, кроме непосредственной, или быть сегментным регистром.
Эта команда пересылает слово, находящееся по адресу SS:SP, в операнд dest, а затем увеличивает содержимое регистра SP на 2. При этом содержимое регистра флагов не изменяется. Важно заметить, что команда POP всегда извлекает из стека 16-разрядные данные, т.е. при регистровой адресации ее операнда должны быть использованы только 16-разрядные регистры.
Команда POP имеет следующие форматы машинных кодов:
извлечение из стека в регистр
01011 reg

извлечение из стека в ячейку памяти
10001111
mod 000 r/m
disp_low
disp_high

извлечение из стека в сегментный регистр
000 seg 111

Примеры использования команды POP:
POP AX
; извлечение из стека в регистр

POP [BX + DI + 12];
; извлечение из стека в ячейку памяти

POP DS
; извлечение из стека в сегментный регистр

Команда XCHG имеет следующий формат в мнемонике ассемблера:
XCHG dest,src ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, кроме непосредственной, если первый операнд имеет регистровую адресацию, и регистровую адресацию, если первый операнд адресует ячейку памяти.
Эта команда обменивает значения своих операндов. При этом содержимое регистра флагов не изменяется.
Команда XCHG имеет следующие форматы машинных кодов:
обмен содержимого регистра с аккумулятором (AX)
10010 reg

обмен содержимого регистра и регистра или памяти
1000011w
mod reg r/m
disp_low
disp_high

Примеры использования команды XCHG:
XCHG AX,BX
; обмен содержимого регистра и аккумулятора

XCHG BX,AX
; обмен содержимого аккумулятора и регистра

XCHG DX,[BX + 2]
; обмен содержимого ячейки памяти и регистра

XCHG [BX + 2],DX
; обмен содержимого регистра и ячейки памяти

Команда XLAT имеет в мнемонике ассемблера следующий формат:
XLAT
Эта команда не имеет операндов и использует содержимое регистра AL как смещение байта в 256-байтовой таблице, адресуемой DS:BX. Указанный байт замещает собой содержимое AL. Другими словами, выполнение команды XLAT заключается в помещении в регистр AL содержимого байта, находящегося в сегменте данных со смещением равным сумме содержимого регистров BX и AL. При этом содержимое регистра флагов не изменяется.
Команда XLAT имеет следующий формат машинного кода:
11010111

Пример использования команды XLAT:
MOV BX,20
; помещаем в регист BX смещение таблицы перекодировки

MOV AL,5
; помещаем в AL значение перекодируемого байта

XLAT
; осуществляем перекодировку

Команда IN имеет следующий формат в мнемонике ассемблера:
IN acc,port ,
где acc – аккумулятор (AX или AL); port – непосредственный операнд или DX.
Эта команда передает байт или слово данных в аккумулятор из порта ввода. Порт указывается или непосредственным операндом со значением от 0 до 255, либо значением в регистре DX. При этом содержимое регистра флагов не изменяется.
Команда IN имеет следующие форматы машинных кодов:
чтение непосредственно заданного порта
1110010w
port

чтение из порта заданного в DX
1110110w

При значении w = 0 данные из порта port помещаются в AL, а при w = 1 данные из порта port помещаются в AL, а из порта port + 1 – в AH.
Примеры использования команды IN:
IN AX,PORT_A
; чтение слова из портов PORT_A и PORT_A + 1

IN AL,PORT_B
; чтение байта из порта с номером PORT_B

IN AL,DX
; чтение байта из порта с номером заданным в DX

Команда OUT имеет следующий формат в мнемонике ассемблера:
OUT port,acc ,
где acc – аккумулятор (AX или AL); port – непосредственный операнд или DX.
Эта команда передает содержимое аккумулятора в порт вывода. Порт указывается или непосредственным операндом со значением от 0 до 255, либо значением в регистре DX. При этом содержимое регистра флагов не изменяется.
Команда OUT имеет следующие форматы машинных кодов:
запись в непосредственно заданный порт
1110011w
port

запись в порт заданный в DX
1110111w

При значении w = 0 данные из AL выводятся в порт port, а при w = 1 данные из AL выводятся в порт port, а из AH – в порт port + 1.
Примеры использования команды OUT:
OUT AX,PORT_A
; запись слова в порты PORT_A и PORT_A + 1

OUT AL,PORT_B
; запись байта в порт с номером PORT_B

OUT DX,AL
; запись байта в порт с номером заданным в DX

Команда LEA имеет следующий формат в мнемонике ассемблера:
LEA dest,src ,
где dest – первый операнд, имеющий регистровую адресацию; scr – второй операнд, имеющий любой режим адресации, кроме регистровой и непосредственной.
Эта команда пересылает смещение адреса ее второго операнда в регистр, являющийся первым операндом. При этом значение регистра флагов не изменяется.
Команда LEA имеет следующий формат машинного кода:
10001101
mod reg r/m
disp_low
disp_high

Примеры использования команды LEA:
LEA BX,[123]
; загрузка в регистр BX исполнительного адреса
; второго операнда, имеющего прямую
; адресацию

LEA SI,[BX + DI + 2]
; загрузка в SI исполнительного адреса второго
; операнда, имеющего базово-индексную
; адресацию

Команда LDS имеет следующий формат в мнемонике ассемблера:
LDS dest,src ,
где dest – первый операнд, имеющий регистровую адресацию; scr – второй операнд, имеющий любой режим адресации, кроме регистровой и непосредственной.
Эта команда пересылает содержимое ячеек памяти, заданных своим вторым операндом, в пару регистров. Пересылаемые данные интерпретируются как дальний указатель памяти (полный адрес), составленный из сегмента и смещения. Cегментная составляющая адреса помещается в DS, а смещение – в регистр, заданный первым операндом. При этом значение регистра флагов не изменяется.
Команда LDS имеет следующий формат машинного кода:
11000101
mod reg r/m
disp_low
disp_high

Примеры использования команды LDS:
LDS BX,[123]
; загрузка в регистр DS:BX содержимым
; двойного слова, адресуемого вторым
; операндом, имеющим прямую адресацию

LDS SI,[BX + DI + 2]
; загрузка в DS:SI содержимым двойного слова,
; адресуемого вторым операндом, имеющим
; базово-индексную адресацию

Команда LES имеет следующий формат в мнемонике ассемблера:
LES dest,src,
где dest – первый операнд, имеющий регистровую адресацию; scr – второй операнд, имеющий любой режим адресации, кроме регистровой и непосредственной.
Эта команда пересылает указатель (32-разрядный адрес, составленный из сегментной части и смещения), хранящийся в памяти и заданный своим вторым операндом в пару регистров: сегментная часть помещается в ES, а смещение – в регистр, заданный первым операндом. При этом значение регистра флагов не изменяется.
Команда LES имеет следующий формат машинного кода:
11000100
mod reg r/m
disp_low
disp_high

Примеры использования команды LES:
LES BX,[123]
; загрузка в регистр ES:BX содержимым
; двойного слова, адресуемого вторым
; операндом, имеющим прямую адресацию

LES SI,[BX + DI + 2]
; загрузка в ES:SI содержимым двойного слова,
; адресуемого вторым операндом,
; имеющим базово-индексную адресацию

Команда LAHF не имеет операндов и помещает в регистр AH значения флагов SF, ZF, AF, PF и CF. При этом содержимое регистра флагов не изменяется. Эта команда имеет следующий формат машинного кода:
10011111

Значения флагов помещаются в регистр AH в формате:
(SF):(ZF):X:(AF):X:(PF):X:(CF),
где X – обозначает неопределенный бит.
Команда SAHF не имеет операндов и загружает определенные биты из регистра AH в регистр флагов. Эта команда имеет следующий формат машинного кода:
10011110

Содержимое регистра AH рассматривается в формате:
(SF):(ZF):X:(AF):X:(PF):X:(CF),
где X – обозначает неопределенный бит. При выполнении команды SAHF изменяются значения флагов SF, ZF, AF, PF и CF.
Команда PUSHF не имеет операндов и подобно команде PUSH сохраняет в стеке содержимое регистра флагов. При этом само содержимое этого регистра не изменяется. Данная команда имеет следующий формат машинного кода:
10011100

Команда POPF не имеет операндов и подобно команде POP извлекает из стека данные и помещает их в регистр флагов. При этом, естественно, все флаги изменяются. Данная команда имеет следующий формат машинного кода:
10011100

СОДЕРЖАНИЕ РАБОТЫ
1. Ознакомиться с теоретическим материалом.
2. С помощью программы debug исследовать выполнение всех команд пересылки с любым возможным типом их операндов.
3. В соответствии со своим вариантом решить поставленные задачи и с помощью DEBUG установить правильность их решения.
Задачи к выполнению лабораторной работы
Используя любые известные команды промоделировать выполнение команды PUSH scr.
Используя любые известные команды промоделировать выполнение команды POP dest.
Используя любые известные команды промоделировать выполнение команды XCHG dest,scr.
Используя любые известные команды промоделировать выполнение команды XLAT.
Используя любые известные команды промоделировать выполнение команды LDS dest,scr.
Обменять содержимое сегментных регистров DS и ES.
Сохранить в стеке содержимое всех регистров и регистра флагов, а затем восстановить их содержимое.
Установить флаги OF, DF, ZF и CF. Остальные флаги сбросить.
Инвертировать значения флагов SF, ZF, AF, PF и CF.
Загрузить содержимое регистра флагов в регистр CX.
Варианты заданий
Номер варианта
Номер задачи
Номер варианта
Номер задачи

1
1, 6
14
3, 9

2
1, 7
15
3, 10

3
1, 8
16
4, 6

4
1, 9
17
4, 7

5
1, 10
18
4, 8

6
2, 6
19
4, 9

7
2, 7
20
4, 10

8
2, 8
21
5, 6

9
2, 9
22
5, 7

10
2, 10
23
5, 8

11
3, 6
24
5, 9

12
3, 7
25
5, 10

13
3, 8



Лабораторная работа № 5
Арифметические команды
Цель работы: изучить арифметические команды и особенности их применения.
Основные понятия
Арифметические команды можно подразделить на следующие группы:
–  команды сложения;
–  команды вычитания;
–  команды умножения;
–  команды деления;
–  команды изменения знака и размера операнда.
В табл. 5.1 приведена мнемоника этих команд и описание выполняемых ими действий.
Таблица 5.1
Мнемоника арифметических команд
Обозначение
Выполняемая функция

Команды сложения

ADD
Сложение значений операндов

ADC
Сложение значений операндов и значения флага переноса

INC
Увеличение значения операнда на 1

AAA
Коррекция ASCII кода при сложении

DAA
Коррекция двоично-десятичного кода при сложении

Команды вычитания

SUB
Вычитание значения второго операнда из значения первого

SBB
Вычитание значения первого операнда и значения флага переноса (заем) из значения первого операнда

DEC
Уменьшение значения операнда на 1

CMP
Сравнение значений операндов

AAS
Коррекция ASCII кода при вычитании

DAS
Коррекция двоично-десятичного кода при вычитании

Команды умножения

MUL
Умножение без учета знака

IMUL
Умножение с учетом знака

AAM
Коррекция ASCII кода при умножении

Команды деления

DIV
Деление без учета знака

IDIV
Деление с учетом знака

AAD
Коррекция ASCII кода при делении

Команды изменения знака и размера

NEG
Изменение знака у операнда

CBW
Преобразование байта в слово

CWD
Преобразование слова в двойное слово

Команда ADD имеет следующий формат в мнемонике ассемблера:
ADD dest,src ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.
Эта команда складывает значение второго операнда со значением первого операнда, результат сложения помещается в первый операнд. Команда ADD изменяет значения флагов переполнения (OF), знака (SF), нуля (ZF), дополнительного переноса (AF), переноса (CF) и четности (PF). Флаг переполнения устанавливается, если при выполнении операции произошло переполнение (результат сложения не вмещается в размер операндов). Флаг знака устанавливается, если в результате выполнения операции получилось отрицательное число. Флаг нуля устанавливается, если результатом операции является ноль. Флаг дополнительного переноса устанавливается, если при сложении байт осуществлен перенос из 3-го бита. Флаг переноса устанавливается, если при сложении осуществлен перенос из старшего бита. Флаг четности устанавливается, если количество единичных битов в младшем байте результата операции четное.
Команда ADD имеет следующие форматы машинных кодов:
сложение операнда в памяти или в регистре с операндом в регистре
000000dw
mod reg r/m
disp_low
disp_high

сложение непосредственного операнда с содержимым аккумулятора
0000010w
data_low
data_high

сложение непосредственного операнда с операндом в регистре или в памяти
100000sw
mod 000 r/m
disp_low
disp_high
data_low
data_high

Примеры использования команды ADD:
ADD DX,[BX + SI + 123]
; сложение содержимого ячейки памяти
; и регистра

ADD [BX + SI + 123],DX
; сложение содержимого регистра
; и ячейки памяти

ADD AX,123
; сложение содержимого аккумулятора (AX)
; и константы

ADD AL,123
; сложение содержимого аккумулятора (AL)
; и константы

ADD word ptr [123],123
; сложение непосредственных данных
; с содержимым ячейки памяти

ADD CX,123
; сложение непосредственных данных
; с содержимым регистра

Команда ADC имеет следующий формат в мнемонике ассемблера:
ADC dest,src ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.
Эта команда складывает содержимое своих операндов и содержимое флага переноса (CF), результат сложения помещается в первый операнд. Содержимое регистра флагов при выполнении команды ADC изменяется аналогично тому, как это было при выполнении команды ADD.
Команда ADC имеет следующие форматы машинных кодов:
сложение операнда в памяти или в регистре с операндом в регистре
000100dw
mod reg r/m
disp_low
disp_high

сложение непосредственного операнда с содержимым аккумулятора
0001010w
data_low
data_high

сложение непосредственного операнда с операндом в регистре или в памяти
100000sw
mod 010 r/m
disp_low
disp_high
data_low
data_high

Примеры использования команды ADC:
ADC DX,[BX + SI + 123]
; сложение с переносом содержимого ячейки
; памяти и регистра

ADC [BX + SI + 123],DX
; сложение с переносом содержимого регистра ; и ячейки памяти

ADC AX,123
; сложение с переносом содержимого
; аккумулятора (AX) и константы

ADC AL,123
; сложение с переносом содержимого
; аккумулятора (AL) и константы

ADC word ptr [123],123
; сложение с переносом непосредственных
; данных с содержимым ячейки памяти

ADC CX,123
; сложение с переносом непосредственных
; данных с содержимым регистра

Команда INC имеет следующий формат в мнемонике ассемблера:
INC dest ,
где операнд dest может иметь любой режим адресации, кроме непосредственной.
Эта команда увеличивает на 1 (инкрементирует) значение своего операнда. Содержимое регистра флагов (кроме флага CF) при выполнении команды INC изменяется аналогично тому, как это было при выполнении команды ADD. Команда INC не изменяет состояние флага переноса.
Команда INC имеет следующие форматы машинных кодов:
инкрементирование 16-разрядного регистра
01000 reg

инкрементирование регистра или ячейки памяти
1111111w
mod 000 r/m
disp_low
disp_high

Примеры использования команды INC:
INC AX
; инкрементирование 16–разрядного
; регистра

INC AH
; инкрементирование 8–разрядного
; регистра

INC byte ptr [BX + DI + 12]
; инкрементирование ячейки памяти

Команда AAA не имеет операндов. Эта команда корректирует содержимое регистра AL, которое рассматривается как результат сложения двух одноразрядных десятичных чисел, представленных ASCII кодами. Команда AAA проверяет младшую тетраду (младшую шестнадцатеричную цифру) в AL. Если значение этой тетрады больше 9 или флаг AF имеет значение 1, то к регистру AL прибавляется 6, а к регистру AH прибавляется 1, флаги AF и CF устанавливаются в 1. Кроме того, во всех случаях AAA записывает 0 в старшую тетраду AL.
Команда AAA имеет следующий формат машинного кода:
00110111

Пример использования команды AAA:
MOV AX,38h
; поместить в AL ASCII код цифры "8" и 0 в AH

MOV BL,34h
; поместить в BL ASCII код цифры "4"

ADD AL,BL
; сложить содержимое AL и BL, результат 6Ch, AF = 1

AAA
; коррекция AL (результат 0102h в AX)

Команда DAA не имеет операндов. Эта команда корректирует содержимое регистра AL, которое рассматривается как результат сложения двух чисел, представленных двоично-десятичными кодами. Если младшая тетрада регистра AL имеет значение большее 9 или флаг AF установлен в 1, то команда DAA прибавляет 6 к содержимому регистра AL и устанавливает флаг AF в 1. Далее, если старшая тетрада регистра AL содержит значение большее, чем 9, или флаг CF установлен в 1, то команда DAA прибавляет 60h к содержимому AL и устанавливает флаг CF в 1. Данная команда изменяет флаги AF, CF, PF, SF и ZF.
Команда DAA имеет следующий формат машинного кода:
00100111

Пример использования команды DAA:
MOV AL,38h
; поместить в AL двоично-десятичный код числа 38

MOV BL,34h
; поместить в BL двоично-десятичный код числа 34

ADD AL,BL
; сложить содержимое AL и BL, результат 6Ch, AF = 1

DAA
; коррекция AL (результат 72h в AL)

Команда SUB имеет следующий формат в мнемонике ассемблера:
SUB dest,src ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.
Эта команда вычитает значение второго операнда из значения первого операнда, результат вычитания помещается в первый операнд. Команда SUB изменяет значения флагов OF, SF, ZF, AF, CF и PF. Флаг дополнительного переноса устанавливается, если при вычитании байт осуществлен заем из 3-го бита. Флаг переноса устанавливается, если при вычитании осуществлен заем из старшего бита.
Команда SUB имеет следующие форматы машинных кодов:
вычитание операнда в памяти или в регистре из операнда в регистре
001010dw
mod reg r/m
disp_low
disp_high

вычитание непосредственного операнда из содержимого аккумулятора
0010110w
data_low
data_high

вычитание непосредственного операнда из операнда в регистре или в памяти
100000sw
mod 101 r/m
disp_low
disp_high
data_low
data_high


Примеры использования команды SUB:
SUB DX,[BX + SI + 123]
; вычитание содержимого ячейки памяти
; из содержимого регистра

SUB [BX + SI + 123],DX
; вычитание содержимого регистра
; из содержимого ячейки памяти

SUB AX,123
; вычитание константы из содержимого
; аккумулятора (AX)

SUB AL,123
; вычитание константы из содержимого
; аккумулятора (AL)

SUB word ptr [123],123
; вычитание непосредственных данных
; из содержимого ячейки памяти

SUB CX,123
; вычитание непосредственных данных
; из содержимого регистра

Команда SBB имеет следующий формат в мнемонике ассемблера:
SBB dest,src ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.
Эта команда вычитает содержимое второго операнда и содержимое флага CF (заем) из содержимого первого операнда, результат вычитания помещается в первый операнд. Содержимое регистра флагов при выполнении команды SBB изменяется аналогично тому, как это было при выполнении команды SUB.
Команда SBB имеет следующие форматы машинных кодов:
вычитание операнда в памяти или в регистре из операнда в регистре
000110dw
mod reg r/m
disp_low
disp_high

вычитание непосредственного операнда из содержимого аккумулятора
0001110w
data_low
data_high

вычитание непосредственного операнда из операнда в регистре или в памяти
100000sw
mod 011 r/m
disp_low
disp_high
data_low
data_high

Примеры использования команды SBB:
SBB DX,[BX + SI + 2]
; вычитание с заемом содержимого
; ячейки памяти из содержимого регистра

SBB [BX + SI + 2],DX
; вычитание с заемом содержимого регистра
; из содержимого ячейки памяти

SBB AX,123
; вычитание с заемом константы из содержимого
; аккумулятора (AX)

SBB AL,123
; вычитание с заемом константы из содержимого
; аккумулятора (AL)

SBB word ptr [123],12
; вычитание с заемом непосредственных данных
; из содержимого ячейки памяти

SBB CX,123
; вычитание с заемом непосредственных данных
; из содержимого регистра

Команда DEC имеет следующий формат в мнемонике ассемблера:
DEC dest ,
где операнд dest может иметь любой режим адресации, кроме непосредственной.
Эта команда уменьшает на 1 (декрементирует) значение своего операнда. Содержимое регистра флагов (кроме флага CF) при выполнении команды DEC изменяется аналогично тому, как это было при выполнении команды SUB. Команда DEC не изменяет состояние флага переноса.
Команда DEC имеет следующие форматы машинных кодов:
декрементирование 16-разрядного регистра
01001 reg

декрементирование регистра или ячейки памяти
1111111w
mod 001 r/m
disp_low
disp_high

Примеры использования команды DEC:
DEC AX
; декрементирование 16-разрядного регистра

DEC AH
; декрементирование 8-разрядного регистра

DEC byte ptr [BX + 2]
; декрементирование ячейки памяти

Команда CMP имеет следующий формат в мнемонике ассемблера:
CMP dest,src ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.
Эта команда предназначена для сравнения своих операндов. Действия, выполняемые командой CMP, во всем аналогичны действиям команды SUB, за тем лишь исключением, что результат вычитания ни куда не помещается, а изменяются только флаги.
Команда CMP имеет следующие форматы машинных кодов:
сравнение операнда в памяти или в регистре и операнда в регистре
001110dw
mod reg r/m
disp_low
disp_high

сравнение непосредственного операнда с содержимым аккумулятора
0011110w
data_low
data_high

сравнение непосредственного операнда с операндом в регистре или в памяти
100000sw
mod 111 r/m
disp_low
disp_high
data_low
data_high

Примеры использования команды CMP:
CMP DX,[BX + SI + 12]
; сравнение содержимого ячейки памяти
; и регистра

CMP [BX + SI + 12],DX
; сравнение содержимого регистра
; и ячейки памяти

CMP AX,123
; сравнение константы и содержимого
; аккумулятора (AX)

CMP AL,123
; сравнение константы и содержимого
; аккумулятора (AL)

CMP word ptr [123],12
; сравнение непосредственных данных
; и содержимого ячейки памяти

CMP CX,123
; сравнение непосредственных данных
; и содержимого регистра

Команда AAS не имеет операндов. Эта команда корректирует содержимое регистра AL, которое рассматривается как результат вычитания двух одноразрядных десятичных чисел, представленных ASCII кодами. Команда AAS проверяет младшую тетраду в AL. Если значение этой тетрады больше 9 или флаг AF имеет значение 1, то из содержимого регистра AL вычитается 6, а из содержимого регистра AH вычитается 1, флаги AF и CF устанавливаются в 1. Кроме того, во всех случаях AAS записывает 0 в старшую тетраду AL.
Команда AAS имеет следующий формат машинного кода:
00111111


Пример использования команды AAS:
MOV AX,34h
; поместить в AL ASCII код цифры "4" и в AH значение 0

SUB AL,38h
; вычесть ASCII код цифры "8" из содержимого AL,
; результат FCh, AF = 1

AAS
; коррекция AL (результат FF06h в AX,
; где 6 – дополнение числа – 4 до 10 )

Команда DAS не имеет операндов. Эта команда корректирует содержимое регистра AL, которое рассматривается как результат вычитания двух чисел, представленных двоично-десятичными кодами. Если младшая тетрада регистра AL имеет значение большее 9 или флаг AF установлен в 1, то команда DAS вычитает 6 из содержимого регистра AL и устанавливает флаг AF в 1. Далее, если старшая тетрада регистра AL содержит значение большее, чем 9, или флаг CF установлен в 1, то команда DAS вычитает 60h из содержимого AL и устанавливает флаг CF в 1. Данная команда изменяет флаги AF, CF, PF, SF и ZF.
Команда DAS имеет следующий формат машинного кода:
00101111

Пример использования команды DAS:
MOV AL,34h
; поместить в AL двоично-десятичный код числа 34

MOV BL,38h
; поместить в BL двоично-десятичный код числа 38

SUB AL,BL
; вычесть содержимое AL и BL, результат (FCh) в AL,
; AF = 1, CF = 1

DAS
; коррекция AL (результат 96h в AL, где
; двоично-десятичное число 96 есть дополнение
; до 10 числа – 4)

Команда MUL имеет следующий формат в мнемонике ассемблера:
MUL src ,
где src – операнд-множитель, имеющий любой режим адресации, кроме непосредственной.
Эта команда умножает беззнаковое множимое (байт или слово) на беззнаковый множитель (байт или слово соответственно). Старший бит мно-жимого и множителя при этом рассматривается как бит данных, а не как знаковый бит. При умножении байт множимое находится в регистре AL, произведение в регистре AX, а при умножении слов – множимое в регистре AX, произведение в паре регистров DX:AX. Команда MUL воздействует на флаги CF и OF (флаги AF, PF, SF, ZF не определены). Флаги CF и OF устанавливаются, если старшая часть произведения (AH или DX в зависимости от вида умножения) не равна 0. В противном случае эти флаги сбрасываются.
Команда MUL имеет следующий формат машинного кода:
1111011w
mod 100 r/m
disp_low
disp_high

Примеры использования команды MUL:
MUL BX
; умножение слов, множитель в регистре

MUL BH
; умножение байт, множитель в регистре

MUL byte ptr [BX + 123]
; умножение байт, множитель в памяти

MUL word ptr [SI + 123]
; умножение слов, множитель в памяти

Команда IMUL имеет следующий формат в мнемонике ассемблера:
IMUL src ,
где src – операнд-множитель, имеющий любой режим адресации, кроме непосредственной.
Эта команда умножает знаковое множимое (байт или слово) на знаковый множитель (байт или слово соответственно). Старший бит множимого и множителя при этом рассматривается как знаковый бит. При умножении байт множимое находится в регистре AL, произведение в регистре AX, а при умножении слов – множимое в регистре AX, произведение в паре регистров DX:AX. Команда IMUL воздействует на флаги CF и OF (флаги AF, PF, SF, ZF не определены). Флаги CF и OF устанавливаются, если младшая часть произведения (AL или AX в зависимости от вида умножения) равна максимальному положительному числу, которое может в ней разместиться (7Fh и 7FFFh соответственно), или старшая часть произведения (AH или DX в зависимости от вида умножения) не равна максимальному беззнаковому числу, которое может в ней разместиться (0FFh и 0FFFFh соответственно). В противном случае эти флаги сбрасываются.
Команда IMUL имеет следующий формат машинного кода:
1111011w
mod 101 r/m
disp_low
disp_high


Примеры использования команды IMUL:
IMUL BX
; знаковое умножение слов, множитель
; в регистре

IMUL BH
; знаковое умножение байт, множитель
; в регистре

IMUL byte ptr [BX + 123]
; знаковое умножение байт, множитель
; в памяти

IMUL word ptr [SI + 12]
; знаковое умножение слов, множитель
; в памяти

Команда AAM не имеет операндов. Эта команда корректирует содержимое регистра AX, которое рассматривается как результат умножения двух одноразрядных десятичных чисел, представленных ASCII кодами. Однако до выполнения умножения в этих числах должны быть обнулены старшие тетрады. Команда AAM делит содержимое регистра AL на 10, частное помещается в AH, а остаток от деления – в AL. Команда AAM изменяет флаги PF, SF и ZF.
Команда AAM имеет следующий формат машинного кода:
11010100
00001010

Пример использования команды AAM:
MOV AL,34h
; поместить в AL ASCII код цифры "4"

MOV BL,38h
; поместить в BL ASCII код цифры "8"

SUB AL,30h
; обнулить старшую тетраду в AL, результат 04h

SUB BL,30h
; обнулить старшую тетраду в BL, результат 08h

MUL BL
; перемножить содержимое AL и BL,
; результат 0020h в AX

AAM
; осуществить коррекцию AX, результат 0302h

Команда DIV имеет следующий формат в мнемонике ассемблера:
DIV src ,
где src – операнд-множитель, имеющий любой режим адресации, кроме непосредственной.
Эта команда делит беззнаковое делимое (слово или двойное слово) на беззнаковый делитель (байт или слово соответственно). Старший бит множимого и множителя при этом рассматривается как бит данных, а не как знаковый бит. При делении на байт делимое находится в регистре AX, частное помещается в AL, а остаток от деления – в AH. При делении на слово делимое находится в паре регистров DX:AX, частное помещается в AX, а остаток от деления в DX. После выполнения команды DIV флаги CF, OF, AF, PF, SF, ZF не определены.
Если частное слишком велико для того, чтобы поместиться в регистре (AL или AX), то при выполнении команды DIV происходит программное прерывание INT 0h. Во избежание этой ситуации рекомендуется перед выполнением деления осуществлять проверку делителя на неравенство нулю. Другое правило, обеспечивающее благоприятные условия для выполнения деления, заключается в следующем: если делитель - байт, то его значение должно быть меньше, чем старший байт (AH) делимого; если делитель – слово, то его значение должно быть меньше, чем старшее слово (DX) делимого.
Команда DIV имеет следующий формат машинного кода:
1111011w
mod 110 r/m
disp_low
disp_high

Примеры использования команды DIV:
DIV BX
; деление на слово, делитель в регистре,
; делимое в DX:AX

DIV BH
; деление на байт, делитель в регистре,
; делимое в AX

DIV byte ptr [BX + SI + 123]
; деление на байт, делитель в памяти,
; делимое в AX

DIV word ptr [BX + SI + 12]
; деление на слово, делитель в памяти,
; делимое в DX:AX

Команда IDIV имеет следующий формат в мнемонике ассемблера:
IDIV src ,
где src – операнд-множитель, имеющий любой режим адресации, кроме непосредственной.
Эта команда во всем аналогична команде DIV, с тем лишь исключением, что ее операнды рассматриваются как числа со знаком. При этом знак остатка всегда совпадает со знаком делимого.
Команда IDIV имеет следующий формат машинного кода:
1111011w
mod 111 r/m
disp_low
disp_high

Примеры использования команды IDIV:
IDIV BX
; знаковое деление на слово,
; делитель в регистре, делимое в DX:AX

IDIV BH
; знаковое деление на байт,
; делитель в регистре, делимое в AX

IDIV byte ptr [BX + SI + 123]
; знаковое деление на байт,
; делитель в памяти, делимое в AX

IDIV word ptr [BX + SI + 12]
; знаковое деление на слово,
; делитель в памяти, делимое в DX:AX

Команда AAD не имеет операндов. Эта команда корректирует содержимое регистра AX, которое рассматривается как делимое перед выполнением деления двухразрядного числа, представленного ASCII кодами своих цифр. Перед выполнением коррекции старшие тетрады AH и AL должны быть обнулены. Команда AAD умножает содержимое регистра AH на 10 и прибавляет полученное число к содержимому AL, при этом AH обнуляется. Команда AAD изменят флаги PF, SF и ZF.
Команда AAD имеет следующий формат машинного кода:
11010101
00001010

Пример использования команды AAD:
MOV AX,3435h
; поместить в AX ASCII коды цифр "4" и "5"

SUB AX,3030h
; обнулить старшие тетрады, результат 0405h

AAD
; коррекция AX, результат 002Dh (45)

MOV BL,03h
; поместить в BL делитель 3

DIV BL
; деление AX на BL, частное 0Fh (15) в AL,
; остаток 0 в AH

Команда NEG имеет следующий формат в мнемонике ассемблера:
NEG dest ,
где операнд dest может иметь любой режим адресации, кроме непосредственной.
Эта команда изменяет знак своего операнда путем построения его дополнительного кода. Команда NEG изменят флаги AF, CF, OF, SF, PF и ZF так же, как команда SUB при вычитании операнда dest из 0.
Команда NEG имеет следующий формат машинного кода:
1111011w
mod 011 r/m
disp_low
disp_high

Примеры использования команды NEG:
NEG AX
; изменение знака содержимого
; 16-разрядного регистра

NEG AH
; изменение знака содержимого
; 8-разрядного регистра

NEG byte ptr [BX + 12]
; изменение знака содержимого ячейки памяти

Команда CBW не имеет операндов. Ее выполнение заключается в том, что байт в AL расширяется до слова в AX расширением знакового бита. При этом значение регистра флагов не изменяется.
Команда CBW имеет следующий формат машинного кода:
10011000

Примеры использования команды CBW:
MOV AL,0Fh
; помещение в AL числа 15

CBW
; преобразование байта в слово, результат 000Fh в AX

MOV BL,3
; помещение числа 03h в BL

IDIV BL
; деление, частное 05h в AL, остаток 0 в AH

Команда CWD не имеет операндов. Ее выполнение заключается в том, что слово в AX расширяется до двойного слова в DX:AX расширением знакового бита. При этом значение регистра флагов не изменяется.
Команда CWD имеет следующий формат машинного кода:
10011001

Примеры использования команды CWD:
MOV AX,0Fh
; помещение в AX числа 15

CWD
; преобразование слова в двойное слово,
; результат 0000:000Fh в DX:AX

MOV BX,3
; помещение числа 0003h в BX

IDIV BX
; деление, частное 0005h в AX, остаток 0 в DX

СОДЕРЖАНИЕ РАБОТЫ
1. Ознакомиться с теоретическим материалом.
2. С помощью программы debug исследовать выполнение всех арифметических команд с любым возможным типом их операндов.
3. В соответствии со своим вариантом решить поставленные задачи и с помощью DEBUG установить правильность их решения.
Задачи к выполнению лабораторной работы
Осуществить умножение слова на байт.
Осуществить сложение трехразрядных чисел, представленных ASCII кодами.
Осуществить сложение трехразрядных чисел, представленных двоично-десятичными кодами.
Осуществить сложение 64-разрядного и 16-разрядного двоичных чисел.
Осуществить вычитание 32-разрядного двоичного числа из 64-разрядного двоичного числа.
Вычислить значение функции Y = 5X – MOD(X,7) + 22.
Вычислить значение функции Y = 3X2 + 9X – 13.
Вычислить значение функции Y = 11X – DIV(X,10) + 11.
Вычислить значение функции Y = 75X – MOD(Z,10)( DIV(Z,10) – 19.
Вычислить значение функции Y = X2 – DIV(X,22) – MOD(X,22).
Варианты заданий
Номер варианта
Номер задачи
Номер варианта
Номер задачи

1
1, 6
14
3, 9

2
1, 7
15
3, 10

3
1, 8
16
4, 6

4
1, 9
17
4, 7

5
1, 10
18
4, 8

6
2, 6
19
4, 9

7
2, 7
20
4, 10

8
2, 8
21
5, 6

9
2, 9
22
5, 7

10
2, 10
23
5, 8

11
3, 6
24
5, 9

12
3, 7
25
5, 10

13
3, 8



Лабораторная работа № 6
команды поразрядной обработки данных
Цель работы: изучить команды поразрядной обработки данных и особенности их применения.
Основные понятия
Команды поразрядной обработки данных можно подразделить на следующие группы:
–  логические команды;
–  команды сдвига;
–  команды циклического сдвига.
В табл. 6.1 приведена мнемоника этих команд и описание выполняемых ими действий.
Таблица 6.1
Мнемоника команд поразрядной обработки данных
Обозначение
Выполняемая функция

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

NOT
Поразрядное отрицание (инвертирование)

AND
Поразрядное логическое умножение (И/конъюнкция)

OR
Поразрядное логическое сложение (ИЛИ/дизъюнкция)

XOR
Поразрядная сумма по модулю 2 (исключающее ИЛИ)

TEST
Поразрядная проверка

Команды сдвига

SHL/SAL
Логический/Арифметический сдвиг влево

SHR
Логический сдвиг вправо

SAR
Арифметический сдвиг вправо

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

ROL
Циклический сдвиг влево

ROR
Циклический сдвиг вправо

RCL
Циклический сдвиг влево с использованием флага переноса

RCR
Циклический сдвиг вправо с использованием флага переноса

Команда NOT имеет следующий формат в мнемонике ассемблера:
NOT dest ,
где dest – операнд, который может иметь любой режим адресации, кроме непосредственной.
Эта команда производит поразрядное отрицание каждого бита своего операнда. Логическая операция "отрицание" (инвертирование) имеет следующую таблицу истинности:
X
not X

0
1

1
0

Результат выполнения команды NOT помещается в ее операнд. При этом не изменяются значения флагов.
Команда NOT имеет следующий формат машинного кода:
1111011w
mod 010 r/m
disp_low
disp_high


Примеры использования команды NOT:
NOT DX
; инвертирование бит 16-разрядного регистра

NOT DH
; инвертирование бит 8-разрядного регистра

NOT word ptr [BX + 12]
; инвертирование бит 16-разрядной ячейки
; памяти

NOT byte ptr [SI]
; инвертирование бит 8-разрядной ячейки
; памяти

Команда AND имеет следующий формат в мнемонике ассемблера:
AND dest,src ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.
Эта команда производит поразрядное логическое умножение своих операндов, результат помещается в первый операнд.
Операция логического умножения (ее еще называют конъюнкцией или операцией "И") имеет следующую таблицу истинности:
X
Y
X and Y

0
0
0

0
1
0

1
0
0

1
1
1

Содержимое регистра флагов при выполнении команды AND изменяется следующим образом: флаги CF и OF сбрасываются, флаги PF, SF и ZF изменяются в зависимости от результата выполнения команды. Флаг AF – не определен.
Команда AND имеет следующие форматы машинных кодов:
логическое умножение операнда в памяти или в регистре с операндом в регистре
000100dw
mod reg r/m
disp_low
disp_high

логическое умножение непосредственного операнда с содержимым аккумулятора
0010010w
data_low
data_high

логическое умножение непосредственного операнда с операндом в регистре или в памяти
1000000w
mod 100 r/m
disp_low
disp_high
data_low
data_high

Примеры использования команды AND:
AND DX,[BX]
; поразрядное логическое умножение
; содержимого ячейки памяти и регистра

AND [BX + SI],DX
; поразрядное логическое умножение
; содержимого регистра и ячейки памяти

AND AX,123
; поразрядное логическое умножение
; содержимого аккумулятора (AX) и константы

AND AL,123
; поразрядное логическое умножение
; содержимого аккумулятора (AL) и константы

AND word ptr [12],123
; поразрядное логическое умножение
; непосредственных данных с содержимым
; ячейки памяти

AND CX,123
; поразрядное логическое умножение
; непосредственных данных с содержимым
; регистра

Команда OR имеет следующий формат в мнемонике ассемблера:
OR dest,src ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.
Эта команда производит поразрядное логическое сложение своих операндов, результат помещается в первый операнд.
Операция логического сложения (ее еще называют дизъюнкцией или операцией "ИЛИ") имеет следующую таблицу истинности:
X
Y
X or Y

0
0
0

0
1
1

1
0
1

1
1
1

Содержимое регистра флагов при выполнении команды OR изменяется следующим образом: флаги CF и OF сбрасываются, флаги PF, SF и ZF изменяются в зависимости от результата выполнения команды, Флаг AF – не определен.
Команда OR имеет следующие форматы машинных кодов:
логическое сложение операнда в памяти или в регистре с операндом в регистре
000010dw
mod reg r/m
disp_low
disp_high

логическое сложение непосредственного операнда с содержимым аккумулятора
0000110w
data_low
data_high

логическое сложение непосредственного операнда с операндом в регистре или в памяти
1000000w
mod 001 r/m
disp_low
disp_high
data_low
data_high

Примеры использования команды OR:
OR DX,[SI]
; поразрядное логическое сложение
; содержимого ячейки памяти и регистра

OR [BX + 12],DX
; поразрядное логическое сложение
; содержимого регистра и ячейки памяти

OR AX,123
; поразрядное логическое сложение содержимого
; аккумулятора (AX) и константы

OR AL,123
; поразрядное логическое сложение содержимого
; аккумулятора (AL) и константы

OR word ptr [12],12
; поразрядное логическое сложение
; непосредственных данных с содержимым
; ячейки памяти

OR CX,123
; поразрядное логическое сложение
; непосредственных данных
; с содержимым регистра

Команда XOR имеет следующий формат в мнемонике ассемблера:
XOR dest,src ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.
Эта команда производит поразрядное логическое сложение по модулю два (исключающее ИЛИ) своих операндов, результат помещается в первый операнд.
Операция сложение по модулю два имеет следующую таблицу истинности:
X
Y
X xor Y

0
0
0

0
1
1

1
0
1

1
1
0

Содержимое регистра флагов при выполнении команды XOR изменяется следующим образом: флаги CF и OF сбрасываются, флаги PF, SF и ZF изменяются в зависимости от результата выполнения команды. Флаг AF – не определен.
Команда XOR имеет следующие форматы машинных кодов:
логическое сложение по модулю два операнда в памяти или в регистре с операндом в регистре
001100dw
mod reg r/m
disp_low
disp_high

логическое сложение по модулю два непосредственного операнда с содержимым аккумулятора
0011010w
data_low
data_high

логическое сложение по модулю два непосредственного операнда с операндом в регистре или в памяти
1000000w
mod 110 r/m
disp_low
disp_high
data_low
data_high

Примеры использования команды XOR:
XOR DX,[BX + 12]
; поразрядное логическое сложение по модулю 2 ; содержимого ячейки памяти и регистра

XOR [BX + 12],DX
; поразрядное логическое сложение по модулю 2 ; содержимого регистра и ячейки памяти

XOR AX,123
; поразрядное логическое сложение по модулю 2 ; аккумулятора (AX) и константы

XOR AL,123
; поразрядное логическое сложение по модулю 2 ; аккумулятора (AL) и константы

XOR word ptr [12],12
; поразрядное логическое сложение по модулю 2 ; непосредственных данных с содержимым ; ячейки памяти

XOR CX,123
; поразрядное логическое сложение по модулю 2 ; непосредственных данных
; с содержимым регистра

Команда TEST имеет следующий формат в мнемонике ассемблера:
TEST dest,src ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.
Эта команда во всем аналогична команде AND, за тем лишь исключением, что результат ни куда не помещается, а только изменяется содержимое регистра флагов. Команда TEST применяется для логического сравнения своих операндов.
Команда TEST имеет следующие форматы машинных кодов:
логическое сравнение операнда в памяти или в регистре с операндом в регистре
1000010w
mod reg r/m
disp_low
disp_high

логическое сравнение непосредственного операнда с содержимым аккумулятора
1010100w
data_low
data_high

логическое сравнение непосредственного операнда с операндом в регистре или в памяти
1111011w
mod 100 r/m
disp_low
disp_high
data_low
data_high

Примеры использования команды TEST:
TEST DX,[BX + 12]
; логическое сравнение
; содержимого ячейки памяти и регистра

TEST [BX + 12],DX
; логическое сравнение
; содержимого регистра и ячейки памяти

TEST AX,123
; логическое сравнение
; содержимого аккумулятора (AX) и константы

TEST AL,123
; логическое сравнение
; содержимого аккумулятора (AL) и константы

TEST word ptr [12],23
; логическое сравнение
; непосредственных данных с содержимым
; ячейки памяти

TEST CX,123
; логическое сравнение
; непосредственных данных с содержимым
; регистра

Команда SHL/SAL имеет следующий формат в мнемонике ассемблера:
SHL dest,count , или
SAL dest,count ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; count – второй операнд, который может быть регистром CL или числовым выражением со значением 1.
Хотя во мнемонике ассемблера данной команде соответствует два обозначения (SHL и SAL), тем не менее это одна и та же команда.
Команда SHL/SAL сдвигает влево содержимое своего первого операнда на число разрядов, указанных во втором операнде. Если вторым операндом является 1, то сдвиг производится на 1 разряд. Если второй операнд – регистр CL, то сдвиг осуществляется на количество разрядов равное содержимому данного регистра.
При сдвиге на 1 разряд старший (знаковый) бит первого операнда помещается во флаг переноса (CF), а остальные разряды сдвигаются влево. В младший бит помещается 0. Если затем CF совпадает со старшим битом результата, то во флаг переполнения (OF) помещается 0, иначе он устанавливается в 1.
Сдвиг на несколько разрядов можно рассматривать как последовательность сдвигов на один разряд, но флаг OF в этом случае не определен.
Помимо изменения флагов OF и CF, данная команда воздействует на флаги PF, SF и ZF, флаг AF – не определен.
Следует отметить, что сдвиг влево на n разрядов эквивалентен умножению операнда на число 2n.
Команда SHL/SAL имеет следующий формат машинного кода:
110100vw
mod 100 r/m
disp_low
disp_high

где поле v определяет тип второго операнда. Если v = 0, то вторым операндом команды является 1, а если v = 1, то вторым операндом является регистр CL.
Примеры использования команды SHL/SAL:
SHL DX,1
; сдвиг содержимого регистра на 1 разряд влево

MOV CL,3
SHL DX, CL
; сдвиг содержимого регистра на 3 разряда влево

SHL byte ptr [12],1
; сдвиг содержимого ячейки памяти на
; 1 разряд влево

Команда SHR имеет следующий формат в мнемонике ассемблера:
SHR dest,count ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; count – второй операнд, который может быть регистром CL или числовым выражением со значением 1.
Эта команда сдвигает вправо содержимое своего первого операнда на число разрядов, указанных во втором операнде. Если вторым операндом является 1, то сдвиг производится на 1 разряд. Если второй операнд – регистр CL, то сдвиг осуществляется на количество разрядов равное содержимому данного регистра.
При сдвиге на 1 разряд младший бит первого операнда помещается во флаг переноса (CF), а остальные разряды сдвигаются вправо. В старший бит помещается 0. Если затем знаковый бит результата совпадает со следующим по порядку битом, то во флаг переполнения (OF) помещается 0, иначе он устанавливается в 1.
Сдвиг на несколько разрядов можно рассматривать как последовательность сдвигов на один разряд, но флаг OF в этом случае всегда помещается ноль.
Помимо изменения флагов OF и CF, данная команда воздействует на флаги PF, SF и ZF, флаг AF – не определен.
Следует отметить, что данный сдвиг вправо на n разрядов эквивалентен беззнаковому делению операнда на число 2n.
Команда SHR имеет следующий формат машинного кода:
110100vw
mod 101 r/m
disp_low
disp_high

где поле v определяет тип второго операнда. Если v = 0, то вторым операндом команды является 1, а если v = 1, то вторым операндом является регистр CL.
Примеры использования команды SHR:
SHR DX,1
; сдвиг содержимого регистра на 1 разряд вправо

MOV CL,3
SHR DX, CL
; сдвиг содержимого регистра на 3 разряда вправо

SHR byte ptr [123],1
; сдвиг содержимого ячейки памяти
; на 1 разряд вправо

Команда SAR имеет следующий формат в мнемонике ассемблера:
SAR dest,count ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; count – второй операнд, который может быть регистром CL или числовым выражением со значением 1.
Эта команда сдвигает вправо содержимое своего первого операнда на число разрядов, указанных во втором операнде. Если вторым операндом является 1, то сдвиг производится на 1 разряд. Если второй операнд –регистр CL, то сдвиг осуществляется на количество разрядов равное содержимому данного регистра.
При сдвиге на 1 разряд младший бит первого операнда помещается во флаг переноса (CF), а остальные разряды сдвигаются вправо, причем старший бит сохраняет свое значение. Если затем знаковый бит результата совпадает со следующим по порядку битом, то во флаг переполнения (OF) помещается 0, иначе он устанавливается в 1.
Сдвиг на несколько разрядов можно рассматривать как последовательность сдвигов на один разряд, но флаг OF в этом случае всегда помещается ноль.
Помимо изменения флагов OF и CF, данная команда воздействует на флаги PF, SF и ZF, флаг AF – не определен.
Следует отметить, что данный сдвиг вправо на n разрядов эквивалентен знаковому делению операнда на число 2n.
Команда SAR имеет следующий формат машинного кода:
110100vw
mod 110 r/m
disp_low
disp_high

где поле v определяет тип второго операнда. Если v = 0, то вторым операндом команды является 1, а если v = 1, то вторым операндом является регистр CL.
Примеры использования команды SAR:
SAR DX,1
; арифметический сдвиг содержимого регистра ; на 1 разряд вправо

MOV CL,3
SAR DX, CL
; арифметический сдвиг содержимого регистра ; на 3 разряда вправо

SAR byte ptr [123],1
; арифметический сдвиг содержимого ячейки ; памяти на 1 разряд вправо

Команда ROL имеет следующий формат в мнемонике ассемблера:
ROL dest,count ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; count – второй операнд, который может быть регистром CL или числовым выражением со значением 1.
Эта команда циклически сдвигает влево содержимое своего первого операнда на число разрядов, указанных во втором операнде. Если вторым операндом является 1, то сдвиг производится на 1 разряд. Если второй операнд – регистр CL, то сдвиг осуществляется на количество разрядов равное содержимому данного регистра.
При сдвиге на 1 разряд старший бит первого операнда помещается во флаг переноса (CF), а остальные разряды сдвигаются влево, затем младший бит принимает значение равное CF. Если старший бит результата не совпадает с новым значением CF, то флаг переполнения (OF) устанавливается в 1, иначе сбрасывается в 0.
Сдвиг на несколько разрядов можно рассматривать как последовательность сдвигов на один разряд, но флаг OF в этом случае не определен.
На остальные флаги команда ROL не воздействует.
Команда ROL имеет следующий формат машинного кода:
110100vw
mod 000 r/m
disp_low
disp_high

где поле v определяет тип второго операнда. Если v = 0, то вторым операндом команды является 1, а если v = 1, то вторым операндом является регистр CL.
Примеры использования команды ROL:
ROL DX,1
; циклический сдвиг содержимого регистра ; на 1 разряд влево

MOV CL,3
ROL DX, CL
; циклический сдвиг содержимого регистра ; на 3 разряда влево

ROL byte ptr [123],1
; циклический сдвиг содержимого ячейки памяти ; на 1 разряд влево


Команда ROR имеет следующий формат в мнемонике ассемблера:
ROR dest,count ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; count – второй операнд, который может быть регистром CL или числовым выражением со значением 1.
Эта команда циклически сдвигает вправо содержимое своего первого операнда на число разрядов, указанных во втором операнде. Если вторым операндом является 1, то сдвиг производится на 1 разряд. Если второй операнд – регистр CL, то сдвиг осуществляется на количество разрядов равное содержимому данного регистра.
При сдвиге на 1 разряд младший бит первого операнда помещается во флаг переноса (CF), а остальные разряды сдвигаются вправо, затем старший бит принимает значение равное CF. Если старший и предшествующий ему биты результата равны между собой, то флаг переполнения (OF) сбрасывается в 0, иначе устанавливается в 1.
Сдвиг на несколько разрядов можно рассматривать как последовательность сдвигов на один разряд, но флаг OF в этом случае не определен.
На остальные флаги команда ROR не воздействует.
Команда ROR имеет следующий формат машинного кода:
110100vw
mod 001 r/m
disp_low
disp_high

где поле v определяет тип второго операнда. Если v = 0, то вторым операндом команды является 1, а если v = 1, то вторым операндом является регистр CL.
Примеры использования команды ROR:
ROR DX,1
; циклический сдвиг содержимого регистра ; на 1 разряд вправо

MOV CL,3
ROR DX, CL
; циклический сдвиг содержимого регистра ; на 3 разряда вправо

ROR byte ptr [123],1
; циклический сдвиг содержимого ячейки памяти ; на 1 разряд вправо

Команда RCL имеет следующий формат в мнемонике ассемблера:
RCL dest,count ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; count – второй операнд, который может быть регистром CL или числовым выражением со значением 1.
Эта команда циклически сдвигает влево содержимое своего первого операнда на число разрядов, указанных во втором операнде, при этом используется значение флага переноса. Если вторым операндом является 1, то сдвиг производится на 1 разряд. Если второй операнд – регистр CL, то сдвиг осуществляется на количество разрядов равное содержимому данного регистра.
При сдвиге на 1 разряд старший бит первого операнда помещается во флаг переноса (CF), остальные разряды сдвигаются влево, а младшим битом становится старое значение CF. Если старший бит результата не совпадает с новым значением CF, то флаг переполнения (OF) устанавливается в 1, иначе сбрасывается в 0.
Сдвиг на несколько разрядов можно рассматривать как последовательность сдвигов на один разряд, но флаг OF в этом случае не определен.
На остальные флаги команда RCL не воздействует.
Команда RCL имеет следующий формат машинного кода:
110100vw
mod 010 r/m
disp_low
disp_high

где поле v определяет тип второго операнда. Если v = 0, то вторым операндом команды является 1, а если v = 1, то вторым операндом является регистр CL.
Примеры использования команды ROL:
RСL DX,1
; циклический сдвиг через CF содержимого ; регистра на 1 разряд влево

MOV CL,3
RCL DX, CL
; циклический сдвиг через CF содержимого ; регистра на 3 разряда влево

RCL byte ptr [123],1
; циклический сдвиг через CF содержимого ячейки ; памяти на 1 разряд влево

Команда RCR имеет следующий формат в мнемонике ассемблера:
RCR dest,count ,
где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; count – второй операнд, который может быть регистром CL или числовым выражением со значением 1.
Эта команда циклически сдвигает вправо содержимое своего первого операнда на число разрядов, указанных во втором операнде, при этом используется значение флага переноса. Если вторым операндом является 1, то сдвиг производится на 1 разряд. Если второй операнд – регистр CL, то сдвиг осуществляется на количество разрядов равное содержимому данного регистра.
При сдвиге на 1 разряд младший бит первого операнда помещается во флаг переноса (CF), а остальные разряды сдвигаются вправо, а старшим битом становится старое значение CF. Если старший и предшествующий ему биты результата равны между собой, то флаг переполнения (OF) сбрасывается в 0, иначе устанавливается в 1.
Сдвиг на несколько разрядов можно рассматривать как последовательность сдвигов на один разряд, но флаг OF в этом случае не определен.
На остальные флаги команда RCR не воздействует.
Команда RCR имеет следующий формат машинного кода:
110100vw
mod 011 r/m
disp_low
disp_high

где поле v определяет тип второго операнда. Если v = 0, то вторым операндом команды является 1, а если v = 1, то вторым операндом является регистр CL.
Примеры использования команды RCR:
RCR DX,1
; циклический сдвиг через CF содержимого регистра ; на 1 разряд вправо

MOV CL,3
RCR DX, CL
; циклический сдвиг через CF содержимого регистра ; на 3 разряда вправо

RCR byte ptr [2],1
; циклический сдвиг через CF содержимого ячейки ; памяти на 1 разряд вправо

СОДЕРЖАНИЕ РАБОТЫ
1. Ознакомиться с теоретическим материалом.
2. С помощью программы debug исследовать выполнение всех арифметических команд с любым возможным типом их операндов.
3. В соответствии со своим вариантом решить поставленные задачи и с помощью DEBUG установить правильность их решения.
Задачи к выполнению лабораторной работы
В слове установить 0, 2 и 5 биты, сбросить 7, 11 и 13 биты, инвертировать 3, 8 и 15 биты. Остальные биты оставить без изменения.
Двухразрядное двоично-десятичное число представить ASCII кодами его цифр.
Двузначное десятичное число, представленное ASCII кодами своих цифр, представить двоично-десятичным кодом.
Используя команды поразрядной обработки данных поместить в регистр AX значение 0F00h (непосредственные операнды не использовать).
Обменять вторую и третью тетрады в слове.
Без использования команды MUL организовать беззнаковое умножение слова на 5.
Без использования команды DIV организовать беззнаковое деление слова на 8.
Используя любые известные команды промоделировать выполнение команды AND dest,scr.
Используя любые известные команды промоделировать выполнение команды OR dest,scr.
Используя любые известные команды промоделировать выполнение команды XOR dest,scr.
Варианты заданий
Номер варианта
Номер задачи
Номер варианта
Номер задачи

1
1, 6
14
3, 9

2
1, 7
15
3, 10

3
1, 8
16
4, 6

4
1, 9
17
4, 7

5
1, 10
18
4, 8

6
2, 6
19
4, 9

7
2, 7
20
4, 10

8
2, 8
21
5, 6

9
2, 9
22
5, 7

10
2, 10
23
5, 8

11
3, 6
24
5, 9

12
3, 7
25
5, 10

13
3, 8



Лабораторная работа № 7
команды передачи управления
Цель работы: изучить команды передачи управления и особенности их применения.
Основные понятия
Команды передачи управления можно подразделить на следующие группы:
– команды безусловной передачи управления;
– команды условного перехода;
– команды управления циклами.
В табл. 7.1 приведена мнемоника этих команд и описание выполняемых ими действий.
Таблица 7.1
Мнемоника команд передачи управления
Обозначение
Выполняемая функция

Команды безусловной передачи управления

CALL
Вызов подпрограммы

RET
Возврат из подпрограммы

INT
Вызов программного прерывания

INTO
Вызов прерывания переполнения

IRET
Возврат из прерывания

JMP
Безусловный переход

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

Jxx
Группа команд условного перехода

JCXZ
Переход по счетчику

Команды управления циклами

LOOP
Цикл с заданным количеством повторений

LOOPE/LOOPZ
Цикл до тех пор, пока не нуль

LOOPNE/LOOPNZ
Цикл до тех пор, пока нуль

Команда CALL осуществляет передачу управления (вызов) подпрограммы и имеет следующий формат в мнемонике ассемблера:
CALL dest,
где dest – операнд, который прямо или косвенно определяет адрес подпрограммы.
Существуют четыре типа команды CALL:
– прямой внутрисегментный вызов;
– прямой межсегментный вызов;
– косвенный внутрисегментный вызов;
– косвенный межсегментный вызов.
При прямом вызове адрес подпрограммы находится непосредственно в коде команды, а при косвенном вызове – в регистре или в памяти. При внутрисегментном вызове используется только одна компонента адреса: смещение подпрограммы относительно начала текущего кодового сегмента, а при межсегментном вызове – обе компоненты адреса, т.е. сегмент, в котором располагается подпрограмма и ее смещение относительно начала этого сегмента.
В зависимости от типа вызова, команда CALL сохраняет в стеке адрес возврата из подпрограммы, т.е. адрес команды, располагаемой сразу же за командой CALL. При внутрисегментном вызове в стеке сохраняется только смещение адреса возврата, а при межсегментном – еще и текущее значение CS. Затем изменяется значение IP и, если вызов межсегментный, то и CS. Команда CALL не изменяет значение регистра флагов.
Команда CALL имеет следующие форматы машинного кода.
1. Прямой внутрисегментный вызов:
11101000
disp_low
disp_high

Поля disp_low и disp_high определяют смещение адреса подпрограммы относительно текущего значения IP.
2. Прямой межсегментный вызов:
10011010
offset_low
offset_high
seg_low
seg_high

Поля seg_low и seg_high определяют сегмент, в котором располагается подпрограмма, а поля offset_low и offset_high – смещение относительно начала этого сегмента.
3. Косвенный внутрисегментный вызов:
11111111
mod 010 r/m
disp_low
disp_high

Поля mod, r/m, disp_low и disp_high определяют 16-разрядный регистр или ячейку памяти, в которой располагается смещение подпрограммы относительно текущего кодового сегмента.
4. Косвенный межсегментный вызов:
11111111
mod 011 r/m
disp_low
disp_high

Поля mod, r/m, disp_low и disp_high определяют 32-разрядную ячейку памяти, в которой располагается сегмент и смещение подпрограммы. Смещение располагается в младших байтах этой ячейки памяти, а смещение – в старших байтах.
Если для передачи управления применяется команда CALL, то для возврата из подпрограммы требуется выполнение команды RET соответствующего типа (внутрисегментной или межсегментной). Формат команды CALL выбирается ассемблером на основании типа ее операнда, а формат RET – по контексту на основании типа подпрограммы, в которой текстуально находится RET.
Примеры использования команды CALL:
CALL 0BD4
; прямой внутрисегментный вызов
; подпрограммы, располагаемой
; по адресу CS:0BD4h

CALL 0234:0BD4
; прямой межсегментный вызов
; подпрограммы, располагаемой
; по адресу 0234:0BD4h

CALL AX
; косвенный внутрисегментный вызов
; подпрограммы, располагаемой
; по адресу CS:AX

CALL word ptr [BX + 12]
; косвенный внутрисегментный вызов

CALL dword ptr [BX + 12]
; косвенный межсегментный вызов

Команда RET осуществляет возврат из подпрограммы в вызвавшую ее программу и имеет следующий формат в мнемонике ассемблера:
RET [data],
где операнд data имеет непосредственную адресацию. Этот операнд необязателен.
Эта команда передает управление по адресу, выбираемому из стека. Допускаются внутрисегментные и межсегментные возвраты, а также возможность прибавления непосредственного значения data к содержимому SP. В случае межсегментного возврата из стека последовательно выбираются значения IP и CS, для внутрисегментного возврата – только IP. Если в команде RET указан операнд (который должен задаваться числовым выражением), то его значение затем прибавляется к содержимому указателя стека. Содержимое регистра флагов при выполнении команды RET не изменяется.
Команда RET имеет следующие форматы машинных кодов:
внутрисегментный возврат
11000011

внутрисегментный возврат с добавлением непосредственного значения к указателю стека
11000010
data_low
data_high

межсегментный возврат
11001011

межсегментный возврат с добавлением непосредственного значения к указателю стека
11001010
data_low
data_high

Как было отмечено выше, ассемблер выбирает тип возврата по контексту, в зависимости от типа подпрограммы, в которой текстуально находится RET. В режиме ассемблирования и дизассемблирования DEBUG для обозначения межсегментных возвратов применяется мнемоника RETF.
Примеры использования команды RET:
RET
; внутрисегментный возврат

RET 2
; внутрисегментный возврат с увеличением SP на 2

RETF
; межсегментный возврат

RETF 2
; межсегментный возврат с увеличением SP на 2

Команда INT вызывает программное прерывание и имеет следующий формат в мнемонике ассемблера:
INT type,
где type – непосредственный операнд со значением от 0 до 255.
Она записывает в стек содержимое регистра флагов, сбрасывает флаги трассировки (TF) и разрешения прерываний (IF), выполняет косвенный межсегментный вызов подпрограммы-обработчика прерывания через один из 256 возможных векторов прерывания. Таким образом, выполнение команды INT эквивалентно последовательному выполнению команд PUSHF, CLI (сбросить флаг IF) и CALL, если не обращать внимание на флаг TF.
Вектор прерывания – это адрес его обработчика, который располагается в так называемой таблице векторов прерываний – специальной области памяти, которая располагается с самого младшего адреса (0000:0000) и имеет размер 1024 байт. Каждый вектор имеет длину четыре байта. В первом слове хранится значение IP, а во втором – CS. Таким образом, в таблице векторов прерываний имеется место для 256 векторов. Вектор для прерывания 0 начинается с ячейки 0000:0000, прерывания 1 – с 0000:0004, 2 – с 0000:0008 и т.д.
Операнд type команды INT определяет номер вектора в таблице векторов прерываний.
Команда INT имеет следующие форматы машинного кода:
1) при type равно 3
11001100

2) при type не равно 3
11001101
type

Пример использования команды INT:
INT 3
; вызов прерывания с номером вектора 3

INT 21
; вызов прерывания с номером вектора 21h

Команда INTO не имеет операндов. Она вызывает обработчик прерывания переполнения. Вектор этого прерывания равен 4. В целом, эта команда аналогична команде INT 4, за тем лишь исключением, что передача управления обработчику осуществляется, если установлен флаг переполнения (OF). В противном случае команда INTO не выполняет ни каких действий.
Команда INTO имеет следующий формат машинного кода:
11001110

Пример использования команды INTO:
INTO
; вызов обработчика прерывания переполнения

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

Пример использования команды IRET:
IRET
; возврат из прерывания

Команда JMP выполняет безусловный переход и имеет следующий формат в мнемонике ассемблера:
JMP dest ,
где dest – операнд, который прямо или косвенно определяет адрес перехода. Существуют четыре типа команды JMP:
– прямой внутрисегментный переход;
– прямой межсегментный переход;
– косвенный внутрисегментный переход;
– косвенный межсегментный переход.
При прямом переходе адрес передачи управления находится непосредственно в коде команды, а при косвенном переходе – в регистре или в памяти. При внутрисегментном переходе используется только одна компонента адреса: смещение команды, к которой осуществляется переход, относительно начала текущего кодового сегмента, а при межсегментном переходе – обе компоненты адреса, т.е. сегмент, в котором располагается команда, к которой осуществляется переход, и ее смещение относительно начала этого сегмента.
Команда JMP не изменяет значение регистра флагов.
Команда JMP имеет следующие форматы машинного кода.
1. Прямой внутрисегментный переход:
11101001
disp_low
disp_high

Поля disp_low и disp_high определяют смещение адреса перехода относительно текущего значения IP.
2. Короткий прямой внутрисегментный переход:
11101011
disp

Поле disp определяет смещение адреса перехода относительно текущего значения IP.
3. Прямой межсегментный переход:
11101010
offset_low
offset_high
seg_low
seg_ high

Поля seg_low и seg_high определяют сегмент, а поля offset_low и offset_high – смещение адреса перехода.
4. Косвенный внутрисегментный переход:
11111111
mod 101 r/m
disp_low
disp_high

Поля mod, r/m, disp_low и disp_high определяют 16-разрядный регистр или ячейку памяти, в которой располагается смещение адреса перехода.
5. Косвенный межсегментный переход:
11111111
mod 100 r/m
disp_low
disp_high

Поля mod, r/m, disp_low и disp_high определяют 32-разрядную ячейку памяти, в которой располагается сегмент и смещение адреса перехода. Смещение располагается в младших байтах этой ячейки памяти, а смещение – в старших байтах.
Примеры использования команды JMP:
JMP 0BD4
; прямой внутрисегментный переход
; к команде, располагаемой по адресу
; CS:0BD4h

JMP short 0BD4
; короткий прямой внутрисегментный
; переход; к команде, располагаемой
; по адресу CS:0BD4h

JMP 0234:0BD4
; прямой межсегментный переход к
; команде, располагаемой по адресу
; 0234:0BD4h

JMP AX
; косвенный внутрисегментный переход к
; команде, располагаемой по адресу CS:AX

JMP word ptr [BX + 123]
; косвенный внутрисегментный переход

JMP dword ptr [BX + 123]
; косвенный межсегментный переход

Команды JXX, входящие в группу команд условного перехода, передают управление по адресу своего операнда, когда выполняется некоторое, определяемое мнемоникой, условие, связанное с состоянием регистра флагов. Эти команды имеют следующий формат в мнемонике ассемблера:
JXX disp ,
где disp – адресное выражение типа метки с атрибутом NEAR, значение которого лежит в интервале от –128 до 127 от адреса следующей за условным переходом команды.
Все команда условного перехода имеют следующий формат машинного кода:
code
disp

Поле code определяет условие перехода, а поле disp – смещение, которое прибавляется к текущему значению IP, если условие истинно. Мнемоника, коды, условия перехода и их смысловые значения для всех команд условного перехода приведены в табл. 7.2.

Таблица 7.2
Команды условного перехода
Мнемо-ника
Поле code
Условие перехода
Смысловое значение

JA/JNBE
01110111
CF = 0 и ZF = 0
Более/Не менее или равно

JAE/JNB
01110011
CF = 0
Более или равно/Не менее

JNA/JBE
01110110
CF = 1 или ZF = 1
Не более/Менее или равно

JB/JNAE
01110010
CF = 1
Менее/Не более или равно

JC
01110010
CF = 1
Перенос

JNC
01110011
CF = 0
Нет переноса

JE/JZ
01110100
ZF = 1
Равно/Нуль

JNE/JNZ
01110101
ZF = 0
Не равно/Не нуль

JG/JNLE
01111111
ZF = 0 и SF = OF
Больше/Не меньше или равно

JGE/JNL
01111101
SF = OF
Больше или равно/Не меньше

JNG/JLE
01111110
ZF = 1 или SF ( OF
Не больше/Меньше или равно

JL/JNGE
01111100
SF ( OF
Меньше/Не больше или равно

JO
01110000
OF = 1
Переполнение

JNO
01110001
OF = 0
Нет переполнения

JP/JPE
01110010
PF = 1
Сумма битов четная

JNP/JPO
01111011
PF = 0
Сумма битов не четная

JS
01111000
SF = 1
Отрицательный результат

JNS
01111001
SF = 0
Положительный результат

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

CMP AX,123
; сравнить содержимое AX с числом 123h


JE M1
; если равно, перейти на метку M1


..


M1:
XOR AX,AX



..



TEST BX,1
; проверить установлен ли младший бит BX


JNZ M2
; перейти на метку M2, если это так


..


M2:
INT 20



Команда JCXZ передает управление по адресу своего операнда, если содержимое регистра CX равно нулю. Она имеет следующий формат в мнемонике ассемблера:
JCXZ disp ,
где disp – адресное выражение типа метки с атрибутом NEAR, значение которого лежит в интервале от –128 до 127 от адреса следующей за JCXZ команды. Эта команда во всем аналогична командам условного перехода.
Формат машинного кода команды JCXZ:
11100011
disp

Пример применения команды JCXZ для организации цикла "пока CX ( 0":

MOV CX,3
; установить счетчик цикла

M1:
JCXZ M2
; если цикл закончился, то выход


DEC CX
; изменить параметр цикла


JMP short M1
; возврат в цикл

M2:
...


Команды управления циклами (LOOP, LOOPE, LOOPZ, LOOPNE, LOOPNZ) имеют следующие форматы в мнемонике ассемблера:
LOOP disp,
LOOPE disp,
LOOPZ disp,
LOOPNE disp,
LOOPNZ disp,
где disp – адресное выражение типа метки с атрибутом NEAR, значение которого лежит в интервале от –128 до 127 от адреса следующей за циклом команды.
Все эти команды декрементируют значение регистра CX. Если после этого значение CX не равно нулю, то LOOP передает управление по адресу своего операнда. Эквивалентные друг другу команды LOOPE и LOOPZ передают управление по адресу своего операнда, если CX не равно нулю и значение флага ZF равно 1. Эквивалентные друг другу команды LOOPNE и LOOPNZ передают управление по адресу своего операнда, если CX не равно нулю и ZF = 0. Эти действия позволяют легко реализовать цикл с заданным количеством повторений, которое задается в CX.
Команды управления циклами имеют следующий формат машинных кодов:
LOOP:  
11100010
disp


LOOPE/LOOPZ:  
11100001
disp


LOOPNE/LOOPNZ:  
11100000
disp

Примеры использования команд управления циклами:
; Пример 1: вычисление суммы элементов массива из 10 байт


XOR AX,AX
; обнуление суммы


XOR SI,SI
; обнуление индекса


MOV CX,0Ah
; загрузка количества элементов

NEXT:

; начало цикла


ADD AL, [SI + 20]
; сложение очередного элемента с
; общей суммой


ADC AH,0
; учет возможного переноса


INC SI
; увеличение индекса


LOOP NEXT
; возврат в цикл,
; если массив не исчерпан

; Пример 2: поиск первого ненулевого элемента в массиве из 10 байт


MOV SI, -1
; установить значение индекса


MOV CX, 0Ah
; установить количество элементов

NEXT:

; начало цикла


INC SI
; увеличить индекс


CMP [SI + 20], 0
; сравнить текущий элемент с нулем


LOOPE NEXT
; возврат в цикл,
; если элемент не найден и массив еще
; не исчерпан


JNE YES
; если элемент найден, то переход
; к метке YES


...
; действия, если элемент не найден


...
; массив содержит только нули


JMP short END
; переход к метке END

YES:
...
; действия, если элемент найден


...
; SI указывает на ненулевой элемент

END:
...
; завершающие действия

; Пример 3: поиск заданного значения в массиве из 10 байт


MOV AL, 5Dh
; загрузить искомое значение


MOV SI, -1
; установить значение индекса


MOV CX, 0Ah
; установить количество элементов

NEXT:

; начало цикла


INC SI
; увеличить индекс


CMP [SI + 20], AL
; сравнить текущий элемент
; с искомым значением


LOOPNE NEXT
; возврат в цикл,
; если элемент не найден
; и массив еще не исчерпан


JCXZ NO
; если элемент не найден, то переход
; к метке NO


...
; действия, если элемент найден.


...
; SI указывает на этот элемент

NO:
JMP short END
; переход к метке END


...
; действия, если элемент не найден

END:
...
; завершающие действия

СОДЕРЖАНИЕ РАБОТЫ
1. Ознакомиться с теоретическим материалом.
2. С помощью программы debug исследовать выполнение всех арифметических команд с любым возможным типом их операндов.
3. В соответствии со своим вариантом решить поставленные задачи и с помощью DEBUG установить правильность их решения.
Задачи к выполнению лабораторной работы
Вычислить значение функции
13 EMBED Equation.2 1415
Вычислить значение функции
13 EMBED Equation.2 1415
Вычислить значение функции
13 EMBED Equation.2 1415
Увеличить содержимое CX на 1, если значение AX равно 0. Увеличить содержимое CX на 10, если значение AX равно 1.В противном случае увеличить содержимое CX на 100.
Вычислить значение функции
13 EMBED Equation.2 1415
Найти сумму максимальных элементов каждой строки матрицы.
Найти произведение минимальных элементов каждого столбца матрицы.
Найти сумму элементов квадратной матрицы, находящихся над ее главной диагональю.
Найти произведение элементов квадратной матрицы, находящихся под ее главной диагональю.
Сложить номер строки, содержащей минимальный элемент матрицы, с номером столбца, содержащим ее максимальный элемент.
Варианты заданий
Номер варианта
Номер задачи
Номер варианта
Номер задачи

1
1, 6
14
3, 9

2
1, 7
15
3, 10

3
1, 8
16
4, 6

4
1, 9
17
4, 7

5
1, 10
18
4, 8

6
2, 6
19
4, 9

7
2, 7
20
4, 10

8
2, 8
21
5, 6

9
2, 9
22
5, 7

10
2, 10
23
5, 8

11
3, 6
24
5, 9

12
3, 7
25
5, 10

13
3, 8




Лабораторная работа № 8
команды обработки строк
Цель работы: изучить специальные цепочечные команды, используемые для обработки строк данных, и особенности их применения.
Основные понятия
Часто возникает необходимость пересылать или сравнивать поля данных, длина которых превышает слово. Например, необходимо сравнить описания или имена для того, чтобы отсортировать их в восходящей последовательности. Элементы такого формата известны как строковые данные и могут являться как символьными, так и числовыми.
Процессор поддерживает ряд команд, ориентированных на обработку строковых данных. В табл. 8.1 приведена мнемоника этих команд и описание выполняемых ими действий.
Таблица 8.1
Мнемоника команд обработки строк
Обозначение
Выполняемая функция

MOVSB/MOVSW
Пересылка строк

LODSB/LODSW
Загрузка из строки

STOSB/STOSW
Запись в строку

CMPSB/CMPSW
Сравнение строк

SCASB/SCASW
Сканирование строки

REP/REPE/REPZ/REPNE/REPNZ
Префиксы повторения

CLD
Сброс флага направления

STD
Установка флага направления

Команды пересылки строк пересылают байт или слово из строки-источника в строку-приемник и имеют следующий формат в мнемонике ассемблера:
MOVSB,
MOVSW.
Вне зависимости от применяемой команды, строка-приемник располагается в дополнительном сегменте данных и адресуется косвенным образом через регистр DI (ES:DI), а строка-источник располагается в сегменте данных и адресуется через регистр SI (DS:SI).
Команда MOVSB пересылает один байт из строки-источника в строку-приемник и изменяет содержимое регистров SI и DI на единицу.
Команда MOVSW пересылает слово из строки-источника в строку-приемник и изменяет содержимое регистров SI и DI на два.
При выполнении команды пересылки строк содержимое индексных регистров может как увеличиваться, так и уменьшаться. На это влияет состояние флага направления (DF). Если DF = 0, то содержимое индексных регистров увеличивается на 1 или на 2, в зависимости от пересылаемых данных. Если DF = 1, то содержимое индексных регистров уменьшается.
Команды пересылки строк имеют следующий формат машинного кода.
1010010w

Если поле w равно 0, то пересылаются байты (команда MOVSB). Если поле w равно 1, то пересылаются слова (команда MOVSW).
Примеры использования команд пересылки строк:
LES DI,[D4]
; загрузить ES:DI адресом строки-приемника

LDS SI,[D8]
; загрузить DS:SI адресом строки-источника

CLD
; сбросить флаг направления
; (увеличение индексных регистров)

MOVSB
; переслать байт из строки-источника в строку-приемник ; (при этом инкрементируются SI и DI)

MOWSW
; переслать слово из строки-источника в приемник ; (при этом содержимое SI и DI увеличится на 2)

Команды загрузки из строки пересылают байт или слово из строки-источника в аккумулятор и имеют следующий формат в мнемонике ассемблера:
LODSB
LODSW
Как и в командах пересылки строк, строка-источник располагается в сегменте данных и адресуется через регистр SI (DS:SI).
Команда LODSB пересылает один байт из строки-источника в регистр AL и инкрементирует SI, если флаг направления сброшен, или декрементирует SI, если флаг направления установлен.
Команда LODSW пересылает слово из строки-источника в регистр AX и увеличивает содержимое регистра SI на два, если DF = 0, или уменьшает содержимое SI на два, если DF = 1.
Команды загрузки аккумулятора из строки имеют следующий формат машинного кода.
1010011w

Если поле w = 0, то загружается байт (команда LODSB). Если поле w = 1, то загружается слово (команда LODSW).
Примеры использования команд загрузки из строки:
LDS SI,[0BD8]
; загрузить DS:SI адресом строки-источника

CLD
; сбросить флаг направления
; (увеличение индексных регистров)

LODSB
; переслать байт из строки-источника в AL
; (при этом инкрементируются SI)

LODSW
; переслать слово из строки-источника в AX
; (при этом содержимое SI увеличится на 2)

Команды записи в строку пересылают байт или слово из аккумулятора в строку-приемник и имеют следующий формат в мнемонике ассемблера:
STOSB
STOSW
Как и в командах пересылки строк, строка-приемник располагается в дополнительном сегменте данных и адресуется через регистр DI (ES:DI).
Команда STOSB пересылает один байт из AL в строку-приемник и инкрементирует DI, если флаг направления сброшен, или декрементирует DI, если флаг направления установлен.
Команда STOSW пересылает слово из AX в строку-приемник и увеличивает содержимое регистра DI на два, если DF = 0, или уменьшает содержимое DI на два, если DF = 1.
Команды записи содержимого аккумулятора в строку имеют следующий формат машинного кода.
1010101w

Если поле w = 0, то записывается байт (команда STOSB). Если поле w = 1, то записывается слово (команда STOSW).
Примеры использования команд записи в строку:
LES DI,[0BD8]
; загрузить ES:DI адресом строки-приемника

CLD
; сбросить флаг направления
; (увеличение индексных регистров)

STOSB
; переслать байт из AL в строку-приемник
; (при этом инкрементируются DI)

STOSW
; переслать слово из AX в строку-приемник
; (при этом содержимое DI увеличится на 2)

Команды сравнения строк сравнивают байты или слова из строки-источника и строки-приемника и имеют следующий формат в мнемонике ассемблера:
CMPSB
CMPSW
Вне зависимости от применяемой команды, строка-приемник располагается в сегменте данных и адресуется через регистр SI (DS:SI), а строка-источник располагается в дополнительном сегменте данных и адресуется косвенным образом через регистр DI (ES:DI).
Команда CMPSB осуществляет сравнение байт из строки-приемника и строки-источника (вычитает байт строки источника из байта строки приемника, результат ни куда не помещает, но изменяет флаги AF, CF, PF, SF и ZF) и инкрементирует индексные регистры, если DF = 0, или декрементирует индексные регистры, если DF = 1.
Команда CMPSW сравнивает слова из строки-источника и строки-приемника (аналогично команде CMPSB) и увеличивает содержимое индексных регистров на два, если DF = 0, или уменьшает содержимое индексных регистров на два, если DF = 1.
Команды сравнения строк имеют следующий формат машинного кода.
1010011w

Если поле w = 0, то сравниваются байты (команда CMPSB). Если поле w = 1, то сравниваются слова (команда CMPSW).
Примеры использования команд сравнения строк:
LES DI,[0BD4]
; загрузить ES:DI адресом
; строки-источника

LDS SI,[0BD8]
; загрузить DS:SI адресом
; строки-приемника

CLD
; сбросить флаг направления
; (увеличение индексных регистров)

CMPSB
; сравнить байты из строки-источника
; и строки-приемника
; (при этом инкрементируются SI и DI)

CMPSW
; сравнить слова из строки-источника
; и строки-приемника (при этом
; содержимое SI и DI увеличится на 2)

Команды сканирования строки сравнивают байт или слово из аккумулятора с байтом или словом из строки-приемника и имеют следующий формат в мнемонике ассемблера:
SCASB
SCASW
Как и в командах пересылки строк, строка-приемник располагается в дополнительном сегменте данных и адресуется через регистр DI (ES:DI).
Команда SCASB сравнивает содержимое AL с байтом из строки-приемника (аналогично команде CMPSB) и инкрементирует DI, если флаг направления сброшен, или декрементирует DI, если флаг направления установлен.
Команда SCASW сравнивает содержимое AX со словом из строки-приемника и увеличивает содержимое регистра DI на два, если DF = 0, или уменьшает содержимое DI на два, если DF = 1.
Команды сканирования строки имеют следующий формат машинного кода.
1010111w

Если поле w = 0, то сравниваются байты (команда SCASB). Если поле w = 1, то сравниваются слова (команда SCASW).
Примеры использования команд сканирования строки:
LES DI,[0BD8]
; загрузить ES:DI адресом строки-приемника

CLD
; сбросить флаг направления
; (увеличение индексных регистров)

SCASB
; сравнить байты из AL и строки-приемника
; (при этом инкрементируются DI)

SCASW
; сравнить слова из AX и строки-приемника
; (при этом содержимое DI увеличится на 2)

Префиксы повторения используются для повторного выполнения следующей за префиксом команды обработки строк и имеют следующие мнемонические обозначения на языке ассемблера:
REP
REPE
REPZ
REPNE
REPNZ
Количество повторений задается предварительно в регистре CX. При каждом повторении команды работы со строками, снабженной одним из этих префиксов, происходит декрементирование регистра CX. Повторение прекращается в зависимости от условия, определяемого смыслом префикса. Условия прекращения повторений приведены в табл. 8.2.
Таблица 8.2
Префиксы повторения
Префикс
Условие прекращения повторений

REP
CX = 0

REPE/REPZ
CX = 0 или ZF = 0

REPNE/REPNZ
CX = 0 или ZF = 1

Префиксы повторения имеют следующий формат машинного кода.
1111001z

Префиксы REP, REPE и REPZ транслируются в машинный формат с z = 1, а префиксы REPNE и REPNZ – в машинный формат с z = 0.
Примеры применения префиксов:
MOV CX,10


REP MOVSB
; переслать 10 байт из строки-источника
; в строку-приемник

REPE CMPSB
; найти первое несовпадение байт строки-источника
; и строки-приемника

REPNE SCASB
; найти первое вхождение содержимого AL в строку

Команда CLD сбрасывает, а команда STD устанавливает флаг направления флаг направления. У этих команд нет операндов и они имеет следующие форматы машинного кода.
CLD: 
11111100
STD: 
11111101

СОДЕРЖАНИЕ РАБОТЫ
1. Ознакомиться с теоретическим материалом.
2. С помощью программы debug исследовать выполнение всех арифметических команд с любым возможным типом их операндов.
3. В соответствии со своим вариантом решить поставленные задачи и с помощью DEBUG установить правильность их решения.
Задачи к выполнению лабораторной работы
Промоделировать выполнение команды REP MOVSW.
Промоделировать выполнение команды REP LODSW.
Промоделировать выполнение команды REP STOSW.
Промоделировать выполнение команды REPE CMPSW.
Промоделировать выполнение команды REPNE SCASW.
Обменять содержимое двух строк.
Установить, входит ли буква "а" в ваше имя.
Определить, совпадают ли годы рождения ваших отца и матери, если эти годы заданы в виде строк символов.
Установить, входит ли буква "е" в вашу фамилию. Если это так, то заменить все буквы фамилии на "е".
Конкатенировать две строки. Результат поместить в третью.
Варианты заданий
Номер варианта
Номер задачи
Номер варианта
Номер задачи

1
1, 6
14
3, 9

2
1, 7
15
3, 10

3
1, 8
16
4, 6

4
1, 9
17
4, 7

5
1, 10
18
4, 8

6
2, 6
19
4, 9

7
2, 7
20
4, 10

8
2, 8
21
5, 6

9
2, 9
22
5, 7

10
2, 10
23
5, 8

11
3, 6
24
5, 9

12
3, 7
25
5, 10

13
3, 8




Приложение
ОПИСАНИЕ КОМАНД программы DEBUG
Команда
Краткое описание
Формат

1
2
3

(A)SSEMBLE
Переводит мнемокод ассемблера в машинный код
a [start]

(C)OMPARE
Производит сравнение двух блоков памяти
c [start1] [end] [start2]
c [start1] L[length] [start2]

(D)UMP
Выводит на экран содержимое участка памяти
d
d [start]
d [start] [end]
d [start] [list]

(E)NTER
Вводит в память машины список чисел и/или символьных переменных.
Выводит на экран содержимое участка памяти, при необходимости, коppектиpует его
e [start] [list]


e [start]

(F)ILL
Заполняет блок памяти последовательностью чисел и/или символьных переменных
f [start] [end] [list]
f [start] L[length] [list]

(G)O
Запускает выполнение программы
g
g =[start]
g [breakpoint(s)]
g =[start] [breakpoint(s)]

(H)EXADECIMAL
Производит сложение и вычитание двух шестнадцатеричных чисел

h [number1] [number2]

(I)NPUT
Считывает и выводит на экран байт из коммуникационного порта
i [port]

(L)OAD
Производит загрузку файла в память машины.
Производит загрузку сектора(ов) диска в память машины
L
L [start]
L [drive] [sector] [number]
L [start] [drive] [sector] [number]




Продолжение прил.
1
2
3

(L)OAD
Производит загрузку файла в память машины.
Производит загрузку сектора(ов) диска в память машины
L
L [start]
L [drive] [sector] [number]
L [start] [drive] [sector] [number]

(M)OVE
Переносит блок данных из одного места памяти в другое
m [start1] [end] [start2]
m [start1] L[length] [start2]

(N)AME
Идентифицирует файл (присваивает ему имя).
Идентифицирует параметр.
Идентифицирует два параметра
n [filespec]

n [param]
n [param1] [param2]

(O)UTPUT
Пересылает байт на коммуникационный порт
o [port] [byte]

(Q)UIT
Осуществляет выход из отладчика
q

(R)EGISTER
Выводит на экран регистры и флаги состояния.
Выводит на экран и коppектиpует значение регистра(ов).
Выводит на экран и коppектиpует флаги состояния
r

r [register name]

rf

(T)RACE
Выполняет одну команду программы под управлением DEBUG.
Выполняет несколько команд программы под управлением DEBUG
t
t =[start]

t [number]
t =[start] [number]

(U)NASSEMBLER
Переводит машинный код в мнемокод ассемблера
u
u =[start] [end]
u [start] L[length]

(W)RITE
Пpоизводит запись файла на диск.
Производит запись в сектора диска
w
w[start]
w[drive][sector][number]
w[start][drive][sector] [number]

ЗАМЕЧАНИЕ. Параметры в квадратных скобках задаются пользователем. Эти параметры являются необязательными.
Библиографический список
Цилькер Б.Я. Организация ЭВМ и систем: учебник для вузов / Б.Я. Циклер. – СПб.: Питер, 2004. – 668 с.
Юров В.И. Ассемблер: учебник для вузов / В.И. Юров. – СПб.: Питер, 2004. – 673 с.
Юров В.И. Ассемблер: практикум / В.И. Юров. – СПб.: Питер, 2004. – 399 с.









13PAGE 15


13PAGE 141815




 "NPVX\b€Љ
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·Root EntryЎ: 15т4 Основной текстTimes New Roman
Центральный процессор

Устройство управления

Блок микрокоманд

Регистровая память

Арифметико-логическое
устройство

Кеш-память 1-го уровня



Оперативная
память

Шина
адреса

Шина
данных

Шина
управления


Видео


Аудио


НЖМД


НГМД


Принтер


Модем




Приложенные файлы

  • doc 15811328
    Размер файла: 2 MB Загрузок: 1

Добавить комментарий